Log4j2 CVE-2021-44288 代码审计(底层调用链分析)

1、搭建本地环境

2、编写Demo

3、开启debug跟踪方法

3.1 跟进 error 方法 

3.2 跟进 logIfEnabled 方法

3.3 跟进 logMessage 方法

3.4 跟进 logMessageSafely 方法

3.5 跟进 logMessageTrackRecursion 方法

3.6 跟进 tryLogMessage 方法

3.7 跟进 log 方法

3.8 跟进 log 方法

3.9 跟进 log 方法

3.9 跟进 processLogEvent 方法

3.10 跟进 callAppenders 方法

3.11 跟进

3.12 跟进 callAppenderPreventRecursion 方法

3.13 跟进 callAppender0 方法

3.14 跟进 tryCallAppender 方法

3.15 跟进 append 方法

3.16 跟进 tryAppend 方法

3.17 跟进 directEncodeEvent 方法

3.18 跟进 encode 方法

3.19 跟进 toText 方法

3.20 跟进 toSerializable 序列化 方法

3.21 跟进 format 方法

3.22 跟进 format 方法

3.23 跟进 replace 方法(进入 if 判断前,做了格式判断,需要满足 "${" 开头才进入 )

3.24 跟进 substitute 方法

3.25 跟进 resolveVariable 方法

3.26 跟进 lookup 方法

3.27 跟进 lookup 方法

(将传入的参数 jndi 和 rmi://192.168.3.175:8085/goqzKRmu 分离出来赋值给 name 和 prefix )

(StrLookupMap 中储存的 String,object 键值对,取出 JndiLookup 对象,并调用 jndiLookup 的 look 方法)

3.28 跟进 lookup 方法

3.29 跟进 lookup 方法

3.30 先跟进 getURLOrDefaultInitCtx 方法(重要调用)

3.30.1 跟进 getURLContext 方法

(此处将 rmi 协议抽取出来)

3.30.2 跟进 getURLObject 方法

3.30.3 跟进 getObjectInstance 方法

(先根据 scheme 属性的 rmi 参数 获取 rmiURLContextFactory 类,然后调用 rmiURLContextFactory 的 getObjectInstance 方法 )

3.30.4 getObjectInstance 返回值为 rmiURLcontext 对象

3.31 依次返回到 lookup 方法,因返回值为 rmiURLContext 对象,调用该对象的 lookup 方法

3.32 先跟进 getRootURLContext 方法

3.32.1 getRootURLContext 方法 返回一个 解析结果 ResolveResult 对象

3.33 getResolvedObj 方法返回解析对象,强转接口类,再调用 RegistryContext 类的 lookup 方法,继续跟进

3.34 继续跟进 decodeObject 方法(var2 这里应该是发起了连接,工具收到 RMI 请求)

执行 this.registry.lookup(var1.get(0)) 语句时收到 RMI 请求

3.35 关键方法 getObjectInstance 获取对象的实例,跟进该方法

( NamingManager 类是 java 原生类,只与 JDK 版本有关,当前 JDK 版本 8u112)

3.36 继续跟进 get Object Factory From Reference 方法(该方法 从引用获取对象工厂)

3.37  第一个 try catch 应该是本地加载,如果有内容则不进入if判断(未加载到 class,clas 属性还是等于 null)

执行到 clas = helper.loadClass(factoryName, codebase) 加载远程类成功,工具收到请求

计算器 弹出成功(工具写的恶意类 应该是放在 static 代码块中,类加载的时候就会执行 static 代码块,无需使用new创建对象)

(clas.newInstance() 此方法会通过构造方法创建对象)

(恶意代码可以写在 static 代码块中,也可以写在 构造方法 中)

4、log4j2 底层调用链

总结:会根据传入的值去解析成对应的对象

比如 java:os ,对应的是系统属性

 

posted @ 2023-03-20 16:24  Tanya203  阅读(366)  评论(0编辑  收藏  举报