La Inyección SQL (SQLi) es una vulnerabilidad de seguridad web que permite a un atacante interferir con las consultas que una aplicación realiza a su base de datos. En este artículo, analizaremos técnicamente cómo se produce un Authentication Bypass.
Fundamentos Teóricos
Las aplicaciones web interactúan con bases de datos mediante el lenguaje SQL (Structured Query Language). Una vulnerabilidad ocurre cuando los datos proporcionados por el usuario (input) se concatenan directamente con el código SQL sin la debida validación o escape, rompiendo la separación entre datos y comandos.
Análisis del Código Vulnerable
Consideremos el siguiente fragmento de código Python/Flask presente en el entorno vulnerable:
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
Aquí, la variable username se inserta directamente dentro de las comillas simples de la consulta.
Vector de Ataque: Tautología
El objetivo es alterar la lógica booleana de la cláusula WHERE. Al introducir el payload admin' OR '1'='1' -- -, la consulta resultante interpretada por el motor de base de datos es:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- -' AND password = '...'
': Cierra la cadena de texto del campo username.OR '1'='1': Introduce una condición que siempre se evalúa como VERDADERA (Tautología).--: Es el indicador de comentario en SQL. Todo lo que sigue (la verificación de la contraseña) es ignorado por el motor.
Como resultado, la base de datos devuelve el primer registro que cumple la condición (generalmente el administrador), permitiendo el acceso sin credenciales válidas.
Mitigación y Defensa en Profundidad
La defensa estándar de la industria es el uso de Consultas Parametrizadas (Prepared Statements). En este modelo, la base de datos trata los parámetros como datos estrictos, nunca como código ejecutable, neutralizando la inyección independientemente del contenido del input.