背景
这个问题是由 和 (net.sf.json-lib 或者 org.json 其中一个库)同时在代码中使用且编写不当造成,
关于 JSON-lib 和 org.json 这两个库做过 Java 开发的应该比较熟悉,是除了 、gson 以外使用量和知名度都算是比较高的库了。
所以一个工程中同时出现使用 和 (json-lib/org.json)也是常有的事。
对 URL 的处理
在 反序列化类白名单里设置了很多常用的 Java 类,在没有开启 的情况下这些类也是默认允许被反序列化的,其中包括了.URL
要想让 .URL 类发起 URL 请求,就需要调用这三种方法
new URL(...).getContent();
new URL(...).openStream();
new URL(...).openConnection().connect();
在反序列化中也只有 get 开头的无参方法可以被调用了,所以要想让 URL 类在 反序列化时触发请求 就要想办法调用 URL 的 ()
显然光靠 是无法完成 () 方法调用的,不然这篇文章就叫 1.2.76 SSRF 了。
一般可以通过 和转JSON 的时候调用 get 方法,但这两种方法都有局限,无法调用到 () ,所以需要前面说到的 json-lib 或者 org.json 来触发。
触发
这里直接放上几种可以触发 的代码
分别是 json-lib 类的 ()、put()、
还有 org.json 的 构造方法
至于为何 org.json 和 json-lib 可以调用传入对象的所有 get 方法跟进源码看一下就知道了。
所以要想找到这个漏洞就需要去看代码有没有先用 去解析 JSON,然后要看 org.json/json-lib 有没有把 解析的结果传入。如果有这样的情况那很可能就会存在问题
关于触发点的一些想法
是一个开源的项目,可以在 issue 提出问题,如果向 的项目提出希望支持 json-lib 这样看似很正常实际能造成漏洞的需求,这个漏洞的利用可能就更完美了,当然这样做肯定是不厚道的。
另外 net.sf.json. 也是一个实现了 java.util.Map 接口的类,对 Map 类型的反序列化在com.....中也有做专门的处理。
遗憾的是这里没有指定期望类net.sf.json,如果指定了期望类是java.util.Map的话,可以这样触发。
TypeReference<Map> typeReference = new TypeReference<Map>() {
};
Map stringObjectMap = JSON.parseObject("{"@type":"net.sf.json.JSONObject","a":{"@type":"net.sf.json.JSONObject","x":{"@type":"java.net.URL","val":"http://127.0.0.1:2333"}}}", typeReference);
代码执行
前段时间看了朋友分享了一篇文章《 Wang & Yang Zhang - NTLM Relay Risk Is A New Makes It 》[1],正好可以在这里用到,在 Java+ 环境下存在SSRF或反序列化没有可用的 rce 时可以利用文中提到的方式窃取 NTLM Hash。
图中使用的 是5alt/[2],需要准备一台 虚拟机来开启恶意的 http 服务,然后在 2008 上用 .URL 类访问恶意的 http 服务即可获取到 NTLM Hash,拿到 NTLM Hash 就可以去执行命令了。
场景
我在本地搭了一套用来复现的 服务,为了省事直接设置了 的 。这样只用在绑定了 方法的参数中使用 @ 注解就可以自动使用 解析,效果同等于 JSON.parse
以上几个例子都可以造成 SSRF。
这种问题一般更容易通过白盒去发现,我见过使用两个 json 库比较多的场景大概是这样的:一个接口会先用 解析请求中的 json 得到一个 Map ,然后把 解析的 Map 对象里某个值或者整个 Map 都放到第二个 JSON 处理库的 JSON 对象net.sf.json,最后把第二个 JSON 处理库的 JSON 对象转成 Map 或者字符串,并作为内部 API 接口的请求参数去发起请求。
代码参考下图
总结
、JSON-lib、org.json 三个库都是引用量、使用量、知名度仅次于 和 gson 的 json 处理库,开发者也完全不会意识到使用两个 json 库可能会造成安全问题,所以这样的问题多少还是会存在的。
最后,欢迎各位大佬一起交流探讨。
[1]《 Wang & Yang Zhang - NTLM Relay Risk Is A New Makes It 》:%%20%26%%%20-%%%%20Is%%20A%20New%%%%20It%.pdf
[2]5alt/: