Log4j远程代码执行漏洞复现

本文最后更新于:2022年1月13日 下午

Apache-Log4j高危漏洞

看热闹不嫌事大🤣🤣🤣,尝试复现一下


Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。

2021年12月9日,经阿里安全团队验证,Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。鉴于此漏洞危害较大,建议客户尽快采取措施防护此漏洞。

漏洞影响版本:Apache Log4j 2.x <= 2.14.1

漏洞级别: 严重!!


  • 先来新建一个Maven项目,pom.xml文件中导入存在漏洞的Log4j版本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- https://search.maven.org/ -->
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.0</version>
    </dependency>
    <!-- https://search.maven.org/ -->
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    </dependency>
  • 新建一个java文件,具体测试代码如下,先正常尝试一下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;

    public class Log4j {
    public static final Logger logger = LogManager.getLogger(Log4j.class);
    public static void main(String[] args) {
    String username = "This is a message";
    logger.error(username);
    }
    }

    运行一下:

    正常情况

​ 可见通过使用Log4j的相关函数,可以实现在运行中打印相关日志。

  • 做点手脚,将uername的字符串内容换成${java:os},运行一下:

    恶意注入

​ 他竟然把我们的字符串内容当成命令执行了!!这还了得!!😡😡

​ 后续复现需要搭后台服务,我搞了半天也没成功,就这样吧😭😭