渗透测试中获取 fastjson 精确版本号的方法

  • A+
所属分类:安全文章

背景

上个月天天打游戏一直没更文,也没啥研究成果,这次就随便发点小技巧。

没有技术含量,但在某些场景下也是可以运用得到。

目前来看是可以影响到最新版本(1.2.73)的。

细节

之前在找 fastjson 漏洞时看了很多可能存在问题的代码。

其中就包括 JavaBeanDeserializer 类。

该类有一处值得关注的代码如下图。

渗透测试中获取 fastjson 精确版本号的方法

渗透测试中获取 fastjson 精确版本号的方法

这里在某个条件成立后就会抛出一个异常。

异常的 message 会把当前 fastjson 的版本号输出。

渗透测试中获取 fastjson 精确版本号的方法

VERSION 常量由三个类调用,只有 JavaBeanDeserializer 比较容易由用户触发。

再回到触发条件。

渗透测试中获取 fastjson 精确版本号的方法

最主要的一个条件就是当前读取到的符号不得为 “{” 和 “,”。

然后就是如何来触发它了。

JavaBeanDeserializer 主要有两种方法可以触发。


1) 当代码使用 JSON.parseObject(json , clazz) 指定期望类的方式去解析 JSON,且 clazz 不能为 fastjson 已设定的大部分类型,如“Hashmap”、“ArrayList”

2) 当使用 JSON.parse(json) 不指定期望类的时候可以通过 AutoCloseable 来触发


最后要让精确版本能够输出在页面上还要满足“异常捕获处理不当”的条件。

复现

第一种场景

渗透测试中获取 fastjson 精确版本号的方法

第二种场景

渗透测试中获取 fastjson 精确版本号的方法

以上两个 payload 都是没有读到 “{”和“,” 才进入缺陷代码块抛出了异常。

更贴近真实环境可以部署一个 demo iSafeBlue/fastjson-autotype-bypass-demo[1]

渗透测试中获取 fastjson 精确版本号的方法

总结

按我的理解来看这个还算不上漏洞,但也算是一个缺陷。

总之在渗透时遇到代码对异常信息处理不当的项目还是很有效的。

可以直接在异常信息中暴露出 fastjson 的精确版本,然后再根据版本去测试已知漏洞。

References

[1] iSafeBlue/fastjson-autotype-bypass-demo: https://github.com/iSafeBlue/fastjson-autotype-bypass-demo

[2] 博客原文: https://b1ue.cn/archives/402.html



发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: