简介与漏洞史
Java 中处理 JSON 数据的流行类库之一是 FastJSON,由阿里巴巴开源并维护。FastJSON 提供了高效的 JSON 格式与 Java 对象之间的转换,因此在 Web 服务和 Android 开发中得到广泛应用。它提供了 toJSONString()
和 parseObject
方法,用于将 Java 对象转换成 JSON 格式,以及将 JSON 数据转换成 Java 对象。
FastJSON 漏洞历史
fastjson-1.2.24
在 FastJSON 1.2.24 版本中,存在一个特性,允许 JSON 数据通过 @type
字段指定应当还原成何种类型的对象,在反序列化时使用较为方便。
fastjson-1.2.48 以下
在 1.2.48 版本以下,FastJSON 存在绕过黑名单检测的安全漏洞。这是因为上一步将 com.sun.rowset.JdbcRowSetImpl
放入了映射中,导致 checkAutoType
在检测时绕过了黑名单。因此,通过字符串中包含 \x
转义字符可造成 DoS(拒绝服务)漏洞。
漏洞复现
本地测试环境
- 图片本地的版本 Java 版本为 1.8.0_181
- FastJSON 版本为 1.2.24
- Tomcat 版本为 7
安全版本
- JDK: 8u121, 7u131, 6u141
- RMI: JDK 6u132, 7u122, 或 8u113
FastJSON 两种利用方式
出网
- 使用 JNDI 注入:可选择 RMI 或 LDAP,其中 LDAP 限制较小。
- 服务器无法出网时,可直接进行本地反序列化攻击。
不能出网
- 直接反序列化:利用
_bytecodes
直接进行反序列化。
黑白盒测试方法
黑盒测试
- 如果目标站点报错,尝试使用不闭合花括号或多添加双引号来测试。
- FastJSON 与 Jackson 的区别:尝试在 JSON 中追加一个随机 key,修改 JSON 结构。FastJSON 不会报错,但 Jackson 会因为强制 key 与 JavaBean 属性对齐而报错。
白盒审计函数
- 检查 FastJSON Jar 包版本是否小于 1.2.48。
- 审查
JSON.parseObject()
、JSONObject.parseObject()
、JSON.parseArray()
等函数。 - 检查
config.checkAutoType(typeName)
函数,确保不在黑名单中。
黑名单
<code>bsh, com.mchange, com.sun., java.lang.Thread, java.net.Socket, java.rmi, javax.xml, org.apache.b</code>
© 版权声明
THE END
暂无评论内容