
PoC تعليمي بلغة Python 3 لثغرة CVE-2019-9053، وهي SQL Injection من نوع time-based blind في CMS Made Simple <= 2.2.9. تم تكييف هذا الإصدار للاستخدام في بيئات CTF/المختبرات، مع بادئات مُهيأة مسبقاً لتقليل وقت استخراج البيانات ورسائل توضيحية باللغة البرتغالية.
PoC تعليمي بلغة Python 3 لثغرة CVE-2019-9053، وهي ثغرة حقن SQL أعمى قائم على الزمن (time-based blind SQL Injection) في CMS Made Simple <= 2.2.9.
تم تعديل هذه النسخة للاستخدام في CTF/المختبرات. تتضمن بادئات مكوّنة مسبقًا لتقليل وقت الاستخراج ورسائل توضيحية بالبرتغالية لمساعدة الطلاب على فهم آلية عمل الاستغلال (exploit).
هذا المشروع مخصص حصريًا للأغراض التعليمية والمختبرات الخاضعة للرقابة وبيئات CTF.
لا تستخدم هذا الكود ضد أنظمة تابعة لأطراف أخرى دون إذن صريح.
لا يتحمل مؤلف هذا المستودع أي مسؤولية عن إساءة استخدام هذه المادة.
تؤثر CVE-2019-9053 على الإصدارات القديمة من CMS Made Simple، مما يسمح بحقن SQL غير مصادَق عبر المعامل m1_idlist في نقطة النهاية:
/moduleinterface.php?mact=News,m1_,default,0
نظرًا لأن استجابة استعلام SQL لا تظهر مباشرة في الصفحة، يستخدم الاستغلال تقنية تسمى حقن SQL الأعمى القائم على الزمن (time-based blind SQL Injection).
يرسل الاستغلال حمولات (payloads) تجعل قاعدة البيانات تنفذ sleep(1) عندما يكون الشرط صحيحًا.
مثال مفاهيمي:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
إذا تأخر الخادم في الاستجابة، يفهم السكربت أن البادئة المختبرة صحيحة.
وبالتالي، يعيد بناء المعلومات الحساسة حرفًا بحرف، مثل:
في نسخة CTF هذه، تم تضمين بعض البادئات في الكود لتقليل الوقت اللازم أثناء النشاط.
يحدث حقن SQL عندما تُدخل التطبيقات بيانات يتحكم فيها المستخدم داخل استعلام SQL دون معالجة مناسبة.
في هذه الحالة، يكون الحقن أعمى (blind) لأن نتيجة الاستعلام لا تظهر مباشرة في استجابة HTTP.
وهو قائم على الزمن (time-based) لأن المهاجم يستخدم زمن استجابة الخادم كقناة للرد. إذا كان الشرط المختبر صحيحًا، تنفذ قاعدة البيانات تأخيرًا عبر sleep(). وإذا كان خاطئًا، تأتي الاستجابة بشكل طبيعي.
مثال مبسط:
Pergunta feita pelo exploit:
"O hash da senha começa com 0c01?"
Se sim:
O banco executa sleep(1), e a resposta demora.
Se não:
A resposta vem sem atraso perceptível.
من خلال تكرار هذه العملية حرفًا بحرف، يتمكن الاستغلال من إعادة بناء قيم قاعدة البيانات حتى دون رؤيتها مباشرة في الصفحة.
الملح (Salt) هو قيمة إضافية تُستخدم مع كلمة المرور قبل توليد التجزئة (Hash).
في هذا التحدي، يستخدم CMS Made Simple منطقًا مشابهًا لما يلي:
md5(salt + password)
على سبيل المثال:
salt = 1dac0d92e9fa6bb2
password = exemplo123
سيتم حساب التجزئة انطلاقًا من:
1dac0d92e9fa6bb2exemplo123
يعمل الملح على صعوبة الهجمات المعتمدة على الجداول المحسوبة مسبقًا، ويجعل كلمات المرور المتطابقة تولّد تجزئات مختلفة في سياقات مختلفة.
على الرغم من ذلك، يُعد md5(salt + password) طريقة قديمة وضعيفة لتخزين كلمات المرور. يجب على الأنظمة الحديثة استخدام خوارزميات مخصصة لكلمات المرور، مثل:
تم تكييف هذه النسخة لتسهيل الاستخدام في نشاط عملي.
أبرز التغييرات:
القيم المستخدمة في التحدي:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
البادئات المكوّنة في الاستغلال:
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
لا تزيل هذه البادئات منطق الهجوم. إنها تقلل فقط من الوقت اللازم للنشاط في المختبر.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
استنسخ المستودع:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
أنشئ بيئة افتراضية:
python3 -m venv .venv
فعّل البيئة الافتراضية:
source .venv/bin/activate
ثبّت التبعيات:
pip install -r requirements.txt
يجب أن يحتوي ملف requirements.txt على:
requests
termcolor
تشغيل بسيط:
python3 exploit_ctf.py -u http://target/cms
تشغيل مع محاولة كسر كلمة المرور باستخدام قائمة كلمات:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
عرض مساعدة السكربت:
python3 exploit_ctf.py -h
يمكن أن يحتوي ملف wordlist-example.txt على:
wrongpassword
admin123
dieema123
password
123456
[+] Salt da senha encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: [email protected]
[+] Hash da senha encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Senha encontrada: dieema123
بعد أن يستخرج الاستغلال ملح كلمة المرور والتجزئة، يمكنه محاولة اكتشاف كلمة المرور كنص صريح باستخدام قائمة كلمات.
المنطق المختبر هو:
md5(salt + senha_candidata)
لكل كلمة مرور في قائمة الكلمات، يحسب السكربت التجزئة ويقارنها بالتجزئة المستخرجة من قاعدة البيانات.
مثال مفاهيمي:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
إذا كانت النتيجة مساوية للتجزئة المستخرجة، فقد تم العثور على كلمة المرور.
عادةً ما يكون حقن SQL القائم على الزمن بطيئًا، لأن كل حرف يجب اختباره عبر عدة طلبات.
تعمل هذه النسخة على تقليل الوقت باستخدام:
ومع ذلك، قد يختلف الوقت وفقًا لما يلي:
TIME_DELAY.إذا كان هناك الكثير من الإيجابيات الكاذبة أو السلبيات الكاذبة، فزد قيمة TIME_DELAY في الكود.
نسخة Python 3 المعدّلة لمسابقات CTF بواسطة Derick G. Andrighetti.
مبنية على PoC عام قديم بلغة Python 2 نُشر في الأصل بواسطة Daniele Scanu من Certimeter Group.
استخدام تعليمي.
أُنتجت هذه المادة لأغراض الدراسة والعرض في المختبر وأنشطة CTF.