在看b1ue大佬文章fastjson 1.2.68 autotype bypass的时候,看到的其中一篇文章记录一下。
Author: b1ue
支持的版本:
目前来看是可以影响到最新版本(1.2.73)的。
细节
之前在找 fastjson 漏洞时看了很多可能存在问题的代码。
其中就包括 JavaBeanDeserializer 类。
该类有一处值得关注的代码如下图。
这里在某个条件成立后就会抛出一个异常。
异常的 message 会把当前 fastjson 的版本号输出。
VERSION 常量由三个类调用,只有 JavaBeanDeserializer 比较容易由用户触发。
再回到触发条件。
最主要的一个条件就是当前读取到的符号不得为 “{” 和 “,”。
然后就是如何来触发它了。
JavaBeanDeserializer 主要有两种方法可以触发。
- 当代码使用 JSON.parseObject(json , clazz) 指定期望类的方式去解析 JSON,且 clazz 不能为 fastjson 已设定的大部分类型,如“Hashmap”、“ArrayList”
- 当使用 JSON.parse(json) 不指定期望类的时候可以通过 AutoCloseable 来触发
最后要让精确版本能够输出在页面上还要满足“异常捕获处理不当”的条件。
复现
第一种场景:
第二种常见:
以上两个 payload 都是没有读到 “{”和“,” 才进入缺陷代码块抛出了异常。
更贴近真实环境可以部署一个 demo iSafeBlue/fastjson-autotype-bypass-demo
闭合也在本地进行测试,确实可以复现成功:
例如pay
{"@type":"java.lang.AutoCloseable"
总结
按我的理解来看这个还算不上漏洞,但也算是一个缺陷。
总之在渗透时遇到代码对异常信息处理不当的项目还是很有效的。
可以直接在异常信息中暴露出 fastjson 的精确版本,然后再根据版本去测试已知漏洞。
原文:
https://b1ue.cn/archives/402.html