一、前言
这一篇我们来介绍一下史上第二严重的安全漏洞是个什么情况,原理是什么,如何重现。
二、Log4j2 Lookup机制
Log4j2 Lookup机制最重要的功能就是提供一个可扩展的方式让你可以添加某些特殊的值到日志中。你调用logger.info(name);这样的语句,如果要输出的name是带了 ${},它就会给你分发到对应的Lookup具体类去执行而不是直接输出字符串。
先搭建一个SpringBoot项目,然后将spring-boot-starter-logging这个依赖移除,自己引用log4j-api-2.13.3.jar、log4j-core-2.13.3.jar这两个包,注(这是我们从自己以前老机器上找到的,现在官方应该是已经修复了,直接maven依赖进来应该是不能重现了)。
注:用POSTMAN调用发送请求传参数值为 ${java.os},
控制台会输出:Mac OS X 10.15.7 unknown, architecture: x86_64-64,其执行时序图如下
1、MessagePatternConverter.format
2、StrSubstitutor.resolveVariable
3、Interpolator.lookup
4、SystemPropertiesLookup.lookup
这就把我操作系统的信息就输出来了,就是用Log4j2可以输出变量,但好像这问题也不大吗,输出就输出呗有毛关系,请看下图红色标出来的,这才是大漏洞。
三、他是怎么来黑的呢
注:用JNDI注入,变量可以用来被执行远端代码。
1、JndiObj
注:这里写的是rm -rf * ,您可别执行,不然把自己服务器干掉了。
2、JndiServer
注:在你的机器上启动JNDI服务,然后jndiObj里你想做什么都行,
Runtime.getRuntime().exec()会在调用jndi接口的机器上执行。
3、发送请求
启动SpringBoot项目,调用接口发送数据。
注:我这里演示用的是同一台机器,但也可以很明显看得出来是在服务器上去执行远程黑客机器上的代码(那个代码在你的服务器上执行,而不是黑客自己的机器)。