Inyecciones SQL basadas en errores

Las inyecciones SQL basadas en errores explotan mensajes de error que la base de datos o la capa de acceso a datos devuelven en la respuesta. Si una entrada provoca una excepción o un fallo de conversión y ese detalle se refleja en la página (stack trace, mensaje del driver, código de error), el atacante puede leer información útil (versión, nombres de tablas/columnas, estructuras) y usarla para refinar ataques posteriores.

Es habitual forzar conversiones de datos invalidos usando CAST para producir errores que revelen datos o la estructura interna.

Diferencias entre bases de datos

Base de datosPalabras clavesDescripción
MySQLCAST(... AS SIGNED), CONVERT(..., SIGNED) 
PostgreSQLCAST(... AS INTEGER), ::integer 
MicrosoftCAST(... AS INT), CONVERT(INT, ...) 
OracleCAST(... AS NUMBER), TO_NUMBER() 

Ejemplos de ataque

Imaginemos que existe una tabla users con las columnas username y password. Podemos obtener los usuarios y sus contraseñas provocando un error al intentar convertir con CAST esos valores a un tipo numérico inválido:

1
2
3
# Microsoft

' AND 1=CAST((SELECT TOP 1 username FROM users) AS INT) --
1
2
3
# Microsoft

' AND 1=CAST((SELECT TOP 1 password FROM users) AS INT) --