favorite_number
打开链接得到源码
<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}
这里要传入一个数组,并且要和
a
r
r
a
y
=
[
′
a
d
m
i
n
′
,
′
u
s
e
r
′
]
相
同
,
但
是
又
要
满
足
array = ['admin', 'user']相同,但是又要满足
array=[′admin′,′user′]相同,但是又要满足stuff[0] != ‘admin’,这里需要用到php的一个数组溢出漏洞
也就是说数组中键值为0的元素与键值为4294967296 //0x100000000 的元素是同一个
所以构造payload
stuff[4294967296]=admin&stuff[1]=user&num=111
发现可以绕过
然后就是要绕过对num的检测,从而可以执行命令这里用%0a
最后需要绕过黑名单执行命令,读取flag
由于过滤了flag,?,*等字符,这里用inode索引节点,先找到flag的inode
然后用tac读取得到flag