Funcionamiento de una inyección SQL

VulnerabilidadesUna de las vulnerabilidades más comunes son las inyecciones SQL, las cuales existen hace mucho tiempo. En la actualidad, continúan siendo utilizadas ampliamente por parte de los ciberdelincuentes. La finalidad de estos ataques es la de comprometer los servidores que los ciberdelincuentes tienen como objetivo y disponer de ellos con otros fines.

¿Qué tipos de ataques existen?

Si bien existen una gran variedad de ataques y regularmente aparecen nuevos, uno de los más comunes y clásicos es el que intenta validar una condición de consulta como verdadera. Esto se logra a través del simple:

[‘OR ‘1’=’1]

De esta manera, si la sección de código donde se realiza la consulta no se encuentra desarrollada con las medidas de seguridad adecuadas, esta consulta resultará en una condición verdadera y la consulta original arrojará todos los resultados. Suponiendo que se tiene una consulta como la siguiente:

SELECT * FROM usuarios WHERE usuario=’$usuario’ AND password=’$password’;

En la consulta anterior, los parámetros inyectables son ‘$usuario’ y ‘$password. Si se aplica la inyección antes especificada sobre ambos parámetros, la consulta original se transformará en la siguiente:

SELECT * FROM usuarios WHERE usuario=’ OR ‘1’=’1‘ AND password=’ OR ‘1’=’1‘;

Asimismo, la consulta arrojará todos los resultados y por consecuencia el ciberdelincuente conocerá toda la información alojada en esa tabla. Esto se debe a que “1=1” es siempre verdadero. Tal como dijimos anteriormente, esta es una de las inyecciones más clásicas y es fácilmente solucionable.

¿Cómo podemos solucionar este tipo de inyección?

Para ello basta con sanear los parámetros para que no sea posible inyectar parámetros especiales como, por ejemplo, las comillas. Si se está trabajando con una base de datos bajo MySQL, el cual es un motor muy utilizado, es posible sanear los parámetros tal como se indica a continuación:

SELECT * FROM usuarios WHERE usuario= mysql_real_escape_string(‘$usuario’) and mysql_real_escape_string(password=’$password’);

¿Existen otro tipo de inyecciones?

Existen diversos tipos de inyecciones siendo algunos más complejos que otros. Entre los más comunes, es posible mencionar Blind SQL Injection. Éste método es más difícil de prever a la hora del desarrollo del sistema. Asimismo, también es más difícil por parte de un ciberdelincuente de llevar una explotación exitosa utilizando Blind SQL Injection.

¿En que consiste Blind SQL Injection?

Blind SQL Injection se utiliza cuando no existen mensajes de error ante una posible inyección o los mismos han sido alterados por el desarrollador. Además, tampoco es posible visualizar los datos de las consultas en la página web. De esta manera, el atacante intenta inyectar consultas que arrojen un valor verdadero y de esa manera poder inferir que tipo de información arroja la consulta. Por lo tanto, cuando la consulta sea correcta visualizará un mismo contenido y no el mensaje de error personalizado.

Para este tipo de inyecciones también suele utilizarse, para comprobar si es explotable, la consulta básica que fue explicada anteriormente.

Es importante aclarar que existen diversas técnicas para protegerse contra este tipo de inyecciones. Algunas de ellas son más complejas que otras. Sin embargo, en primera instancia, es importante realizar los controles necesarios sobre los parámetros que sean tomados como datos de entrada. Siempre hay que pensar cuáles pueden ser los puntos de acceso para un atacante y de esa forma poder anticipar las posibles inyecciones.

En un futuro, seguiremos ahondando sobre esta temática y brindaremos más ejemplos de cómo estar protegidos contra diferentes ataques de inyección SQL.

Fernando Catoira
Analista de Seguridad

Autor , ESET

Síguenos