
MySQL Community Server 26.7.0 - عالي - mysqlbinlog --raw مسار Rotate المتبقي - كتابة ملف العميل
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
الفئة: كتابة ملف (عميل) الوصول: عن بُعد (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
يقوم mysqlbinlog --raw --read-from-remote-server بنسخ حدث Rotate new_log_ident إلى log_file_name دون التحقق من اسم الملف الأساسي. يقوم حدث FORMAT_DESCRIPTION التالي باستدعاء my_fopen على ذلك المسار ويكتب BINLOG_MAGIC بالإضافة إلى الحدث. تفريغ ضار يرسل معرّف Rotate حقيقي يحتوي على / يكتب ذلك الملف بمعرّف المستخدم الخاص بالعميل.
--raw هو نسخ ملف binlog عن بُعد الموثّق. ما تبقّى هو التعامل مع المعرّف كمسار.
| المعرّف | لا يوجد CVE بعد |
| الفئة | كتابة ملف (العميل --raw BINLOG_MAGIC) |
| الوصول | عن بُعد (الضحية يشغّل mysqlbinlog --raw -R ضد تفريغ المهاجم؛ UI:R) |
| CWE | CWE-22 |
| CVSS | عالٍ: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| المنتج | MySQL Community Server mysqlbinlog |
| المتأثر | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| المصادقة | الضحية يشغّل mysqlbinlog --raw -R ضد تفريغ المهاجم |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. ملف الشاهد مع BINLOG_MAGIC. كتابة ملف، وليس RCE. |
قم بإعداد خادم بروتوكول MySQL. تحدّث COM_BINLOG_DUMP. أرسل Rotate مزيّف مطابق (الطابع الزمني 0، المعرّف يساوي اسم السجل المطلوب) حتى لا يتوقف التفريغ. أرسل Rotate حقيقي (الطابع الزمني != 0) معرّفه /abs/path. أرسل حدث FORMAT_DESCRIPTION.
المشغّل الذي شغّل mysqlbinlog --raw -R ... mysql-bin.000001 يكتب /abs/path بمعرّف المستخدم الخاص بالعميل. المحتويات هي بايتات binlog (\xfebin بالإضافة إلى حدث FD)، وليست حمولة عشوائية. استبدل أي مسار يمكن لمعرّف المستخدم إنشاؤه.
لن يصدر mysqld حقيقي معرّف Rotate يحتوي على /. ما تبقّى هو العميل.
نفس مطاردة 26.7.0 مثل mysqldump SHOW TABLES overflow وmysqldump --tab path. كان الخادم الافتراضي فارغًا. أدوات العميل لا تزال تثق بالأسماء عن بُعد.
if (raw_mode) {
if (output_file != nullptr) {
snprintf(log_file_name, sizeof(log_file_name), "%s%s", output_file,
rev->new_log_ident);
} else {
my_stpcpy(log_file_name, rev->new_log_ident);
}
}
Rotate مزيّف (when.tv_sec == 0) معرّفه لا يطابق السجل المطلوب يوقف التفريغ. Rotate مزيّف مطابق يتم تخطيه (continue) بعد النسخ. Rotate الحقيقي لا يوقف. FD التالي:
if (!(result_file = my_fopen(
log_file_name, O_WRONLY | MY_FOPEN_BINARY, MYF(MY_WME)))) {
error("Could not create log file '%s'", log_file_name);
تبقى ملفات LOAD DATA المؤقتة SQL_LOAD_MB تحت tmpdir. مغلقة. طول المعرّف محدود بـ FN_REFLEN-1. لا يتم إزالة /.
المنعطفات الخاطئة المسجّلة بالفعل: إرسال Rotate مزيّف معرّفه هو المسار (يتوقف التفريغ)؛ استخدام --result-file (يصبح المعرّف بادئة، ما تبقّى مختلف)؛ mysqld حقيقي كأوراكل؛ المجاميع الاختبارية متروكة مفعّلة.
cd lab
./run.sh
الصورة mysql:26.7.0. الملف التنفيذي /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (ليس على PATH في تلك الصورة). كعب التحكم: Rotate مزيّف mysql-bin.000001 بالإضافة إلى FD يكتب work/mysql-bin.000001. كعب الاجتياز: Rotate مزيّف مطابق، Rotate حقيقي معرّفه /work/oracle/MYSQL-BINLOG-RAW-WITNESS، FD يكتب ذلك المسار (BINLOG_MAGIC). منشور على 127.0.0.1:18620 / 18621. اربطه بالـ loopback. كتابة ملف لبايتات binlog، وليس RCE. لا --result-file.
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
خذ basename من new_log_ident قبل my_stpcpy / snprintf إلى log_file_name. يجب أن يكتب --raw تحت cwd أو بادئة --result-file، وليس معرّفًا يحتوي على /.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries