Qué es un ataque de inyección SQL, qué tipos hay, cómo identificarlos, cómo protegerse
La mayoría de las aplicaciones web desarrolladas hoy en día hacen uso de una base de datos para ofrecer páginas dinámicas y almacenar información tanto de los usuarios como de la propia herramienta, datos a los que se accede por medio del lenguaje SQL, un lenguaje para interaccionar con bases de datos relacionales.
El uso de este tipo de lenguaje ha traído consigo la aparición de una de las vulnerabilidades más peligrosas a la que nos podemos enfrentar. Nos estamos refiriendo al ataque por inyección de código SQL, una vulnerabilidad que no sólo pone en riesgo la integridad de la aplicación, sino de todos los datos almacenados de los usuarios que la utilicen, y que se produce cuando no se filtra de forma correcta la información enviada por los usuarios.
Qué es el ataque por inyección SQL
Consiste en la inserción de código SQL por medio de los datos de entrada desde la parte del cliente hacia la aplicación. Es decir, por medio de la inserción de este código el atacante puede modificar las consultar originales que debe realizar la aplicación y ejecutar otras totalmente distintas con la intención de acceder a la herramienta, obtener información de alguna de las tablas o borrar los datos almacenados, entre otras muchas cosas.
Como consecuencias de estos ataques y dependiendo de los privilegios que tenga el usuario de la base de datos bajo el que se ejecutan las consultas, se podría acceder no sólo a las tablas relacionadas con la aplicación, sino también a otras tablas pertenecientes a otras bases de datos alojadas en ese mismo servidor.
Lo comentado anteriormente es posible gracias a que el uso de ciertos caracteres en los campos de entrada de información por parte del usuario, ya sea mediante el uso de los campos de los formularios que son enviados al servidor mediante POST o bien por medio de los datos enviados mediante GET en las urls de las páginas web, posibilitan coordinar varias consultas SQL o ignorar el resto de la consulta, permitiendo ejecutar la consulta que elija, de ahí que sea necesario realizar un filtrado de esos datos enviados para evitar problemas.
Entre las bases de datos susceptibles a este tipo de ataques nos encontramos MySQL, Oracle, Postgres o MS SQL.
Principales problemas que causan los ataques SQL Injection
•Autenticación. Si el sistema de logueo que se utiliza para acceder a una zona restringida de una web es débil, por medio de este tipo de ataques se podría acceder sin la necesidad de conocer ni el usuario ni la contraseña.
•Integridad. Al igual que un ataque por inyección SQL permite leer información relevante almacenada en la base de datos, también es posible realizar cambios o incluso borrar toda información mediante este tipo de vulnerabilidad.
Tipos de inyección SQL
Las inyecciones SQL se producen por una falta de validación de los inputs de los clientes de una página web. Este fallo de seguridad significa que un usuario puede concatenar comandos en lenguaje SQL, dentro de una consulta en la aplicación y, de este modo, ejecutar código dentro de la página. Ahora bien, existen tres tipos de inyección SQL:
Cómo identificarlos
El tipo de inyección SQL apropiado para cada aplicación web depende de la vulnerabilidad que se halle presente. Por eso, es útil recurrir a una herramienta que busque fallos de manera automática. El software por excelencia para hacer este estudio es SQLmap.
Gracias a SQLmap, no es necesario tener conocimientos muy amplios de SQL para hacer un ataque de SQL injection fácil o intermedio en un test de penetración. Ahora bien, aprender más sobre este lenguaje es útil para entender y prevenir ataques más avanzados.
Métodos manuales simples
Si, durante un test de penetración, estás navegando de forma manual y deseas probar si puedes hacer alguno de los tipos de inyección SQL que mencionamos anteriormente, hay algunos métodos simples para hacerlo.
El primer test consiste en enviar una comilla simple como input, es decir: ‘
Si la entrada es vulnerable, se producirá un error en la aplicación.
El siguiente test consiste en enviar el siguiente valor:1′ and ‘1’=’1
Si el input se ejecuta con normalidad, quiere decir que se está inyectando código SQL, ya que el parámetro ‘1’=’1′ es verdadero y se cumple siempre.
Para corroborar, envía el comando:1′ and ‘1’=’0
Si el input NO se ejecuta, habremos confirmado que se puede inyectar código SQL en la entrada, ya que el parámetro ‘1’=’0′ es falso y, por eso, el input no se habría ejecutado.
Algunos ejemplos de inyección SQL:
•Ejemplo de inyección SQL
Cómo proteger un sitio web o aplicación de ataques de inyección SQL
Los desarrolladores pueden evitar vulnerabilidades de inyección SQL en aplicaciones web mediante la utilización de consultas de bases de datos parametrizadas con parámetros vinculados y tipificados y uso cuidadoso de procedimientos almacenados parametrizados en la base de datos.
Esto se puede lograr en una variedad de lenguajes de programación, incluido Java, .NET, PHP y más.
Consulte los siguientes recursos para implementar consultas de bases de datos parametrizadas y prevenir la inyección de SQL en su base de código:
⋅Hoja de trucos de prevención de inyección de OWASP SQL
⋅Hoja de trucos de parametrización de consultas OWASPAdemás, los desarrolladores, administradores de sistemas y administradores de bases de datos pueden tomar medidas adicionales para minimizar los ataques o el impacto de ataques exitosos:
Valide la entrada suministrada por el usuario para los tipos de datos esperados, incluidos los campos de entrada como menús desplegables o botones de radio, no solo los campos que permiten a los usuarios escribir la entrada.
Filtrado de entrada para detener la inyección SQL
Un error común es que el filtrado y escape de entrada pueden evitar la inyección SQL. Si bien el filtrado de entrada puede ayudar a detener los ataques más triviales, no corrige la vulnerabilidad subyacente.
En muchos casos, los atacantes pueden evadir el filtrado de entrada dejando vulnerable su aplicación web a pesar de los intentos de, por ejemplo, denegar la lista de ciertos caracteres en un formulario web.



