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.



esquema_sql_injection




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

Confidencialidad. De forma habitual, las bases de datos almacenan información sensible, por lo que la pérdida de confiabilidad es un problema muy frecuente en aquellos sitios que son vulnerables a este tipo de ataques.
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:

Inyección SQL basada en errores: Este tipo de inyección SQL aprovecha errores en el código SQL para obtener información. Por ejemplo, si una consulta devuelve un error con un mensaje específico, se puede utilizar ese mensaje para obtener información adicional del sistema.

•Inyección SQL basada en tiempo: Este tipo de inyección SQL utiliza una consulta que tarda mucho tiempo en ejecutarse para obtener información. Por ejemplo, si se utiliza una consulta que realiza una búsqueda en una tabla y se añade un retardo en la consulta, se puede utilizar ese retardo para obtener información adicional

Inyección SQL basada en booleanos: Este tipo de inyección SQL utiliza consultas con expresiones booleanas para obtener información adicional. Por ejemplo, se puede utilizar una consulta con una expresión booleana para determinar si un usuario existe en una base de datos.

•Inyección SQL basada en uniones: Este tipo de inyección SQL utiliza la cláusula “UNION” para combinar dos o más consultas en una sola. Por ejemplo, si se utiliza una consulta que devuelve información sobre los usuarios y se agrega una cláusula “UNION” con otra consulta que devuelve información sobre los permisos, se puede obtener información adicional sobre los permisos de los usuarios.

•Inyección SQL basada en stacked queries: Este tipo de inyección SQL aprovecha la posibilidad de ejecutar múltiples consultas en una sola sentencia para obtener información adicional. Por ejemplo, se puede utilizar una consulta que inserta un registro en una tabla y luego agregar una consulta adicional que devuelve información sobre la tabla.


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.

SQLmap es un programa de código abierto que viene instalado en Kali Linux y permite hacer miles de pruebas con el fin de encontrar fallos de inyección SQL en aplicaciones web. Adicionalmente, SQLmap provee los diferentes payloads que se pueden ejecutar para explotar las consultas vulnerables. De este modo, es una herramienta que hace la mayor parte del trabajo técnico por el pentester, que solo debe preocuparse por examinar la aplicación y aprender a usar este software.
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.

Pangolin: Se trata de una herramienta de pago que ofrece más posibilidades que la vista en el punto anterior y que está destinada a descubrir vulnerabilidades tanto del tipo inyección SQL como inyección SQL ciego.

SQLiHelper 2.7 SQL Injection: Se trata de una aplicación cuyo objetivo es facilitar la extracción de información procedente de bases de datos utilizando para ello técnicas de inyección SQL. Una vez indicada la url que queremos analizar, la aplicación realizará peticiones inyectando código SQL con el fin de comprobar si es realmente vulnerable.


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:

Pruebas OWASP para 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:

OWASP: inyección SQL
Hoja de trucos de prevención de inyección de OWASP SQL
Hoja de trucos de parametrización de consultas OWASP

Ademá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: 

⋅Mantenga actualizados todos los componentes del software de aplicaciones web, incluidas las bibliotecas, complementos, marcos, software de servidor web y software de servidor de bases de datos con los últimos parches de seguridad disponibles de los proveedores.

⋅Utilizar el principio de menor privilegio al aprovisionar cuentas utilizadas para conectarse a la base de datos SQL. Por ejemplo, si un sitio web solo necesita recuperar contenido web de una base de datos utilizando declaraciones SELECT, no otorgue a las credenciales de conexión de la base de datos del sitio web otros privilegios como INSERT, UPDATE, o privilegios de DELETE. En muchos casos, estos privilegios se pueden administrar utilizando los roles de base de datos apropiados para las cuentas.  

⋅Nunca permita que su aplicación web se conecte a la base de datos con privilegios de administrador ( la cuenta "sa" en Microsoft SQL Server, por ejemplo ).

⋅No utilice cuentas de bases de datos compartidas entre diferentes sitios web o aplicaciones.
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.

⋅Configure los informes y el manejo de errores adecuados en el servidor web y en el código para que los mensajes de error de la base de datos nunca se envíen al navegador web del cliente. Los atacantes pueden aprovechar los detalles técnicos en mensajes de error detallados para ajustar sus consultas para una explotación exitosa.

⋅Procedimientos almacenados: pueden encapsular las instrucciones SQL y tratar todas las entradas como parámetros.

⋅Instrucciones preparadas: instrucciones preparadas para funcionar creando primero la instrucción SQL y luego tratando todos los datos de usuario enviados como parámetros. Esto no tiene ningún efecto en la sintaxis de la instrucción SQL.

⋅Expresiones regulares: se pueden usar para detectar código dañino potencial y eliminarlo antes de ejecutar las instrucciones SQL.



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.

No hay comentarios:

Publicar un comentario