SQLMap es una herramienta para llevar a cabo inyecciones SQL realizada por Bernardo Damele (líder de proyecto) y Miroslav Stampar (Desarrollador). Es una herramienta desarrollada en Python y por tanto independiente del sistema operativo.
Una vez hecha la pequeña presentación de la herramienta, vamos a juguetear un poco con ella. Para las pruebas realizadas hemos utilizado:
Una vez hecha la pequeña presentación de la herramienta, vamos a juguetear un poco con ella. Para las pruebas realizadas hemos utilizado:
- DVWA versión 1.0.6 como aplicación vulnerable a SQL injection
- SQLMap 0.7 como herramienta para realizar SQL injection
- Mysql 5.0.51
- Sistema Operativo, Debian
Accedemos a la aplicación DVWA con nuestras credenciales, accedemos desde el menú de la izquierda a la opción "SQL Injection":
La aplicación recibe un identificador numérico y devuelve qué usuario dispone de ese identificador. Por ejemplo, si introducimos un '1' como "user id" la aplicación nos devolverá 'admin'. La aplicación realiza la siguiente consulta SQL sobre la base de datos, "SELECT first_name, last_name FROM users WHERE user_id = '$id'"
, recibiendo como parámetro el user_id. En el caso de no realizar un buen tratamiento del identificador un atacante podrá realizar una inyección SQL.Vamos a probar qué sucede si introducimos una comilla seguida de un identificador numérico:
Como vemos se produce un error que nos indica que estamos ante una "posible" inyección SQL. En este caso concreto sabemos a ciencia cierta que existe, así que ahora vamos a ver cómo se comporta SQLMap, para ello lanzamos SQLMap pasándole la URL y los identificadores de sesión:
$> sqlmap.exe --url="http://192.168.72.133/webapp/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=5c8195bf7834edb2e4ab7b6eae6af45f"
Resultado obtenido:
Nosotros sabemos que el parámetro id es vulnerable a SQL injection y que la base de datos es Mysql, pero en este caso SQLMap parece no darnos el resultado esperado, ¿por qué?. SQLMap compara la página sin ningún tipo inyección con la página con la inyección y en función de la variación entre ellas devuelve True o False (True si supera determinado ratio y False en el caso contrario). En nuestro caso si la inyección deriva en una página de error (por lo que no está bien construida) esta varía mucho de la página sin ningún tipo de inyección; por el contrario si la inyección resulta exitosa devolverá en el campo ID nuestra inyección, dejando igual los campos "First name" y "Surname". En la ejecución anterior SQLMap no funciona de manera correcta porque el campo ID con nuestra inyección hace variar demasiado la página. Si vamos haciendo una traza de la ejecución observamos que es en el fichero "comparison.py" donde devuelve "False" en base a dos valores, ratio y conf.matchRatio.
Como vemos la página con la inyección varía "demasiado" para ser detectado por nuestra sensible herramienta. Para ayudarla un poco vamos a utilizar el parámetro "--string", con el objetivo de introducir una cadena que esté siempre en la página sin inyección y en la página con una inyección que debiera volver True. Por contra esta cadena no debería estar cuando devuelva False. En este caso si introducimos como "id=1", sabemos que debe devolver admin cuando se produzca un True y no debe aparecer cuando devuelva False. Vamos a probar:
$> python -d /usr/bin/sqlmap --url="http://192.168.72.133/webapp/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=5c8195bf7834edb2e4ab7b6eae6af45f" --string="admin"
Resultado obtenido:
Ahora que parece funcionar, vamos a obtener por ejemplo las bases de datos que posee la base de datos:
$> python -d /usr/bin/sqlmap --url="http://192.168.72.133/webapp/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=5c8195bf7834edb2e4ab7b6eae6af45f" --string="admin" --dbs
Vemos que existen cuatro base de datos (dvwa, information_schema, mysql y wordpress281) en la base de datos. Llegados a este punto empieza la fiesta y ya podemos ir consultando con la herramienta diferentes aspectos de la base de datos, y que podéis consultar en el manual de SQLMap.
En una próxima entrada llegaremos un poco más lejos ..... a través de una inyección SQL. Espero que esta entrada os sirva para ver cómo toquetear SQLMap un poquito y empezar con lo divertido.
En una próxima entrada llegaremos un poco más lejos ..... a través de una inyección SQL. Espero que esta entrada os sirva para ver cómo toquetear SQLMap un poquito y empezar con lo divertido.
15 comentarios:
Buenas,
SQLMap es mi herramienta preferida para sacar partido a las inyecciones SQL que ya he comprobado que existen. Sin embargo, encuentro muchos problemas cuando lo que trato de verificar es un panel de login/passwd con POST en vez de GET. Igual con un string adecuado me funciona bien. Volveré a hacer pruebas, anyway :)
@Adrián, intentalo con un String que veas que identifique el cambio entre true o false, a ver que tal.
De todas maneras, a mi hay muchas veces que SQLMap me detecta una Inyección Ciega que en realidad no es tan ciega... Tenlo en cuenta cuando lo uses.
Saludos y gracias por el comentario!
Espero que te sirva la opción string porque es más que útil :D.
En una próxima entrada seguiremos profundizando en este tema y con esta tool. Si te quedas atascado o tienes un problema concreto con alguna prueba no dudes en ponerlo por aquí y si lo sabemos te ayudaremos ;).
Gracias por el comentario Adrián.
A mi me sale, ante cualquier prueba que hago:
[14:48:49] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
[14:48:57] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
[*] shutting down at: 14:48:57
donde se cambia eso?
gracias
@Joseph: Te sale SOLO eso? o entre las otras pruebas que hace te sale eso?
Que te salga es normal, entre las variables que chequea, además de chequear variables GET y POST, comprueba si la web cambia cuando se cambian algunos parámetros del navegador, como por ejemplo el User-Agent. Podría pasar que una web utilizara el User-Agent para construir una SQL, y que modificando este parámetro pudiéramos realizar una Inyección SQL, aunque no esté ni en el GET ni en el POST.
Lo que te dicen esos mensajes es que se comprueba que cambiando el User-Agent la web resultante no cambia, por lo que no se testean inyecciones contra ella (no se está utilizando para hacer queries, o eso parece).
No te preocupes por esas lineas, solo es un chequeo que hace, te debería funcionar todo perfectamente.
Saludos y gracias por tu comentario ;)
Ok, gracias por la inmediata respuesta.
El tema es que quiero hacer operaciones basicas para arrancar (nada complicado) y al salir eso que parece ser un warning normal, se corta ahi el test (mensaje de shutting down).
por ejemplo, yo ejecuto:
./sqlmap.py -u www.target.com/_layouts/1033/non_ie.js?rev=yfNry4hY0Gwa/PDNGrqXVg== -b
y la salida es:
[*] starting at: 15:01:53
[15:01:53] [INFO] using '/home/xxx/Tools/sqlmap/output/www.target.com/session' as session file
[15:01:53] [INFO] testing connection to the target url
[15:01:55] [INFO] testing if the url is stable, wait a few seconds
[15:02:01] [INFO] url is stable
[15:02:01] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
[15:02:10] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
[*] shutting down at: 15:02:10
y hasta ahi llego. Estoy seguro que es una pavada, pero no le encuentro logica.
Probe tambien poniendo el parametro --user-agent, por ejemplo:
--user-agent "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
pero nada, igual.
Es muy raro y creo que ya me habia ocurrido lo mismo con la version anterior. Tal vez no estoy entendiendo bien como funciona esto o estoy poniendo mal la url (salvo donde dice target, lo demas es real).
gracias de antemano amigo. muy bueno el blog, lo sigo siempre.
saludos
Buenas @Joseph
Como bien comenta Jose puedes si no le indicas el parámetro de manera explícita analiza diferentes parámetros. Si quieres indicarle un parámetro concreto mira si te sirve la opción "-p" de la herramienta.
Todo esto partiendo de que la salida sea algo más que lo que nos dices.
Un saludo.
@Joseph
Fíjate en el ejemplo del post que al ser una entorno autenticado es necesario proporcinarle a sqlmap los identificadores de sesión.
¿Lo estás lanzándolo sobre un entorno autenticado? Si es así mira de pasarle los identificadores de sesión (en el post son cookie's).
Espero que te sirva.
Un saludo.
Antes de nada felicitarte por el post. Por lo general yo siempre hacía estas pruebas a manita y no me había parado a mirar esta clase de herramientas... hasta ahora.
Va de maravilla, pero he encontrado un sitio (mio) donde me salta un error y no consigo saber por qué es:
Si pido la página con GET o HEAD (desde consola) me da un 200 sin problemas (no necesita autenticación, ni espera una sesión, etc). Si pongo la página para el sqlmap me salta este error:
$ ./sqlmap.py -u "http://xxxx.xxx/xxx?par1=value1"
[18:19:27] [INFO] testing connection to the target url
[18:19:28] [WARNING] unable to connect to the target url or proxy, sqlmap is going to retry the request
[18:19:29] [WARNING] unable to connect to the target url or proxy, sqlmap is going to retry the request
[18:19:30] [WARNING] unable to connect to the target url or proxy, sqlmap is going to retry the request
[18:19:31] [ERROR] unable to connect to the target url or proxy
[*] shutting down at: 18:19:31
¿tiene alguien idea de porqué pasa esto? He estado googleando durante el día a ver si encontraba alguna respuesta pero no doy con la solución.
Gracias!
@Anónimo: Yo cuando tengo problemas de esos me pongo a capturar con tcpdump para ver que puñetas está pasando a bajo nivel :P
# tcpdump -l -i eth0 -nn -A -s 0 host ??? and port 80
(suponiendo que eth0 es tu interface de red)
Con esto podemos intentar ver si es que falla el DNS, la conexión, o si la respuesta es correcta pero la herramienta está funcionando mal.
Si la respuesta es muy grande como para ponerla en un comentario puedes "truncar" la salida ASCII, con ver que nos está devolviendo HTML o no y ver más o menos si se corresponde a la página creo que podemos sacar algunas conclusiones.
Esperamos tu respuesta.
Saludos.
Muy buen post. Os animo a seguir.
Una interesante herramienta a tener en cuenta:
http://www.learnphp.co.il/yoni/yoni_project_linux.rar
Podeis verla aqui:
http://www.youtube.com/watch?v=Xwx5xWnxnNE
No amiguetes, no es mia.
A mas ver,
Keyser Soze
@Anónimo
Además de lo que comenta Jose, mi consejo sería que probaras la opción -v de sqlmap (copia del manual de sqlmap):
"There exist six levels. The default level is 1 in which information, warnings, errors and tracebacks (if any occur) will be shown. Level 2 shows also debug messages, level 3 shows also full HTTP requests, level 4 shows also HTTP responses headers and level 5 shows also HTTP responses page content."
Te aconsejo que vayas subiendo poco a poco de nivel de detalle y vayas viendo las peticiones HTTP y respuestas.
Espero que te ayude.
Un saludo.
Tras cargar dvwa 1.0.6 en /var/www/ en bt4f y modificar .htaccess segun las instrucciones para PHP 5.2.6, cuando lanzo SQL Injection me dice "Magic Quotes are on, you will not be able to inject SQL."
He comprobado que las comillas estan a off tanto en .htaccess como en php.ini pero no hay manera, dvwa sigue reportandolas a On.
¿Os ha pasado a vosotros)
Buenas @Anónimo
Para las pruebas únicamente me tocó poner en Off las opciones magic_quotes del php.ini. Después un reboot del servidor web (apache2) y a funcionar.
Yo probaría lo primero que el php.ini que estés modificando se corresponda al que el servidor web está utilizando.
Si no van por ahí los tiros ya nos comentas.
Un saludo!
Excelente blog y muy buen post, realmente llegué a tú blog por coincidencia, pero he leído un par de artículos y me han parecido muy interesantes, espero sigas así.
Un saludo.
Publicar un comentario en la entrada