stringtranslate.com

Inyección SQL

Clasificación de los vectores de ataque de inyección SQL en 2010
Una clasificación de los vectores de ataque de inyección SQL a partir de 2010

En informática, la inyección SQL es una técnica de inyección de código utilizada para atacar aplicaciones basadas en datos, en la que se insertan sentencias SQL maliciosas en un campo de entrada para su ejecución (por ejemplo, para volcar el contenido de la base de datos al atacante). [1] [2] La inyección SQL debe explotar una vulnerabilidad de seguridad en el software de una aplicación, por ejemplo, cuando la entrada del usuario se filtra incorrectamente para caracteres de escape de literales de cadena incrustados en sentencias SQL o la entrada del usuario no está fuertemente tipada y se ejecuta inesperadamente. La inyección SQL se conoce principalmente como un vector de ataque para sitios web, pero se puede utilizar para atacar cualquier tipo de base de datos SQL.

Los ataques de inyección SQL permiten a los atacantes suplantar la identidad, manipular datos existentes , provocar problemas de repudio como anular transacciones o cambiar saldos, permitir la divulgación completa de todos los datos del sistema, destruir los datos o hacer que no estén disponibles de otro modo y convertirse en administradores del servidor de base de datos. Las bases de datos NoSQL orientadas a documentos también pueden verse afectadas por esta vulnerabilidad de seguridad. [3]

En un estudio de 2012, se observó que la aplicación web promedio recibía cuatro campañas de ataque por mes y los minoristas recibían el doble de ataques que otras industrias. [4]

Historia

Las discusiones sobre la inyección SQL, como un artículo de 1998 en Phrack Magazine , comenzaron a fines de la década de 1990. [5] La inyección SQL fue considerada una de las 10 principales vulnerabilidades de aplicaciones web de 2007 y 2010 por el Open Web Application Security Project . [6] En 2013, la inyección SQL fue calificada como el ataque número uno en el top ten de OWASP. [7]

Causas fundamentales

La inyección SQL es una vulnerabilidad de seguridad común que surge cuando se permite que los datos proporcionados por un atacante se conviertan en código SQL. Esto sucede cuando los programadores ensamblan consultas SQL ya sea por interpolación de cadenas o concatenando comandos SQL con datos proporcionados por el usuario.

Sentencias SQL construidas incorrectamente

Esta forma de inyección se basa en el hecho de que las sentencias SQL constan tanto de datos utilizados por la sentencia SQL como de comandos que controlan cómo se ejecuta la sentencia SQL. Por ejemplo, en la sentencia SQL, la cadena ' ' es un dato y el fragmento es un ejemplo de un comando (el valor también es un dato en este ejemplo).select * from person where name = 'susan' and age = 2susanand age = 22

La inyección SQL se produce cuando el programa receptor procesa una entrada de usuario especialmente diseñada de forma que permite que la entrada salga de un contexto de datos e ingrese a un contexto de comando. Esto permite al atacante alterar la estructura de la instrucción SQL que se ejecuta.

Como ejemplo simple, imaginemos que los datos ' susan' en la declaración anterior fueron proporcionados por el usuario. El usuario ingresó la cadena ' susan' (sin los apóstrofos) en un campo de ingreso de texto de un formulario web, y el programa utilizó declaraciones de concatenación de cadenas para formar la declaración SQL anterior a partir de los tres fragmentos , la entrada del usuario de ' ' y .select * from person where name='susan' and age = 2

Ahora imaginemos que en lugar de introducir ' susan' el atacante ingresó .' or 1=1; --

El programa utilizará el mismo enfoque de concatenación de cadenas con los 3 fragmentos de , la entrada del usuario de y y construirá la declaración . Muchas bases de datos ignorarán el texto después de la cadena '--' ya que esto denota un comentario. La estructura del comando SQL es ahora y esto seleccionará todas las filas de personas en lugar de solo aquellas llamadas 'susan' cuya edad es 2. El atacante ha logrado crear una cadena de datos que sale del contexto de datos e ingresa a un contexto de comando.select * from person where name='' or 1=1; --' and age = 2select * from person where name='' or 1=1; -- and age = 2select * from person where name='' or 1=1;

