Una vez hecha la pequeña presentación de la herramienta, vamos a juguetear un poco con ella. Para las pruebas realizadas hemos utilizado:
*[Enlace externo eliminado para invitados]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,
Código: Seleccionar todo
"SELECT first_name, last_name FROM users WHERE user_id = '$id'"
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:
Código: Seleccionar todo
$> sqlmap.exe --url="http://192.168.72.133/webapp/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=5c8195bf7834edb2e4ab7b6eae6af45f"
[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.
Añadimos dos líneas a este fichero, 'logger.info(ratio) y logger.info(conf.matchRatio)', para observar qué valores tienen las variables ratio y conf.matchRatio cuando realiza una inyección que efectivamente debería surtir efecto:
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:
Código: Seleccionar todo
$> 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"
Ahora que parece funcionar, vamos a obtener por ejemplo las bases de datos que posee la base de datos:
Código: Seleccionar todo
$> 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 [Enlace externo eliminado para invitados]
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.
[Enlace externo eliminado para invitados]