PHP反序列化--pop链

目录

一、了解pop链

1、pop链:

2、pop链触发规则:

(1)通过普通函数触发:

(2)通过魔术方法触发:

3、pop链魔术方法例题:


一、了解pop链

1、pop链:

pop链,全称"Property Overwrite Protection",是一种通过反序列化来构造的攻击载荷。

2、pop链触发规则:

(1)通过普通函数触发:

打开靶场,观察源代码:

php 复制代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class index {
    private $test;
    public function __construct(){
        $this->test = new normal();
    }
    public function __destruct(){
        $this->test->action();
    }
}
class normal {
    public function action(){
        echo "please attack me";
    }
}
class evil {
    var $test2;
    public function action(){
        eval($this->test2);
    }
}
unserialize($_GET['test']);
?> 

观察到eval()函数,说明我们需要利用eval()函数来拿到用户信息,eval()函数是通过 函数action() 来调用的,所以我们去上面找谁能够调用action函数,我们发现 类index中的_destruct()函数能够调用eval()函数,但是调用的是类normal中的action函数,我们只需要构造序列化字符串让_destruct()函数中的test属性调用类evil中的action()函数即可。并将我们的恶意代码赋值给$test2,上传给'test'就可以打到目的。

注意序列化字符串中,由于$test为私有属性,所以要将indextest改写为 %00index%00test。

赋值给'test'并上传:

用户id信息成功显示。

(2)通过魔术方法触发:

打开靶场,观察源代码:

php 复制代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class fast {
    public $source;
    public function __wakeup(){
        echo "wakeup is here!!";
        echo  $this->source;
    }
}
class sec {
    var $benben;
    public function __tostring(){
        echo "tostring is here!!";
    }
}
$b = $_GET['benben'];
unserialize($b);
?> 

目标:同时触发_wakeup()和_toString()两个函数:

_wakeup()在反序列化时自动调用。_toString()在将对象作为字符串时自动调用。

'benben'进行赋值后_wakeup()函数一定会被触发。

对于_toString()函数,我们只需要构造payload,将类sec的实例化对象赋值给类fast的实例化对象,这样就可以触发_toString方法。

构造payload:

将payload赋值给'benben',页面结果如下:


3、pop链魔术方法例题:

php 复制代码
<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {
    private $var;
    public function append($value)
    {
        include($value);
        echo $flag;
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        echo $this->source;
    }
}

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
?> 

第一步:根据 flag is in flag.php,应将value赋值为 flag.php** **第二步:触发_invoke()函数来调用append()函数,_invoke函数的触发条件是将对象当作函数来进行使用。** **第三步:将类Test中的属性p赋值为类Modifier的实例化对象并将其赋值给function,凭借return function()来调用_invoke()函数。
第四步:触发_get()函数,_get()函数的调用方法是调用一个类中没有的属性,将类Show中的str赋值为类Test的实例化对象,Test的实例化对象中不存在属性source,这样调用类中不存在的属性,就可以_get()函数。
第五步:触发_toString()函数,将类Show的实例化对象show赋值给$source,利用反序列化时调用_wakeup()函数的机会,来触发_toString()函数。

我们通过以上分析来尝试构造payload:

注意:类Modifier中的$var属性为私有属性,我们应该在 Modifier的两边加上 %00 再将其填写到url中去。

可以看到 flag 成功回显。

相关推荐
eggrall16 小时前
Socket编程UDP
网络协议·udp·php
牛马也想出海1 天前
亚马逊爬虫代理IP:IP类型选择与配置指南
开发语言·php
梦梦代码精1 天前
基于UniApp+Vue3+ThinkPHP 8,这套知识付费系统的架构设计有点东西
java·低代码·docker·uni-app·开源·php
lxw18449125141 天前
PHP5、PHP7、PHP8 版本核心区别与特性
人工智能·php
AI直播技术杂谈1 天前
直播画面突然模糊了,排查了三个小时
开发语言·php
heimeiyingwang1 天前
【架构实战】可观测性三支柱实战:Metrics、Logging、Tracing 如何统一落地
开发语言·架构·php
CRMEB2 天前
商城大促活动策划全流程:从定目标到复盘四阶段
java·开发语言·人工智能·ai·开源·php
新鲜势力呀2 天前
ESP8266 物联网实战:PHP 后端 + Web 服务器实现 LED 远程控制(超详细入门教程)
前端·物联网·php
xixiaoyunya2 天前
从零搭建跨域互联网络:个人与小团队的轻量组网方案技术解析
开发语言·智能路由器·php
吴声子夜歌2 天前
网络安全——网络渗透测试(网络扫描)
网络·web安全·php