【最新漏洞預警】CVE-2021-2471-MySQL JDBC XXE漏洞分析與概念驗證
VSole2021-10-21 22:48:40
漏洞概述
MySQL JDBC是Oracle開發的針對MySQL數據庫操作的統一接口。近日網上爆出了MySQL JDBC存在XXE漏洞,漏洞編號為CVE-2021-2471,影響MySQL JDBC v8.0.27版本之前版本。看到漏洞信息后,第一時間查看了相關信息,官方把漏洞復現部分打上了馬賽克,在對該漏洞進行簡單分析后,發現整個過程其實比較簡單,自己做了一個概念驗證,這里分享給大家。
漏洞分析
0x01 環境構建
構建研究環境,分別下載MySQL JDBC v8.0.26和MySQL JDBC v8.0.27兩個版本。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version></dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version></dependency>
0x02 補丁對比
既然是XXE漏洞,那么我們可以重點關注處理XML的部分,通過分析定位`com.mysql.cj.jdbc.MysqlSQLXML#getSource`函數:

v8.0.27版本在XML處理前設置一堆setFeature來防止出現XXE漏洞。
0x03 構造分析
切換為v8.0.26版本,`com.mysql.cj.jdbc.MysqlSQLXML`類繼承于`SQLXML`,查閱關于`SQLXML`的一些用法:
sqlxml
https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlxml.htm
實例化`Connection`數據庫連接對象,通過`createSQLXML`函數創建一個`SQLXML`對象:

調用`SQLXML#setString`函數完成`stringRep`變量賦值:

然后查看漏洞函數`getSource`:

當輸入參數為`DOMSource.class`時,`stringRep`會被帶入并完成XML解析,從而導致出現XXE漏洞。
概念驗證

由于傳播、利用此文檔提供的信息而造成任何直接或間接的后果及損害,均由使用本人負責,文章作者不為此承擔任何責任。
VSole
網絡安全專家