Skip to content

SQL Injection

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)”
  1. 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.

  1. 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