原理
本质是java的反序列化漏洞,由于引进了自动检测类型的(autotype)功能,fastjson在对json字符串反序列化的时候,会读取@type内容,会试图将json内容反序列化成这个对象,并调用这个类的setter方法,那么攻击者就可以构造特定的json内容和通过@type来指定自己想要的内部库,从而导致远程命令的执行漏洞
流量特征
-
采用post方法,
-
发送数据包和返回包的数据类型为json类型
-
还有就是他的请求报文的花括号没闭合,请求包就会出现fastjson字段
-
响应包中有fastjson关键字
-
对于无回显的fastjson漏洞,其返回包中存在@type和dnslog平台网址
-
请求体可能含有攻击者c2服务器地址或者ladp协议,rmi协议的地址,还有就是,
-
返回包状态码一般为400,也可能为500
-
请求体中可能存在type,bytecodes,java.lang,返回包中含有commit = true
Fastjson不出网的利用与防护
利用
-
利用
TemplatesImpl
类TemplatesImpl
是最常见的利用类,因为它自带bytecodes
字段,攻击者可以植入恶意字节码。- 攻击无需额外依赖,只需要服务器环境支持 JDK。
-
利用
BasicDataSource
类-
针对
Tomcat
环境下的应用,攻击者可以利用org.apache.tomcat.dbcp.dbcp.BasicDataSource
或org.apache.tomcat.dbcp.dbcp2.BasicDataSource
类。 -
攻击者构造恶意 JSON,指向
BasicDataSource
类,通过某些触发条件实现远程代码执行。 -
触发条件:
- 需要目标应用运行在Tomcat环境中
- 必须在 JSON 解析时启用
Feature.SupportNonPublicField
特性。
-
Tomcat 版本要求:
- Tomcat 8.0 之前:
org.apache.tomcat.dbcp.dbcp.BasicDataSource
- Tomcat 8.0 之后:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource
- Tomcat 8.0 之前:
-
防护
使用Fastjson的黑名单功能:Fastjson提供了一个黑名单功能,可以用于禁止某些Java类的序列化和反序列化。通过设置一些敏感类的黑名单,禁止序列化和反序列化这些类,从而避免一些恶意攻击。
对Fastjson进行安全加固:对Fastjson进行安全加固可以避免恶意攻击。可以通过开启自动类型识别检查、限制反序列化对象的深度、限制反序列化对象的大小等措施,提高Fastjson的安全性。
使用其他JSON处理器: 如果对Fastjson存在疑虑或者担心其安全性问题,也可以考虑使用其他JSON处理器,比如Jackson、Gson等。这些处理器同样具有高性能和易用性,并且也可以进行安全加固。
漏洞产生的原因
由于@type
字段的可控性,攻击者可以将@type
字段设置为特定且服务端可以使用的类,从而执行恶意代码。具体原理如下:
- @type字段的利用:在反序列化过程中,Fastjson会根据
@type
字段的值来确定反序列化后的Java对象的类型。 - 恶意类加载:攻击者可以指定一个特定的Java类,该类可以被利用来执行恶意代码。
- JNDI注入:利用一些常见的Java类(如
com.sun.rowset.JdbcRowSetImpl
)来进行JNDI注入攻击,通过访问远程RMI或LDAP服务器来执行恶意代码。
漏洞修复
几种修复和防护措施包括:
- 升级Fastjson版本:官方建议升级到最新版本,例如1.2.83版本。
- 禁用危险类
- 关闭AutoType功能:如果无法升级,可以暂时关闭AutoType功能降低风险。
- 配置WAF防护:使用Web应用防火墙(WAF)防护。