跳转至

CVE-2017-18349(Fastjson 1.2.24反序列化漏洞)

漏洞描述

在 Fastjson 1.2.24 版本中,存在一个反序列化漏洞,该漏洞由 CVE-2017-18349 标识。这个漏洞是由于 Fastjson 在处理 JSON 数据时,对输入数据没有进行足够的验证和过滤,导致恶意用户可以构造特定的 JSON 数据,触发反序列化操作,进而执行任意代码。

漏洞产生的原因是 Fastjson 在解析 JSON 数据时,没有对输入进行足够的校验,允许恶意用户通过构造特定的 JSON 数据,利用 Java 反序列化漏洞来执行任意代码。Fastjson 在处理 JSON 数据时,会将输入数据转换成 Java 对象。在这个过程中,如果输入数据包含了恶意的类名或者方法名,就会被反序列化成对应的对象,进而执行恶意代码。

这个漏洞的影响范围很广,因为 Fastjson 是 Java 语言中广泛使用的 JSON 处理库。任何使用了 Fastjson 1.2.24 版本或更早版本的应用程序都可能受到攻击。攻击者可以利用这个漏洞,通过发送恶意的 JSON 数据,执行任意代码,获取系统权限,导致数据泄露等安全问题。

影响版本

  • fastjson <= 1.2.24

环境配置

使用vulhub项目,docker-compose启动

Bash
docker-compose up -d

image-20250606152355942

漏洞复现

image-20250606152510183

验证漏洞存在性

原请求如下:

image-20250606153201799

现将请求改为POST,修改 Content-Type为: application/json

image-20250606153515756

JSON
// 不闭合JSON的花括号或者双引号,通过报错可能会将Fastjson爆出来
{"name":"hello", "age":2
{"name"":"hello", "age":2}

根据报错回显中含有fastjson或者com.alibaba.fastjson可以判断使用了fastjson,但具体版本无法判断

如果服务端关闭了错误回显,那么我们可以通过dnslog等带外的方式判断

JSON
{"aa":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"aa":{"@type":"java.net.Inet6Address","val":"dnslog"}}

//变换
{{"@type":"java.net.URL","val":"http://dnslog.com"}:"a"}
# 将dnslog替换为具体的网址

image-20250606154931190

image-20250606154946176

收到了请求,存在漏洞

漏洞利用

jsonexp

Bash
Traceback (most recent call last):
  File "/Users/yifan/tools/JsonExp/JsonExp.py", line 6, in <module>
    from lib.check import *
  File "/Users/yifan/tools/JsonExp/lib/check/__init__.py", line 10, in <module>
    from lib.interactsh import *
  File "/Users/yifan/tools/JsonExp/lib/interactsh/__init__.py", line 15, in <module>
    from Cryptodome.Cipher import AES, PKCS1_OAEP
ModuleNotFoundError: No module named 'Cryptodome'

使用时若存在以上报错,解决方法:

Bash
# 首先尝试安装依赖库
conda/pip install pycryptodome

若安装了之后还是相同报错

image-20250606161850152

Python
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA

将原代码改为上述语句

image-20250606161932638

此时能够正常使用

Bash

漏洞原理

Java中Fastjson各版本漏洞对抗史与总结-先知社区

修复建议

  1. 升级 Fastjson 到最新版本。Fastjson 官方已经发布了新版本,修复了这个问题。升级到最新版本可以确保你使用的是安全的版本,避免受到攻击。
  2. 对输入数据进行验证和过滤。在将 JSON 数据转换成 Java 对象之前,应该对输入数据进行严格的验证和过滤。确保输入数据中不包含恶意的类名或者方法名。可以使用正则表达式、白名单验证等方式来过滤输入数据。
  3. 限制反序列化的类。可以通过在 Java 反序列化时设置安全策略文件,限制可以被实例化的类。这样可以防止攻击者利用反序列化漏洞创建恶意对象。
  4. 使用安全的数据源。确保 JSON 数据来自可靠和受信任的来源,避免使用不可信的数据源。对从外部获取的 JSON 数据进行验证和过滤,确保数据的安全性。
  5. 保持其他相关组件的更新。除了 Fastjson 外,还有其他组件可能存在安全漏洞。保持应用程序中所有组件的更新,可以确保其他组件的安全性。

参考文章

lemono0/FastJsonParty: FastJson全版本Docker漏洞环境(涵盖1.2.47/1.2.68/1.2.80等版本),主要包括JNDI注入及高版本绕过、waf绕过、文件读写、原生反序列化、利用链探测绕过、不出网利用等。从黑盒的角度覆盖FastJson深入利用