El SQL injection es uno de los tipos más comunes de técnicas de hacking web que se utilizan hoy en día. A medida que las filtraciones de datos siguen ocurriendo a algunas de las corporaciones y marcas de más alto perfil, se ha vuelto más importante que los usuarios de la web se adapten a estas crecientes filtraciones con cambios en el comportamiento como las contraseñas generadas por el sistema y el 2FA.
¿Qué es la inyección SQL?
El SQL injection, o SQLi, es un ataque en el que se inserta o "inyecta" una consulta SQL a través de los datos de entrada de un cliente a una aplicación. La mejor manera de describirlo es que un atacante interfiera en las consultas que una aplicación hace a su base de datos. Estas consultas ocurren principalmente con aplicaciones PHP y ASP debido a su prevalencia de funcionalidad antigua, mientras que las aplicaciones J2EE y ASP.NET son menos propensas a tener inyecciones SQL fáciles de explotar.
Este tipo de inyección puede permitir a un atacante ver datos que no están destinados a recuperar, como registros de clientes, propiedad intelectual o información personal. La inyección SQL puede llevar a un atacante a realizar cualquiera de las siguientes acciones
- Localizar credenciales de administrador
- Elevar los privilegios
- Comprometer la infraestructura de back-end
- Spoofing
- Manipulación
- Repudio
- Revelación de información sensible
- Ataques de denegación de servicio (DoS).
¿Cómo se producen los ataques de inyección SQL?
Este tipo de ataque suele realizarse a través de una página web o de la entrada de una aplicación. Si una aplicación web no valida los valores recibidos de un formulario web, una cookie, un parámetro de entrada, etc., antes de pasarlos por consultas SQL, se ejecutan en un servidor de base de datos. Si no hay una validación de entrada adecuada, un atacante puede manipular la entrada para que los datos se interpreten como código, en lugar de como datos.
Un ejemplo reciente de una inyección SQL está asociado a una vulnerabilidad encontrada en el plugin conocido como Kaswara Modern WPBakery Page Builder.
Ataques SQLi más comunes
En definitiva, los ataques de inyección SQL pueden variar dependiendo de la habilidad e imaginación del atacante. A continuación se presentan algunos ejemplos de algunos de los más comunes encontrados:
Ataques UNION
Este tipo de inyección SQL es el método más popular realizado por los atacantes. Esta técnica de inyección permite que un ataque recupere datos de diferentes tablas de la base de datos extendiendo los resultados de la consulta original utilizando la palabra clave UNION. Por ejemplo:
SELECT a, b FROM tabla1 UNION SELECT c, d FROM tabla2
Cuando un atacante puede determinar cuántas columnas se devuelven de la consulta original y cuáles son de un tipo de datos apropiado que contienen resultados de la consulta inyectada, el ataque tiene éxito.
Inyección SQL ciega
Este ataque suele ser más sofisticado y más difícil de realizar que otras formas de inyección. Los resultados de la consulta SQL no se devuelven en las respuestas de la aplicación. Tampoco los detalles de los errores de la base de datos. Estas vulnerabilidades ciegas pueden ser explotadas para acceder a datos no autorizados. Cuando se reciben mensajes de error genéricos del objetivo, el atacante realiza inyecciones SQL ciegas. Este método de recuperación de información de la base de datos se considera único, en comparación con una inyección SQL normal.
Basándose en una respuesta a preguntas de verdadero o falso, un atacante es capaz de determinar la respuesta basándose en la respuesta recibida. Se fijan en el tiempo que se tarda en recuperar una respuesta del servidor y realizan ataques basados en el tiempo.
Inyección SQL basada en booleanos
Las inyecciones SQL basadas en booleanos se basan en el envío de una consulta SQL a una base de datos, y obliga a una aplicación a devolver diferentes resultados, dependiendo de si el resultado es verdadero o falso. Si una aplicación es vulnerable a las inyecciones SQL no se devolverá nada, y entonces se inyectará una consulta con una condición verdadera (1=1). Si se devuelve una condición falsa pero el contenido de la página es diferente, un atacante puede deducir que la inyección SQL funciona.
Esta técnica de inyección se utiliza con frecuencia para probar la vulnerabilidad de una aplicación..
Inyección SQL basada en errores
Con una inyección SQL basada en errores, los atacantes explotarán los errores de la base de datos de una página web o de una aplicación que se desencadena por entradas no sanitizadas. Esta técnica utiliza los mensajes de error para devolver los resultados completos de la consulta, y revela información clasificada de una base de datos. El método puede utilizarse para identificar si un sitio o aplicación web es vulnerable, y para recuperar datos ocultos adicionales para reestructurar las consultas maliciosas.
Inyección SQL basada en el tiempo
Durante una Inyección SQL normal, los malhechores pueden simplemente examinar la base de datos como información (como la versión y la estructura), devuelta sobre el texto. Sin embargo, cuando los delincuentes no pueden recuperar información de una base de datos, pueden desplegar inyecciones SQL basadas en el tiempo para lograr resultados exitosos. Esto funciona utilizando operaciones que tardan mucho tiempo en completarse, a menudo muchos segundos.
Estas inyecciones se utilizan normalmente para determinar si existen vulnerabilidades en una aplicación web o en un sitio web, así como en combinación con técnicas basadas en booleanos durante las inyecciones SQL ciegas.
¿Cómo se pueden detectar las inyecciones SQL?
Para identificar una inyección SQL, primero tendrá que identificar dónde se encuentra la vulnerabilidad lanzando un escaneo o ejecutando una herramienta de ataque de inyección SQL automatizada. Herramientas como Havij, SQLmap o jSQL deberían poder ayudar a identificar el código vulnerable. Una vez identificadas las vulnerabilidades, tendrá que eliminar las inyecciones maliciosas o hacer que un equipo las limpie por usted.
Una vez eliminado el código, deberá asegurarse de que todas las bases de datos, aplicaciones, sistemas de terceros o cualquier otro componente obsoleto se parcheen y actualicen regularmente. También tendrá que actualizar todas las contraseñas una vez que se hayan parcheado las vulnerabilidades, utilizando caracteres fuertes, naturalmente. Además, la configuración de una herramienta que supervise periódicamente las sentencias SQL fraudulentas mediante el análisis del comportamiento y/o el aprendizaje automático también puede ayudar a detectar indicadores de compromiso (IoC) en el futuro.
¿Cómo se pueden prevenir las inyecciones SQL?
Estos ataques pueden remediarse utilizando una validación de entrada adecuada y sentencias preparadas con consultas parametrizadas, en lugar de la concatenación de cadenas dentro de la consulta. Para que las consultas parametrizadas sean eficaces en la prevención de inyecciones SQL, la cadena utilizada en la consulta debe ser una constante codificada y no puede contener datos variables de ningún origen.
Otra medida preventiva es el uso de procedimientos almacenados, que complican a los atacantes la ejecución de SQL malicioso. Esto se debe a que los procedimientos almacenados no pueden ser insertados dinámicamente dentro de las consultas.
También es importante no confiar nunca en los datos enviados por el usuario. Es beneficioso realizar una validación de la lista de permitidos para probar la entrada del usuario contra un conjunto existente de entradas conocidas, aprobadas y definidas. Si se reciben datos que no cumplen los criterios asignados, se rechazan. Esto evita que se produzcan inyecciones maliciosas en la aplicación o el sitio web.
Además, es importante establecer los privilegios a un mínimo absoluto para todas las cuentas. Este principio garantiza la mitigación de las amenazas a la seguridad del sitio web. Sólo debe conceder privilegios cuando sea necesario, y no asignar privilegios de administrador a las cuentas de la aplicación.
Los fallos de inyección SQL surgen cuando las consultas a la base de datos incluyen información suministrada por el usuario. Por ello, las consultas dinámicas deben evitarse en la medida de lo posible. La prioridad general debería ser evitar que la entrada suministrada por el usuario que contiene SQL malicioso afecte a la lógica de la consulta ejecutada.
Lo último que hay que tener en cuenta a la hora de protegerse contra las inyecciones SQL es implementar un cortafuegos de aplicaciones web. Los cortafuegos filtran las solicitudes peligrosas, incluidas las que son intentos de inyección SQL.
En conclusión
Definitivamente hay muchos factores a considerar cuando se trata de este tipo de ataques, y puede llegar a ser extremadamente abrumador para una empresa cuando esto ocurre. Dado que permanecer oculto es una prioridad para la mayoría de los atacantes, averiguar si se es víctima de un ataque puede ser complicado. Con las herramientas adecuadas en su arsenal de seguridad, puede averiguarlo, superar el ataque y evitar que se repita.
Fuente: https://blog.sucuri.net/2022/01/understanding-website-sql-injections.html?web_view=true