
PoC for CVE-2021-2471 - XXE in MySQL Connector/J
Oracle MySQL 的 MySQL 连接器产品(组件:Connector/J)存在漏洞。受影响的受支持版本是 8.0.26 及更早版本。
成功利用此漏洞可导致对关键数据的未授权访问,或完全访问所有 MySQL 连接器可访问的数据,并能够未经授权地导致 MySQL 连接器挂起或频繁可重复的崩溃(完全拒绝服务)。
此漏洞由阿里云安全团队的徐远珍和阿里巴巴的陈宏坤发现。
本 PoC 仅供研究目的使用。请勿将其用于攻击未获得明确授权的目标。
供应商关于此漏洞的披露和修复信息可在此处找到。
该 XXE 漏洞由包含恶意 DTD 实体的 XML 被 MysqlSQLXML 组件接收,并在调用 getSource() 函数时触发。
从下面的 mysql-connector-java-8.0.26.jar 代码中可以看出,当 DOMSource 类作为参数传递给 getSource() 函数时,它会以不安全的方式暴露 DocumentBuilder,因此如果攻击者控制了传递给构建器的 inputSource 的内容,则可以利用它来获取 XXE:
public <T extends Source> T getSource(Class<T> clazz) throws SQLException {
try {
this.checkClosed();
this.checkWorkingWithResult();
InputSource reader;
if (clazz != null && !clazz.equals(SAXSource.class)) {
SQLException sqlEx;
if (clazz.equals(DOMSource.class)) {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
if (this.fromResultSet) {
inputSource = new InputSource(this.owningResultSet.getCharacterStream(this.columnIndexOfXml));
} else {
inputSource = new InputSource(new StringReader(this.stringRep));
}
return new DOMSource(builder.parse(inputSource));
向 MysqlSQLXML 传递恶意 XXE 有两种方式:
使用 sqlxml.setString() 的 XXE PoC
使用 resultSet.getSQLXML() 的 XXE PoC
下载易受攻击的 JAR
其他 XXE 载荷