preg_replace绕过以及sha1()函数绕过以及json编码
打开页面,有源码
1 | <?php |
通过对源码的审计,我们知道只要我们通过三个if,我们就可以读取flag
1 | if(preg_match('/pass_the_level_1#/',$aaa)) |
对于第一个if,我们可以看见
1 | $aaa=preg_replace('/^(.*)level(.*)$/','${1}<!-- filtered -->${2}',$_GET['aaa']); |
我们需要绕过preg_replace()函数,而由于
1 | /^$/ |
是单行的检测替换,所以我们可以通过换行符来绕过,因此构造payload
1 | ?aaa=%0apass_the_level_1%23 |
既可通过第一个if,而对于第二个if,是sha1()的加密,它在低版本的php中有一个漏洞,就是当对数组进行加密时,由于sha1()无法处理数组类型,所以会报错且会返回false,从而绕过第二个if,因此构造payload
1 | ?admin[]=&root_pwd[]=123 |
对于第三个if,它首先会进行json解码
1 | $level_3=json_decode($_POST['level_3']); |
而第三个if是
1 | if($level_3->result==$result) |
所以我们需要输入json编码
1 | {"result":0} |
即可绕过第三个if,而原因好像是当我们这样构造时,输入进去的是int类型,而在比较时会转换为相同的数据类型,所以才会通过第三个if