文章总结: 本文详细介绍了Java反序列化漏洞的原理、类型和实例,包括Java原生序列化和Fastjson等JSON库的安全问题。文章分析了常见漏洞案例如ApacheCommonsCollections、SpringFramework和WebLogic等,并提供了Yakit、ysoserial等工具及JavaSec、Hello-Java-Sec等靶场供实践。建议开发者严格验证反序列化输入,禁用不必要的AutoType功能,使用安全配置,并定期进行代码审计和渗透测试以防范此类漏洞。
综合评分: 82
文章分类: 漏洞分析,代码审计,WEB安全,应用安全
PHP、Java、JavaScrip、python反序列化漏洞大盘点–Java漏洞分析
原创
OneDay一卒的老付
老付话安全
2025年8月6日 20:13
山东
点击蓝字
关注我们
始于理论,源于实践,终于实战
老付话安全,每天一点点
激情永无限,进步看得见
严正声明
本号所写文章方法和工具只用于学习和交流,严禁使用文章所述内容中的方法未经许可的情况下对生产系统进行方法验证实施,发生一切问题由相关个人承担法律责任,其与本号无关。
特此声明!!!
02
Java反序列化漏洞
- Java序列化就是指把Java对象转换为字节序列的过程;
- Java反序列化就是指把字节序列恢复为Java对象的过程。
- 只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。
JAVA常见的序列化和反序列化的方法有JAVA 原生序列化和JSON 类(fastjson、jackson)序列化等。两种方式做的事情都是一样的,为什么要区分开来?因为这两种方式的漏洞利用有所不同,fastjson、jackson等反序列化可以用一些现成的EXP、POC去测试,而java原生类反序列化会用专门工具(ysoserial)去生成payload去测试。所以后面会分开详细分析。
序列化的 Java 对象以相同的字节开头,十六进制编码为 ac, Base64 编码为 rO0。
Java使用二进制序列化格式,任何实现了 java.io.Serializable 接口的类都可以被序列化和反序列化。当有源代码访问权限时,请审核使用 readObject() 方法的任何代码,该方法用于从 InputStream 读取和反序列化数据。
Java数据的传递
- 在数据传输(也可称为网络传输)前,先通过序列化工具类将Java对象序列化为json/xml文件。
- 在数据传输(也可称为网络传输)后,再将json/xml文件反序列化为对应语言的对象
JDK(Java 开发工具包)中序列化和反序列化的API
-
java.io.ObjectInputStream:对象输入流。
-
该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
-
java.io.ObjectOutputStream:对象输出流。
-
该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。
Java序列化和反序列化的三种实现:(以student类为例)
①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。
- ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。
- ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。(在 Java 中,transient 是一个修饰符,用于标记 不需要被序列化 的实例变量。当对象被序列化(比如用 ObjectOutputStream 保存到文件或网络传输)时,transient 变量会被 跳过,不会存储到字节流中。它用于保护敏感信息,比如用户的密码、密钥等字段,不应该被持久化或传输,可以用 transient 避免泄露。)
②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。
- ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。
- ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。
③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。
- ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。
- ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。
原生序列化类安全问题:
攻击者可以构造恶意序列化数据,在反序列化时执行任意代码。Java 反序列化机制会自动调用对象的 readObject() 方法,• 某些类(如 InvokerTransformer、TemplatesImpl)在反序列化时会执行危险操作, 攻击者可以构造恶意对象链(Gadget Chain)实现RCE
此类安全问题的经典漏洞有:
- Apache Commons Collections 3/4 反序列化漏洞
Apache Commons Collections 是一个开源的 Java 库,提供了许多集合操作和转换的工具类。 v攻击者可以构造一个恶意的序列化对象,其中包含了特定的类和配置,这些配置在被反序列化时可以触发代码执行。例如,攻击者可以利用 ChainedTransformer InvokerTransformer和 InstantiateTransformer 类来创建一个执行恶意代码的链。
• Spring Framework 反序列化漏洞
ObjectInputStream 反序列化不可信数据时未校验类,攻击者利用 SpringTemplatesImpl 触发动态类加载。攻击者通过 HTTP 请求发送恶意序列化数据(如 Cookie、RPC 参数)。反序列化时触发 TemplatesImpl 或 GroovyShell 执行任意代码。
• JBoss反序列化漏洞
攻击者向 /invoker/JMXInvokerServlet 发送恶意序列化数据。利用 org.jboss.invocation.MarshalledValue 触发 RCE。
- WebLogic 等中间件的反序列化漏洞
Weblogic 在处理特定请求时,会执行反序列化操作来解析接收到的数据。当攻击者能够控制反序列化的数据源,并精心构造恶意的序列化数据时,就会引发严重的安全问题。攻击者通过构造特殊的序列化数据,使 Weblogic 在反序列化过程中加载并执行恶意类,从而突破系统的安全防线,获取服务器的控制权。
攻击者发送恶意 XML 数据到 /wls-wsat/CoordinatorPortType 端点。利用 com.tangosol.util.extractor.ReflectionExtractor 触发方法调用。
原生类的序列化漏洞可以通过工具去发现,这里推荐几款工具和靶场,大家可以自行使用并实验,加深理解和记忆。
利用工具:
- Yakit
https://yaklang.com/ //集成了ysoserial工具,图形化生成,推荐使用
- ysoserial 序列化载荷生成器
https://github.com/frohoff/ysoserial //命令生成工具,不推荐使用
- SerializedPayloadGenerator
https://github.com/NotSoSecure/SerializedPayloadGenerator //集成了ysoserial工具,网页图形化,推荐使用
靶场:
-
JavaSec搭建
项目下载地址:
https://github.com/bewhale/JavaSec
-
Hello-Java-Sec搭建
项目下载地址:https://github.com/j3ers3/Hello-Java-Sec
AlibabaFastjson反序列化漏洞
Fastjson是阿里巴巴的开源一个JSON解析库,通常被用于将Java Bean和JSON 字符串之间进行转换。
fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。攻击者通过构造特定的恶意 JSON 数据来执行远程代码执行(RCE)攻击。反序列化漏洞通常涉及攻击者构造一个精心设计的 JSON 对象,该对象可以被 Fastjson 库反序列化为恶意代码的执行。
例如,如果一个类中包含可以被 Fastjson 自动识别并执行的字段(如私有字段、setter 方法等),攻击者可以通过这些字段注入并执行恶意代码。
案例
AutoType 特性:Fastjson 的 AutoType 功能允许用户定义一个白名单,指定哪些类可以被自动反序列化。如果没有正确配置或验证白名单,攻击者可以构造特殊的 JSON 数据来触发漏洞。
黑名单绕过:在某些情况下,即使使用了黑名单功能,攻击者也可能通过特定的技术(如使用代理类、绕过某些检查机制等)来绕过黑名单的限制。
Fastjson接口简单易用,广泛使用在缓存序列化、协议交互、Web输出、Android客户端提供两个主要接口toJsonString和parseObject来分别实现序列化和反序列化。
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
FastJson中的 parse 和 parseObject方法都可以用来将JSON字符串反序列化成Java对象,parseObject 本质上也是调用 parse 进行反序列化的。但是 parseObject 会额外的将Java对象转为 JSONObject对象,JSON.toJSON。所以进行反序列化时的细节区别在于,parse 会识别并调用目标类的 setter 方法及某些特定条件的 getter 方法,而 parseObject 由于多执行了 JSON.toJSON(obj),所以在处理过程中会调用反序列化目标类的所有 setter 和 getter 方法。
漏洞成因
(1) 动态类型解析
Fastjson 允许通过 @type 指定任意类名,这使得攻击者可以指定恶意类(如包含恶意代码的类)进行反序列化。
通常攻击者自启一个 RMI 服务,配合反序列化漏洞加载恶意对象从而实现代码执行。
(2) 自动调用方法
在反序列化过程中,Fastjson 会通过反射机制自动调用目标类的构造函数、setter 方法或其他方法。如果这些方法中存在可以被利用的逻辑(如执行命令、文件操作等),就可能引发安全问题。
(3) 信任用户输入
Fastjson 默认信任用户输入的 JSON 数据,未对类名、属性值等进行严格的校验和限制。这种信任模型使得攻击者能够通过构造恶意 JSON 数据来触发漏洞。
END
枯燥乏味的知识点,学起来有点费劲。
但不积跬步无以至千里。
日拱一卒,每天一点点的进步。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:老付话安全 OneDay一卒的老付《PHP、Java、JavaScrip、python反序列化漏洞大盘点–Java漏洞分析》