A continuación se presenta un ejemplo más complejo.

Imagine que un programa crea una declaración SQL utilizando el siguiente comando de asignación de cadena:

var statement = "SELECT * FROM users WHERE name = '" + userName + "'";

Este código SQL está diseñado para extraer los registros del nombre de usuario especificado de su tabla de usuarios. Sin embargo, si un usuario malintencionado crea la variable "userName" de una manera específica, la instrucción SQL puede hacer más de lo que pretendía el autor del código. Por ejemplo, configurar la variable "userName" como:

' O '1'='1

o usar comentarios para bloquear el resto de la consulta (hay tres tipos de comentarios SQL [8] ). Las tres líneas tienen un espacio al final:

' O '1'='1' --' O '1'='1' {' O '1'='1' /*

Representa una de las siguientes declaraciones SQL mediante el lenguaje principal:

SELECCIONAR * DE usuarios DONDE nombre = '' O '1' = '1' ;         
SELECCIONAR * DE usuarios DONDE nombre = '' O '1' = '1' -- ';          

Si este código se utilizara en un procedimiento de autenticación, entonces este ejemplo podría usarse para forzar la selección de cada campo de datos (*) de todos los usuarios en lugar de un nombre de usuario específico como lo pretendía el codificador, porque la evaluación de '1'='1' siempre es verdadera.

El siguiente valor de "userName" en la declaración a continuación provocaría la eliminación de la tabla "users" así como la selección de todos los datos de la tabla "userinfo" (en esencia, revelando la información de cada usuario), utilizando una API que permite múltiples declaraciones:

a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't

Esta entrada representa la declaración SQL final de la siguiente manera y se especifica:

SELECCIONAR * DE usuarios DONDE nombre = 'a' ; ELIMINAR TABLA usuarios ; SELECCIONAR * DE información del usuario DONDE 't' = 't' ;                 

Si bien la mayoría de las implementaciones de SQL Server permiten ejecutar varias sentencias con una sola llamada de esta manera, algunas API de SQL, como la función de PHP,mysql_query() no lo permiten por razones de seguridad. Esto evita que los atacantes inyecten consultas completamente independientes, pero no les impide modificarlas.

Inyección SQL a ciegas

La inyección SQL ciega se utiliza cuando una aplicación web es vulnerable a una inyección SQL, pero los resultados de la inyección no son visibles para el atacante. La página con la vulnerabilidad puede no ser una que muestre datos, pero se mostrará de forma diferente según los resultados de una declaración lógica inyectada en la declaración SQL legítima solicitada para esa página. Este tipo de ataque se ha considerado tradicionalmente que requiere mucho tiempo porque se necesita crear una nueva declaración para cada bit recuperado y, según su estructura, el ataque puede consistir en muchas solicitudes fallidas. Los avances recientes han permitido que cada solicitud recupere varios bits, sin solicitudes fallidas, lo que permite una extracción más consistente y eficiente. [9] Hay varias herramientas que pueden automatizar estos ataques una vez que se ha establecido la ubicación de la vulnerabilidad y la información del objetivo. [10]

Respuestas condicionales

Un tipo de inyección SQL ciega obliga a la base de datos a evaluar una declaración lógica en una pantalla de aplicación normal. Por ejemplo, un sitio web de reseñas de libros utiliza una cadena de consulta para determinar qué reseña de libros mostrar. Por lo tanto, la URL https://books.example.com/review?id=5 haría que el servidor ejecutara la consulta.

SELECCIONAR * DE reseñas de libros DONDE ID = '5' ;       

desde donde rellenaría la página de reseñas con datos de la reseña con ID 5, almacenada en la tabla bookreviews. La consulta se realiza completamente en el servidor; el usuario no conoce los nombres de la base de datos, la tabla o los campos, ni tampoco conoce la cadena de consulta. El usuario solo ve que la URL anterior devuelve una reseña de un libro. Un hacker puede cargar las URL y , lo que puede generar consultas.https://books.example.com/review?id=5' OR '1'='1https://books.example.com/review?id=5' AND '1'='2

SELECCIONAR * DE reseñas de libros DONDE ID = '5' O '1' = '1' ; SELECCIONAR * DE reseñas de libros DONDE ID = '5' Y '1' = '2' ;                  

respectivamente. Si la reseña original se carga con la URL "1=1" y se devuelve una página en blanco o con error desde la URL "1=2", y la página devuelta no se ha creado para alertar al usuario de que la entrada no es válida, o en otras palabras, ha sido detectada por un script de prueba de entrada, es probable que el sitio sea vulnerable a un ataque de inyección SQL ya que la consulta probablemente se habrá realizado correctamente en ambos casos. El hacker puede proceder con esta cadena de consulta diseñada para revelar el número de versión de MySQL que se ejecuta en el servidor: , que mostraría la reseña del libro en un servidor que ejecuta MySQL 4 y una página en blanco o con error en caso contrario. El hacker puede seguir utilizando código dentro de las cadenas de consulta para lograr su objetivo directamente, o para obtener más información del servidor con la esperanza de descubrir otra vía de ataque. [11] [12]https://books.example.com/review?id=5 AND substring(@@version, 1, INSTR(@@version, '.') - 1)=4

Inyección SQL de segundo orden

La inyección SQL de segundo orden se produce cuando los valores enviados contienen comandos maliciosos que se almacenan en lugar de ejecutarse inmediatamente. En algunos casos, la aplicación puede codificar correctamente una sentencia SQL y almacenarla como SQL válido. Luego, otra parte de esa aplicación sin controles para protegerse contra la inyección SQL podría ejecutar esa sentencia SQL almacenada. Este ataque requiere un mayor conocimiento de cómo se utilizan posteriormente los valores enviados. Los escáneres de seguridad de aplicaciones web automatizados no detectarían fácilmente este tipo de inyección SQL y es posible que se les deba indicar manualmente dónde buscar evidencia de que se está intentando.

Mitigación

Una inyección SQL es un ataque muy conocido y se puede prevenir fácilmente con medidas sencillas. Después de un aparente ataque de inyección SQL en TalkTalk en 2015, la BBC informó que los expertos en seguridad estaban atónitos de que una empresa tan grande fuera vulnerable a él. [13] Técnicas como la comparación de patrones, las pruebas de software y el análisis gramatical son algunas formas comunes de mitigar estos ataques. [2]

Escapando

La forma más sencilla de evitar las inyecciones es escapar todos los caracteres que tienen un significado especial en SQL. El manual de un DBMS SQL explica qué caracteres tienen un significado especial, lo que permite crear una lista negra completa de caracteres que necesitan traducción. Por ejemplo, cada aparición de una comilla simple ( ') en un parámetro de cadena debe ir precedida de una barra invertida ( \) para que la base de datos entienda que la comilla simple es parte de una cadena dada, en lugar de su terminador. PHP proporciona la mysqli_real_escape_string()función para escapar cadenas de acuerdo con la semántica de MySQL ; el siguiente ejemplo parametriza una consulta SQL escapando los parámetros de nombre de usuario y contraseña:

$mysqli  =  new  mysqli ( 'nombre_de_host' ,  'nombre_de_usuario_bd' ,  'contraseña_bd' ,  'nombre_de_bd' ); $consulta  =  sprintf ( "SELECCIONAR * DE `Usuarios` DONDE Nombre_de_usuario='%s' Y Contraseña='%s'" ,  $mysqli -> real_escape_string ( $nombre_de_usuario ),  $mysqli -> real_escape_string ( $contraseña )); $mysqli -> consulta ( $consulta );

Depender únicamente del programador para escapar diligentemente todos los parámetros de consulta presenta riesgos inherentes, dada la posibilidad de que se produzcan descuidos en el proceso. Para mitigar esta vulnerabilidad, los programadores pueden optar por desarrollar sus propias capas de abstracción para automatizar el escape de parámetros. [14]

Mapeadores relacionales de objetos

Los marcos de mapeo relacional de objetos (ORM) como Hibernate y ActiveRecord proporcionan una interfaz orientada a objetos para consultas sobre una base de datos relacional. La mayoría de los ORM, si no todos, manejan automáticamente el escape necesario para prevenir ataques de inyección SQL, como parte de la API de consulta del marco. Sin embargo, muchos ORM brindan la capacidad de eludir sus funciones de mapeo y emitir sentencias SQL sin formato; el uso inadecuado de esta funcionalidad puede introducir la posibilidad de un ataque de inyección. [15]

Declaraciones parametrizadas

En la mayoría de las plataformas de desarrollo, se pueden utilizar sentencias parametrizadas que funcionan con parámetros (a veces llamadas marcadores de posición o variables de enlace ) en lugar de incrustar la entrada del usuario en la sentencia. Un marcador de posición solo puede almacenar un valor del tipo dado y no un fragmento SQL arbitrario. Por lo tanto, la inyección SQL simplemente se trataría como un valor de parámetro extraño (y probablemente inválido). En muchos casos, la sentencia SQL es fija y cada parámetro es un escalar , no una tabla . Luego, la entrada del usuario se asigna (se enlaza) a un parámetro. [16]

Comprobación de patrones

Se pueden comprobar los parámetros de cadena de tipo entero, flotante o booleano para determinar si su valor es una representación válida del tipo dado. También se pueden comprobar las cadenas que deben cumplir con un patrón o condición específicos (por ejemplo, fechas, UUID , números de teléfono) para determinar si se cumple dicho patrón.

Permisos de base de datos

Limitar los permisos de inicio de sesión de la base de datos utilizada por la aplicación web únicamente a lo necesario puede ayudar a reducir la efectividad de cualquier ataque de inyección SQL que explote cualquier error en la aplicación web.

Por ejemplo, en Microsoft SQL Server , se podría restringir el inicio de sesión en una base de datos para seleccionar algunas de las tablas del sistema, lo que limitaría los exploits que intentan insertar JavaScript en todas las columnas de texto de la base de datos.

denegar la selección de sys . sysobjects a webdatabaselogon ; denegar la selección de sys . objects a webdatabaselogon ; denegar la selección de sys . tables a webdatabaselogon ; denegar la selección de sys . views a webdatabaselogon ; denegar la selección de sys . packages a webdatabaselogon ;                         

Ejemplos

En la cultura popular

Véase también

Referencias

  1. ^ Microsoft. "Inyección SQL". Archivado desde el original el 2 de agosto de 2013. Consultado el 4 de agosto de 2013. La inyección SQL es un ataque en el que se inserta código malicioso en cadenas que luego se pasan a una instancia de SQL Server para su análisis y ejecución. Cualquier procedimiento que construya sentencias SQL debe revisarse para detectar vulnerabilidades de inyección porque SQL Server ejecutará todas las consultas sintácticamente válidas que reciba. Incluso los datos parametrizados pueden ser manipulados por un atacante hábil y decidido.
  2. ^ ab Zhuo, Z.; Cai, T.; Zhang, X.; Lv, F. (abril de 2021). "Memoria a corto plazo larga en árbol de sintaxis abstracta para detección de inyección SQL". IET Software . 15 (2): 188–197. doi :10.1049/sfw2.12018. ISSN  1751-8806. S2CID  233582569.
  3. ^ "Hacking NodeJS y MongoDB | Blog de Websecurify" . Consultado el 15 de noviembre de 2023 .
  4. ^ Imperva (julio de 2012). "Informe de ataques a aplicaciones web de Imperva" (PDF) . Archivado desde el original (PDF) el 7 de septiembre de 2013. Consultado el 4 de agosto de 2013. Los minoristas sufren el doble de ataques de inyección SQL que otras industrias . / Si bien la mayoría de las aplicaciones web reciben 4 o más campañas de ataques web por mes, algunos sitios web están constantemente bajo ataque. / Un sitio web observado estuvo bajo ataque 176 de 180 días, o el 98 % del tiempo.
  5. ^ Jeff Forristal (firma como rain.forest.puppy) (25 de diciembre de 1998). "NT Web Technology Vulnerabilities". Revista Phrack . 8 (54 (artículo 8)). Archivado desde el original el 19 de marzo de 2014.
  6. ^ "Categoría:Proyecto Top Ten de OWASP". OWASP. Archivado desde el original el 19 de mayo de 2011. Consultado el 3 de junio de 2011 .
  7. ^ "Categoría:Proyecto Top Ten de OWASP". OWASP. Archivado desde el original el 9 de octubre de 2013. Consultado el 13 de agosto de 2013 .
  8. ^ "Cómo introducir comentarios SQL" (PDF) , IBM Informix Guide to SQL: Syntax , IBM, págs. 13-14, archivado desde el original (PDF) el 24 de febrero de 2021 , consultado el 4 de junio de 2018
  9. ^ "Extracción de múltiples bits por solicitud de vulnerabilidades de inyección SQL a ciegas". Hack All The Things. Archivado desde el original el 8 de julio de 2016 . Consultado el 8 de julio de 2016 .
  10. ^ "Uso de SQLBrute para extraer datos mediante fuerza bruta desde un punto de inyección SQL ciego". Justin Clarke. Archivado desde el original el 14 de junio de 2008. Consultado el 18 de octubre de 2008 .
  11. ^ macd3v. «Tutorial de inyección SQL a ciegas». Archivado desde el original el 14 de diciembre de 2012. Consultado el 6 de diciembre de 2012 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  12. ^ Andrey Rassokhin; Dmitry Oleksyuk. «Botnet TDSS: divulgación completa». Archivado desde el original el 9 de diciembre de 2012. Consultado el 6 de diciembre de 2012 .
  13. ^ "Preguntas para TalkTalk - BBC News". BBC News . 26 de octubre de 2015. Archivado desde el original el 26 de octubre de 2015 . Consultado el 26 de octubre de 2015 .
  14. ^ "Capa de consulta transparente para MySQL". Roberto Eisele. 8 de noviembre de 2010.
  15. ^ "Ataques de inyección SQL y prevención: guía completa". appsecmonkey.com . 13 de febrero de 2021 . Consultado el 24 de febrero de 2021 .
  16. ^ "Hoja de trucos para la prevención de inyecciones SQL". Proyecto de seguridad de aplicaciones web abiertas. Archivado desde el original el 20 de enero de 2012. Consultado el 3 de marzo de 2012 .
  17. ^ "Las conjeturas plagan los informes de agujeros en la Web". SecurityFocus . 6 de marzo de 2002. Archivado desde el original el 9 de julio de 2012.
  18. ^ "WHID 2005-46: Adolescente utiliza inyección SQL para acceder al sitio web de una revista de seguridad". Consorcio de Seguridad de Aplicaciones Web. 1 de noviembre de 2005. Archivado desde el original el 17 de enero de 2010. Consultado el 1 de diciembre de 2009 .
  19. ^ "WHID 2006-3: piratas informáticos rusos irrumpieron en un sitio web del gobierno de Rhode Island". Consorcio de Seguridad de Aplicaciones Web. 13 de enero de 2006. Archivado desde el original el 13 de febrero de 2011. Consultado el 16 de mayo de 2008 .
  20. ^ "Hackers anti-EE.UU. se infiltran en servidores del ejército". Information Week . 29 de mayo de 2009. Archivado desde el original el 20 de diciembre de 2016 . Consultado el 17 de diciembre de 2016 .
  21. ^ Alex Papadimoulis (15 de abril de 2008). «Oklahoma filtra decenas de miles de números de la Seguridad Social y otros datos confidenciales». The Daily WTF . Archivado desde el original el 10 de mayo de 2008. Consultado el 16 de mayo de 2008 .
  22. ^ "Hombre estadounidense 'robó 130 millones de números de tarjetas'". BBC. 17 de agosto de 2009. Archivado desde el original el 18 de agosto de 2009. Consultado el 17 de agosto de 2009 .
  23. ^ "El ataque a The Pirate Bay". 7 de julio de 2010. Archivado desde el original el 24 de agosto de 2010.
  24. ^ "¿Las Little Bobby Tables migraron a Suecia?". Alicebobandmallory.com. Archivado desde el original el 1 de julio de 2012. Consultado el 3 de junio de 2011 .
  25. ^ "Sitio web de la Marina Real atacado por un hacker rumano". BBC News. 8 de noviembre de 2010. Archivado desde el original el 9 de noviembre de 2010. Consultado el 15 de noviembre de 2023 .
  26. ^ Sam Kiley (25 de noviembre de 2010). «Supervirus: un objetivo para los ciberterroristas». Archivado desde el original el 28 de noviembre de 2010. Consultado el 25 de noviembre de 2010 .
  27. ^ "Hacker entra en la base de datos de Barracuda Networks". Archivado desde el original el 27 de julio de 2011.
  28. ^ "información sobre intrusión de contraseña de usuario del sitio". Dslreports.com. Archivado desde el original el 18 de octubre de 2012. Consultado el 3 de junio de 2011 .
  29. ^ "DSLReports dice que robaron información de miembros". Cnet News. 28 de abril de 2011. Archivado desde el original el 21 de marzo de 2012. Consultado el 29 de abril de 2011 .
  30. ^ "La filtración de datos de DSLReports.com expuso más de 100.000 cuentas". The Tech Herald. 29 de abril de 2011. Archivado desde el original el 30 de abril de 2011. Consultado el 29 de abril de 2011 .
  31. ^ "LulzSec hackea a Sony Pictures y revela 1 millón de contraseñas sin protección", electronista.com , 2 de junio de 2011, archivado desde el original el 6 de junio de 2011 , consultado el 3 de junio de 2011
  32. ^ "Imperva.com: PBS hackeado - Cómo probablemente lo hicieron los hackers". Archivado desde el original el 29 de junio de 2011. Consultado el 1 de julio de 2011 .
  33. ^ Ngak, Chenda. "Según se informa, Yahoo fue hackeado: ¿Está segura su cuenta?". CBS News . Archivado desde el original el 14 de julio de 2012. Consultado el 16 de julio de 2012 .
  34. ^ Yap, Jamie (12 de julio de 2012). «Se filtraron 450.000 contraseñas de usuarios en una filtración de Yahoo». ZDNet . Archivado desde el original el 2 de julio de 2014. Consultado el 18 de febrero de 2017 .
  35. ^ Perlroth, Nicole (3 de octubre de 2012). "Hackers atacan 53 universidades y publican miles de registros personales en Internet". The New York Times . Archivado desde el original el 5 de octubre de 2012.
  36. ^ Kovacs, Eduard (4 de noviembre de 2013). «Hackers filtran datos supuestamente robados del sitio web de la Cámara de Comercio china». Softpedia News . Archivado desde el original el 2 de marzo de 2014. Consultado el 27 de febrero de 2014 .
  37. ^ Damon Poeter. Una banda de hackers rusos muy unida acumula 1.200 millones de credenciales de identidad Archivado el 14 de julio de 2017 en Wayback Machine , PC Magazine , 5 de agosto de 2014
  38. ^ Nicole Perlroth. Una banda rusa acumula más de mil millones de contraseñas de Internet Archivado el 27 de febrero de 2017 en Wayback Machine , The New York Times , 5 de agosto de 2014.
  39. ^ "TalkTalk recibe una multa récord de 400.000 libras por no haber evitado el ataque de octubre de 2015". 5 de octubre de 2016. Archivado desde el original el 24 de octubre de 2016 . Consultado el 23 de octubre de 2016 .
  40. ^ Goodin, Dan (2 de marzo de 2021). "El error de codificación de un novato antes del hackeo de Gab provino del director de tecnología del sitio". Ars Technica .
  41. ^ Goodin, Dan (8 de marzo de 2021). "Gab, un refugio para las teorías conspirativas a favor de Trump, ha sido hackeado nuevamente". Ars Technica .
  42. ^ Munroe, Randall. «XKCD: Exploits of a Mom». Archivado desde el original el 25 de febrero de 2013. Consultado el 26 de febrero de 2013 .
  43. ^ "La guía de Bobby Tables para la inyección SQL". 15 de septiembre de 2009. Archivado desde el original el 7 de noviembre de 2017. Consultado el 30 de octubre de 2017 .
  44. ^ "Jego firma ma w nazwie inyección SQL. Nie zazdrościmy tym, którzy będą go fakturowali;)". Niebezpiecznik (en polaco). 11 de septiembre de 2014. Archivado desde el original el 24 de septiembre de 2014 . Consultado el 26 de septiembre de 2014 .

Enlaces externos