
PoC لـ CVE-2021-2471 - XXE في MySQL Connector/J
ثغرة في منتج MySQL Connectors من Oracle MySQL (المكون: Connector/J). الإصدارات المتأثرة هي 8.0.26 والإصدارات السابقة.
يمكن أن تؤدي الهجمات الناجحة على هذه الثغرة إلى الوصول غير المصرح به إلى البيانات الحرجة أو الوصول الكامل إلى جميع البيانات التي يمكن الوصول إليها من MySQL Connectors، بالإضافة إلى القدرة غير المصرح بها على التسبب في تعليق أو تعطل متكرر (DOS كامل) لـ MySQL Connectors.
تم اكتشاف هذه الثغرة بواسطة Xu Yuanzhen من فريق أمان Alibaba Cloud و Hongkun Chen من Alibaba.
يتم تقديم هذا الإثبات المفاهيمي لأغراض البحث. لا تستخدمه لمهاجمة أهداف ليس لديك إذن صريح لاستغلالها.
يمكن العثور على إفادة البائع وإصلاح هذه الثغرة هنا.
تتكون ثغرة XXE من XML يحتوي على كيانات DTD ضارة يتم استلامها بواسطة مكون MysqlSQLXML ويتم تشغيلها عند استدعاء الدالة getSource().
كما هو موضح في الكود أدناه من mysql-connector-java-8.0.26.jar، عندما يتم تمرير فئة DOMSource كوسيطة إلى الدالة getSource()، فإنها تعرض DocumentBuilder بطريقة غير آمنة بحيث إذا تحكم المهاجم في محتوى inputSource المرسل إلى الباني، يمكنه استغلاله للحصول على XXE:
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));
هناك طريقتان لتمرير XXE الضار إلى MysqlSQLXML: