Z1d10tのBlog

A note for myself,have fun!

  1. 1. 碎碎念:
  2. 2. 解题:

[红明谷CTF 2021]write_shell

碎碎念:

这道题目还是蛮简单的,考了php短标签和空格绕过,还有一个双问号表达式

解题:

放出源码

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);
}
?>

首先就是通过你的sandbox+md5(ip)创建一个沙盒路径 老套路了

然后这里有两个问号??先来看看

这种是比较运算符中的NULL 合并操作符,从PHP7开始提供,作用是:从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL

就是如果c= a??b 如果a为0 则c=b 如果a不为0 则c=a

img

img

然后就是有两个模式 一个pwd就是返回路径的 upload模式让我提交shell的但是提交前会通过一个筛选

过滤了"/'| |_|php|;|~|\\^|\\+|eval|{|}/i" php eval {} 空格都被禁了

如果直接构造?data=ls%09/

img

则只会显示 不会执行 那么我们需要构造php代码去执行我们的linux命令 这也印证了前面为什么要禁php字样了

img

但是php字样被禁 所以要用短标签了 下面二选一

1
2
<?echo%09`ls%09/`?>
<?=`ls%09/`?>

这里绕过空格 不能用$IFS$9 估计是因为php会把这个$当作变量来解析吧 用%09绕过就行

img

然后cat读出来就行了

本文最后更新于 天前,文中所描述的信息可能已发生改变