Uso de SQL en Aplicaciones Web — Conceptos esenciales para SQL Injection

🌐 Uso de SQL en Aplicaciones Web

Las aplicaciones web se conectan a bases de datos (como MySQL) para almacenar y obtener datos.
En PHP, una consulta típica se ve así:

$conn = new mysqli("localhost", "root", "password", "users");
$query = "select * from logins";
$result = $conn->query($query);

Para mostrar los resultados:

while($row = $result->fetch_assoc()){
    echo $row["name"]."<br>";
}

Cuando se usa entrada del usuario en una consulta:

$searchInput = $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";
$result = $conn->query($query);
Warning

Si la entrada no se valida → hay posibilidad de SQL Injection.


🧪 ¿Qué es una Inyección?

La inyección ocurre cuando la aplicación interpreta la entrada del usuario como código, rompiendo la estructura original.

Info

La desinfección consiste en eliminar o escapar caracteres peligrosos (' " ; etc.).


💥 Inyección SQL

Ocurre cuando el usuario puede insertar código SQL en la consulta final.
Ejemplo vulnerable:

$searchInput = $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";

Consulta final:

select * from logins where username like '%$searchInput'

Si escribimos:

admin

Queda:

'%admin'

Pero si escribimos esto:

1'; DROP TABLE users;

La consulta generada sería:

select * from logins where username like '%1'; DROP TABLE users;'
Danger

Esto rompe la consulta original y ejecuta comandos SQL maliciosos.

Nota: MySQL no permite múltiples consultas con ;, aunque MSSQL y PostgreSQL sí.


❗ Errores de Sintaxis

La inyección anterior fallaría:

Error: near line 1: near "'": syntax error

El error ocurre porque la última comilla ' queda sin cerrar:

select * from logins where username like '%1'; DROP TABLE users;'
Tip

Para inyectar correctamente, hay que producir una consulta válida.
Como no vemos el código fuente, usamos técnicas como comentarios o manipulación de comillas.


🧭 Tipos de Inyecciones SQL

Pasted image 20251208182251.png

🎯 In-Band SQL Injection

Salida visible directamente en el frontend.

🔹 Union-Based

Usa UNION para fusionar resultados de otra consulta.

🔹 Error-Based

Fuerza errores SQL o PHP para obtener información.


👁️ Blind SQL Injection

Salida no visible directamente.

🔹 Boolean-Based

La página cambia según verdadero/falso.

🔹 Time-Based

Usa retrasos con funciones como:

SLEEP(5)


📡 Out-of-Band SQL Injection

La salida se envía a otro canal (DNS, HTTP externo).