SQL Injection
Definición y concepto
Section titled “Definición y concepto”Según MITRE CWE-89, el SQLi se produce cuando una aplicación construye una sentencia SQL incorporando entrada del usuario sin neutralizr los caracteres especiales (comillas, punto y coma, comentarios), permitiendo que esa entrada se interprete como código SQL en lugar de como dato.
La causa raíz, concatenación dinámica de strings entre el código del programador y los datos controlados por el usuario. Un código típico vulnerable en Java es el siguiente:
String query = "SELECT * FROM users WHERE name = '" + request.getParameter("name") + "'";Si el usuario envía name=admin' OR '1'='1, la consulta resultante se convierte en:
SELECT * FROM users WHERE name = 'admin' OR '1'='1'Devuelve todas las filas porqué '1' = '1' es siempre verdadero.
Según MITRE las consecuencias comunes son la pérdida de confidencialidad, bypass de autenticación, escalada de privilegios, modificación o borrado de datos, y en casos extremos ejecución de comandos del sistema operativo (via xp_cmdshell en MSSQL).
Tipos y variantes (taxonomía oficial de PortSwigger Web Security Academy)
Section titled “Tipos y variantes (taxonomía oficial de PortSwigger Web Security Academy)”In-Band SQLi (los resultados aparecen en la respuesta HTTP)
Section titled “In-Band SQLi (los resultados aparecen en la respuesta HTTP)”- Error-based: el atacante provoca un error de base de datos cuyo mensaje filtra información, es útil cuando la aplicación devuelve mensajes de error detallados. Ejemplo portswigger:
TrackingId=ogAZZfxtOKUELbuJ' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--El CAST forzado a entero del campo string genera el error ERROR: invalid input syntax for type integer: "administrator", filtrando el dato.
- UNION-based: usa el operador UNION SELECT para añadir resultados de otra consulta a la original. Requiere que (1) el número de columnas coincida y (2) los tipos de datos sean compatibles. El procedimiento estándar es el siguiente:
' ORDER BY 1--' ORDER BY 2--o alternativamente