技术社区
安全培训
技术社群
积分商城
先知平台
漏洞库
历史记录
清空历史记录
相关的动态
相关的文章
相关的用户
相关的圈子
相关的话题
注册
登录
2025京麒杯web
Wakaka
发表于 湖南
CTF
925浏览 · 2025-05-28 11:01
返回文档
2025京麒CTF初赛-web
计算器
前端删除
expression
的
disable
,然后就可以正常输入了。
且该题为ssti
payload:
''.__class__.__mro__[1].__subclasses__()[80].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("env").read()')
flag在环境变量中
这是非预期解
预期解是:
https://blog.csdn.net/weixin_59166557/article/details/148202808
FastJ 复现
附件:
FastJ-1.0-SNAPSHOT-11.jar
参考:
https://www.ctfiot.com/249673.html
https://www.cnblogs.com/symv1a/p/18900307/2025-jingqi-ctf-preliminary-competitionweb-z108qvu
前置知识
fastjson的“AutoTypeCheck”机制
Fastjson 从
1.2.68
开始引入白名单,在
1.2.80
中更加严格。只有在
白名单
中的类才能通过
@type
被反序列化。
●
一些常见 Java 基础类,例如:
○
java.util.HashMap
○
java.util.ArrayList
○
java.lang.Integer
○
java.lang.String
●
特定配置下用户添加的类(通过
ParserConfig.addAccept("com.example.")
)
●
特定第三方库被明示允许的类(比如某些 JSON 处理类)
不再支持自动根据
@type
加载任意类。
fastjson的类缓存机制
Fastjson
的类缓存机制:
ParserConfig.classMapping
当使用
@type
加载了一个类,Fastjson 会把它缓存起来:
这是为了提升解析性能、减少重复反射。
所以,
只要你通过
@type
加载了某个类
,Fastjson 后续就可以:
●
复用这个
Class
实例
●
不再检查
autoType
(因为已经被认为是“合法的”了)
缓存机制由来:
●
该机制很早就有(至少在 1.2.6+ 就存在),本是出于性能目的
●
后来被用于各种 Gadget 利用链中作为“class 引导缓存”技巧
rmb
RMI-Based MarshalOutputStream
是 JDK 自带的一个类:
sun.rmi.server.MarshalOutputStream
●
ObjectOutputStream
的子类;
●
在对象序列化过程中,
会调用其内部 OutputStream 的 write 方法
;
●
是 JDK RMI 模块中用于序列化对象时的工具类。
可以利用反序列化触发
write()
,实现数据流写入
InflaterOutputStream
标准 JDK 类,负责接收压缩数据 → 解压 → 向底层流写入
解题过程
fastjson
版本为
1.2.80
核心代码:
调用
getflag()
会触发
new FilterFileOutputStream("/flag", "/");
将触发调用
FilterFileOutputStream
类,构造函数调用
super(name)
➜ 调用了
FileOutputStream(String name)
➜
会尝试打开或新建这个文件
试探一下
autotype
是否开启
开启。那就可以借助
Fastjson
的反序列化能力,构造这样一个对象:
但存在
“AutoTypeCheck”
机制,由于
FilterFileOutputStream
不在白名单中,
无法被正常反序列化
关于FastJson 1.2.80的利用,找到CVE-2022-25845
CVE-2022-25845 - Fastjson RCE 漏洞分析
该漏洞的核心在于只要目标类继承了
Throwable
类,Fastjson就能反序列化这个目标类。
将
OutputStream
加入
autoType
缓存
luelueking/CVE-2022-25845-In-Spring: CVE-2022-25845(fastjson1.2.80) exploit in Spring Env!
该项目是一个把
java.io.InputStream
加入
fastjson autotype
缓存的demo,简单看看这个项目
其核心链条:
Fastjson 在构造这些类时会顺便初始化其字段类型(如
in: InputStream
),从而将
InputStream
加入 autoType 缓存。
根据上述思路找
OutputStream Gadget
的思路
●
继承 Throwable
●
有字段指向
某个含
OutputStream
成员的类
●
类路径没有被 Fastjson 拦截
在
BOOT-INF/lib/
中查看项目依赖
图片加载失败
发现
jackson
生态全套,其中
jackson-core-2.13.2.jar
中包含
UTF8JsonGenerator
,可构造
OutputStream
缓存链
使用Mini-Venom师傅构造的gadget
payload
得到回显,说明绕过了
“AutoTypeCheck”
机制
任意文件写入
题目实现了
FilterFileOutputStream
类,可以通过
@type
加载
利用 JDK 的标准类
InflaterOutputStream
和
MarshalOutputStream
可以在反序列化期间
触发写入流数据
1
MarshalOutputStream
●
属于 JDK 中 RMI 模块:
sun.rmi.server.MarshalOutputStream
●
在
readObject()
过程中会触发它包装的底层
OutputStream.write()
方法
1
InflaterOutputStream
●
是一个解压类,持有字段:
●
其中
infl.input.array
被赋值后,当
InflaterOutputStream.write()
触发时会
尝试将解压数据写入
out
1
FilterFileOutputStream
(题目实现)
●
只要满足
name.startsWith(prefix)
条件,就会成功创建文件;
●
而
super(name)
会在构造函数中就打开文件;
●
之后通过反序列化链流入的内容会写进去。
进而可以构造出payload
array
: 压缩后的字符串内容
数据压缩部分的 Java 实现代码解析
然后写定时任务反弹shell
0
人收藏
0
人喜欢
转载
分享
0
条评论
某人
表情
可输入
255
字
评论
没有评论
发布投稿
热门文章
1
从零掌握java内存马大全(基于LearnJavaMemshellFromZero复现重组)
2
突破网络限制,Merlin Agent助你轻松搭建跳板网络!
3
从白帽角度浅谈SRC业务威胁情报挖掘与实战
4
基于规则的流量加解密工具-CloudX
5
从0到1大模型MCP自动化漏洞挖掘实践
近期热点
一周
月份
季度
1
从零掌握java内存马大全(基于LearnJavaMemshellFromZero复现重组)
2
突破网络限制,Merlin Agent助你轻松搭建跳板网络!
3
从白帽角度浅谈SRC业务威胁情报挖掘与实战
4
基于规则的流量加解密工具-CloudX
5
从0到1大模型MCP自动化漏洞挖掘实践
暂无相关信息
暂无相关信息
优秀作者
1
T0daySeeker
贡献值:38700
2
一天
贡献值:24800
3
Yale
贡献值:21000
4
1674701160110592
贡献值:18000
5
1174735059082055
贡献值:16000
6
Loora1N
贡献值:13000
7
bkbqwq
贡献值:12800
8
手术刀
贡献值:11000
9
lufei
贡献值:11000
10
xsran
贡献值:10600
目录
2025京麒CTF初赛-web
计算器
FastJ 复现
前置知识
fastjson的“AutoTypeCheck”机制
fastjson的类缓存机制
rmb
InflaterOutputStream
解题过程
将 OutputStream 加入autoType 缓存
任意文件写入
转载
标题
作者:
你好
http://www.a.com/asdsabdas
文章
转载
自
复制到剪贴板
没有评论