打开题目,看到一些php的代码,我们来审计一下
第一个if
($stuff === $array && $stuff[0] != 'admin') //强等于,并且首元素不等于admin
(preg_match("/^\d+$/im",$num) //必须是纯数字,并且前面的/是开启了多行匹配,加上^和$,匹配开头和结尾,合起来就是匹配每行的开头和结尾
(!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)) //过滤了很多的字符串,相当于一个黑名单
我们只要绕过这三个if,就可以执行system(),
看到了这里有个php的版本号,顺便百度了下这个php版本的漏洞,有一个整数溢出漏洞,这里就不给大家放链接了,大家自己动手找吧
漏洞就是说数组中[]里0的元素与4294967296的元素是一样的,所以可以进行绕过第一个if,第二个if我们用到%0a进行换行,这样就只能匹配到第一行,从而绕过,
可以看到成功返回数值了,我们进行抓包修改数据
成功执行,我们进行查看flag
这里被第三个if拦截掉了,我们用反引号进行绕过
拿到flag。
本人菜鸟一枚,参考了下大佬的思路。