Bugku,never never never give up
题目链接:http://123.206.87.240:8006/test/hello.php
进入页面,界面啥也没有,让后打开源码看看,发现这一行的注释
所以就访问http://123.206.87.240:8006/test/1p.html,然后变成。。。。
很明显的,页面经过了跳转,location重定向到www.bugku.com。于是通过bp抓包,得到响应
经过加密处理的js函数,去掉前面的重定向,我们在控制台跑一下
得到了base64加密的一串字符串,两次解密,一次base64,一次url
得到js函数
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
这时候直接访问:http://123.206.87.240:8006/test/f4l2a3g.txt 可以得到flag。我们还是深究一下
- 第 1 行:限制 URL 查询字符串中必须有非空非零变量
id
- 第 9 行:限制变量
$a
中不能含有字符.
- 第 15 行:要满足以下 5 条表达式才会爆 flag:
- 变量
$data
弱等于字符串bugku is a nice plateform!
- 变量
$id
弱等于整型数 0 - 变量
$b
的长度大于 5 - 字符串
1114
要与字符串111
连接变量$b
的第一个字符构成的正则表达式匹配 - 变量
$b
的第一个字符弱不等于整型数 4
- 变量
1.弱比较
$id=“0xd” 0开头的字符串和整型比较会转化为0
2.PHP伪协议
源码中变量 $data
是由 file_get_contents()
函数读取变量 $a
的值而得,所以 $a
的值必须为数据流。在服务器中自定义一个内容为 bugku is a nice plateform!
文件,再把此文件路径赋值给 $a
,显然不太现实。因此这里用伪协议 php:// 来访问输入输出的数据流,其中 php://input
可以访问原始请求数据中的只读流。这里令 $a = "php://input"
,并在请求主体中使用POST提交字符串 bugku is a nice plateform!
3.eregi() 截断漏洞
ereg()
函数或 eregi()
函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。
源码中待匹配字符串(第二个参数)已确定为 "1114"
,正则表达式(第一个参数)由 "111"
连接 $b
的第一个字符组成,若令 substr($b,0,1) = "\x00"
,即满足 "1114"
与 "111"
匹配。因此,这里假设 $b = "\x0012345"
,才能满足以上三个条件。