|
不安全的反序列化攻击——深入对象注入 摘要:不安全的反序列化(Insecure Deserialization)漏洞允许攻击者将恶意序列化数据提交给应用程序,触发任意代码执行、权限提升或拒绝服务。Java、PHP、Python、Ruby等语言均面临此威胁。本文详述反序列化的攻击面,展示利用已知gadget链(如Apache Commons Collections、PHP的__wakeup)构造payload的方法,并提出签名、类型白名单等防御策略。 关键词:黑客网站攻击;反序列化漏洞;对象注入;渗透测试;gadget链;RCE;防御措施 一、引言反序列化漏洞常被称为“隐形杀手”,因为其危害巨大但往往在代码审计中才被发现。2017年Equifax数据泄露事件中,攻击者利用Apache Struts2框架的反序列化漏洞(CVE-2017-5638)窃取了1.47亿用户数据。学习反序列化防御对现代Web应用至关重要。 二、漏洞原理2.1 序列化与反序列化序列化将内存对象转换为字节流(存储或传输),反序列化则反向恢复对象。如果攻击者能控制反序列化的数据,就可以控制恢复出来的对象属性及行为。 2.2 POP链(面向属性编程)某些类在反序列化过程中会执行特定魔术方法(如__wakeup、__destruct、readObject),攻击者通过链式调用这些方法最终执行危险操作。 三、渗透测试视角识别序列化数据特征:Java的ac ed 00 05(Base64: rO0AB)、PHP的O:8:"stdClass":。 使用ysoserial(Java)、PHPGGC、pyty等工具生成特定gadget链payload。 提交payload并观察是否触发DNSlog或命令执行。
四、防御措施不要反序列化不可信数据:对所有用户输入类数据使用JSON/XML等安全格式。 签名与加密:如用于Cookie/Token,使用HMAC或加密确保完整性。 类型白名单:Java可通过ObjectInputFilter限制允许反序列化的类;PHP需禁用unserialize回调或使用allowed_classes。 升级依赖库:及时修复已知gadget链的库版本。
五、总结反序列化漏洞难以被传统扫描器发现,需结合代码审计与运行时保护。最简单的安全实践是:避免使用原生序列化。
|