PHP反序列化--_wakeup绕过-二、靶场复现:

时间:2024-03-19 11:52:58

进入靶场,分析源代码:

<?php
error_reporting(0);
class secret{
    var $file='index.php';

    public function __construct($file){
        $this->file=$file;
    }

    function __destruct(){
        include_once($this->file);
        echo $flag;
    }

    function __wakeup(){
        $this->file='index.php';
    }
}
$cmd=$_GET['cmd'];
if (!isset($cmd)){
    highlight_file(__FILE__);
}
else{
    if (preg_match('/[oc]:\d+:/i',$cmd)){
        echo "Are you daydreaming?";
    }
    else{
        unserialize($cmd);
    }
}
//sercet in flag.php
?>

分析代码可知,我们只需要将 $file 赋值为 flag.php 并且将 _wakeup()函数绕过即可。

构造payload:

并且将 "serect" 后的 1 改为 2,来绕过 _wakeup()函数。

根据正则表达式,题目不允许 O 的后面有数字,我们只能将 O:6 改为 O:%2B6,其中%2B是加号(+) 的url编码。

将最终的 payload 提交: