
PoC for CVE-2021-2471 - XXE in MySQL Connector/J
Sicherheitslücke im MySQL Connectors-Produkt von Oracle MySQL (Komponente: Connector/J). Die betroffenen unterstützten Versionen sind 8.0.26 und früher.
Erfolgreiche Angriffe auf diese Sicherheitslücke können zu unbefugtem Zugriff auf kritische Daten oder vollständigem Zugriff auf alle zugänglichen Daten der MySQL Connectors sowie zu einer unbefugten Fähigkeit führen, einen Stillstand oder einen häufig wiederholbaren Absturz (vollständige DOS) der MySQL Connectors zu verursachen.
Diese Sicherheitslücke wurde von Xu Yuanzhen vom Alibaba Cloud Security Team und Hongkun Chen von Alibaba entdeckt.
Dieser PoC dient Forschungszwecken. Verwenden Sie ihn nicht, um Ziele anzugreifen, für die Sie keine ausdrückliche Erlaubnis zur Ausnutzung haben.
Die Offenlegung und der Fix des Herstellers für diese Sicherheitslücke sind hier zu finden.
Die XXE-Sicherheitslücke besteht aus einem XML, das bösartige DTD-Entitäten enthält, das von einer MysqlSQLXML-Komponente empfangen wird, und wird ausgelöst, wenn die Funktion getSource() aufgerufen wird.
Wie im folgenden Code aus der mysql-connector-java-8.0.26.jar zu sehen ist, legt die DOMSource-Klasse, wenn sie als Argument an die Funktion getSource() übergeben wird, einen DocumentBuilder auf unsichere Weise offen, so dass, wenn ein Angreifer den Inhalt des an den Builder übergebenen inputSource kontrolliert, er dies für die Erlangung von XXE nutzen könnte:
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));
Es gibt zwei Möglichkeiten, das bösartige XXE an die MysqlSQLXML zu übergeben:
PoC XXE mit sqlxml.setString()
PoC XXE mit resultSet.getSQLXML()
Verwundbares JAR herunterladen
Weitere XXE-Payloads