*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
前言
Java反序列化漏洞可以说是Java安全的一块心病,近年来更是在安全界“出尽风头”。其实说到Java反序列化的问题,早在2015年年初的在AppSecCali大会上,两名安全研究人员Chris Frohoff 和 Gabriel Lawrence发表了一篇题为《Marshalling Pickles》的报告,就详细描述了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,甚至还提供了相应的Payload生成工具ysoserial。
通过对象序列化,开发人员可将内存中对象转换为二进制和文本数据格式进行存储或传输。但是,从不受信任的数据反序列化对象可能会导致攻击者实现远程代码执行。
本文我将以WebGoat 8中的反序列化挑战(部署在Docker上)为例,向大家展示完成该挑战并进一步获取目标反向shell的完整过程。
漏洞发现
正如挑战中所提到的,易受攻击的页面从用户输入中获取Base64格式的序列化Java对象,并不加过滤的对其进行反序列化操作。我们将通过提供一个序列化对象来利用这个漏洞,该对象将触发面向属性的编程链(POP链)以在反序列化期间实现远程命令执行。
启动Burp并安装一个名为Java-Deserialization-Scanner的插件。该插件主要包括2个功能