G01-ICINF-DVWA-01

16
Guía #1 Seguridad Web – DVWA – Parte 1 Facultad de Ingeniería EXTRACTO Este documento presenta un desafío. El cual considera la instalación de un ambiente web vulnerable con objeto de evidenciar en la práctica a qué ataques básicos se pueden realizar. Seguridad Informática

description

SQL Injection en el entorno DVWA

Transcript of G01-ICINF-DVWA-01

  • Gua #1 Seguridad Web DVWA Parte 1

    Facultad de Ingeniera

    EXTRACTO

    Este documento presenta un desafo. El cual considera la instalacin de un ambiente web vulnerable con objeto de evidenciar en la prctica a qu ataques bsicos se pueden realizar.

    Seguridad Informtica

  • Seguridad Informtica Facultad de Ingeniera 2

    Inyeccin SQL: El primer ataque a nivel web que veremos, ser el de Inyeccin SQL, esta tcnica consta de realizar consultas a la base de datos aprovechndonos de variables no filtradas por el PROGRAMADOR. Realizaremos consultas a travs de la aplicacin web, con ello podremos conseguir cosas como la extraccin total de datos, ejecucin de comandos, escritura y lectura de archivos en el servidor web. Todo dependiendo del contexto en el que nos encontremos ya que para poder realizar alguna de estas acciones, necesitaremos de ciertos permisos que un administrador descuidado nos podra brindar. Para realizar las pruebas de esta gua utilizaremos "Damn Vulnerable Web App", el cul nos ofrece un ambiente excelente para aprender y practicar diferentes tcnicas. Primero debemos iniciar sesin en DVWA, con esto accedemos a la zona donde se encuentran nuestras practicas.

  • Seguridad Informtica Facultad de Ingeniera 3

    Antes de comenzar las prcticas, debemos verificar la configuracin de esta aplicacin. En la zona donde dice "DVWA Security", debemos pinchar y asegurarnos que el nivel se encuentre en "low".

    Una vez vista la

    configuracin, procedemos acceder en la opcin que dice "SQL injection".

    Vemos como en la pantalla nos aparece un mensaje que dice "User ID", y abajo aparece un textbox, donde debemos ingresar el "User ID", de algn usuario, procedemos a ingresar el nmero 1 y luego pinchar el botn "submit".

  • Seguridad Informtica Facultad de Ingeniera 4

    Vemos como nos aparecen los datos del administrador, como recin estamos comenzando y esta aplicacin cumple un rol de aprendizaje, este apartado nos brinda la opcin de ver el cdigo fuente de la pgina para ver lo que encuentra ejecutando internamente (cosa que no ocurre en la realidad), procederemos a detallar el cdigo fuente de la pgina para ver que es lo que esta haciendo la aplicacin web. Accedemos por el vinculo que dice "VIEW SOURCE", y nos abrir una pgina donde nos mostrar el cdigo fuente.

    Luego de

  • Seguridad Informtica Facultad de Ingeniera 5

    -- este es un comentario en sql. Cuando realizamos la sentencia 1' AND 1=1 -- , estamos ingresando nuestra propia comilla y anulando la segunda comilla que se ingresaba en el cdigo, para luego dejar que la consulta siempre sea verdadera AND 1=1 , recordemos que el resultado de esa sentencia es un boolean.

    Ahora si hacemos que la consulta siempre sea falsa, basta con ingresar 1' AND 1=2 -- .

    Vemos que los datos que antes nos retornaba, no nos salen ahora.

    SELECT first_name, last_name FROM users WHERE user_id = '1' AND 1=2-- '

    El ejemplo realizado anteriormente, es una de las tantas pruebas que se realiza para saber si una aplicacin es vulnerable a Inyeccin SQL, ya que en un ejemplo real, no tendremos la ayuda del cdigo fuente, as que deberemos deducir he inferir a partir de las respuestas que enve el servidor.

    Extraccin de datos utilizando la sentencia UNION:

    Con esto ya hemos aprendido la base de la Inyeccin SQL, as que ahora podremos inyectar cdigo sin problemas. Lo que haremos ahora es extraer todos los datos de todos los usuario, recordemos que el mensaje en la aplicacin, nos solicita que ingresemos un id de un usuario, si seguimos ingresando nmeros podemos obtener la cantidad exacta de usuarios que contiene la base datos.

  • Seguridad Informtica Facultad de Ingeniera 6

    Hemos encontrado 5 usuarios, as que nuestro reto ahora ser, sacar todos los datos de los 5 usuarios, para concretarlos utilizaremos la sentencia UNION con la cul uniremos 2 consultas a la base de datos, la primera ser la que nos imponen con PHP la cul hemos visto anteriormente, con la sentencia UNION tendremos la posibilidad de unir otra consulta y que retorne los datos que nosotros deseemos. Para realizar el UNION de consultas, debemos saber cuantas columnas contiene la consulta, sabemos de antemano que la consulta contiene 2 columnas que son "first_name" y "last_name", pero desde ahora seguiremos la gua como si no supiramos nada sobre la consulta que se realiza, as que debemos encontrar una manera de conseguir la cantidad de columnas manualmente.

    Para obtener la cantidad de columnas tenemos 2 opciones, la primera es con la sentencia "order by", este lo que hace es ordenar la consulta segn el nmero de la columna, como ejemplo podemos poner order by 1 , esto quiere decir que los datos sern ordenados a travs de la columna 1. La manera de sacar la cantidad de columna, es realizando un "order by X" aumentando el nmero hasta cuando recibamos un error, por ejemplo si realizamos la consulta con un "order by 3" y sabemos que la consulta contiene 2 columnas obtendremos un error, de lo contrario nos mostrar los datos tal cual, vemos que esto funciona como el primer ejemplo utilizando el AND (lgica booleana).

  • Seguridad Informtica Facultad de Ingeniera 7

    Las consultas quedan as:

    Select first_name,last_name FROM users WHERE user_id='1' ORDER BY 1-- Select first_name,last_name FROM users WHERE user_id='1' ORDER BY 2--

    El error que nos indica que no existe una tercera columna.

    La otra manera de obtener la cantidad de columnas, es a travs del UNION, y es tan simple como unir un SELECT e ir agregndole una columna, mientras esta nos da un error. Cuando nos deje de dar error, significa que ya hemos encontrado la cantidad de columnas.

    1' UNION SELECT 1--

    1' UNION SELECT 1,2--

  • Seguridad Informtica Facultad de Ingeniera 8

    Como vemos, ah tenemos el resultado de las dos consultas, ya no nos aparece solamente un resultado. Ahora que sabemos que la consulta contiene 2 columnas debemos tener clara la versin de MYSQL que utiliza la aplicacin, ya que para extraer los datos como los nombres de las tablas y columnas que utilizaremos en la consulta, utilizaremos la base de datos information_schema, que precisamente es la que contiene estos datos y esta solamente se encuentra disponible desde la versin 5 en adelante, por lo tanto si es menor a 5 la versin de MYSQL, deberemos realizar el proceso de bsqueda de las tablas y columnas a travs de fuerza bruta.

    Cmo sabemos si esta versin de MYQL contiene la base de datos information_schema ?, tenemos nuevamente 2 formas de saber esto, la primera es consultando la versin de mysql directamente de la siguiente forma. 1' UNION SELECT @@version,1

    1' UNION SELECT version(),1--

    Tenemos dos maneras de realizar el mismo proceso, con esto podemos ver en la segunda respuesta la versin de MYSQL, en esta ocasin es la versin 5.5.30 as que podemos acceder a la base de datos information_schema.

    Observacin: Como vemos, cada vez que realizamos la doble consulta 1' UNION SELECT version(),2-- , nos aparecen los resultados de ambas consultas, muchas veces lo datos de la primera consulta no nos interesan y lo nico que hacen es molestar, para eliminar estos datos, solo debemos realizar una consulta a algn dato que no exista en la base de datos, por ejemplo, en esta ocasin nos solicitan

  • Seguridad Informtica Facultad de Ingeniera 9

    que ingresemos un id de un usuario, si sabemos que el usuario con id 0 no existe, entonces realizamos la primera consulta al usuario con id 0. 0' UNION SELECT version(),2

    La consulta queda as: Select first_name,last_name FROM users WHERE user_id='0' UNION SELECT version(),2-- Como vemos, con este eliminamos la primera consulta, as nos podemos concentrar en la segunda que es la que verdaderamente nos interesa.

    La otra manera de saber si existe la base de datos information_schema, es realizando una consulta a una tabla y una columna que contenga esta base de datos, por ejemplo una tabla que contiene esta base de datos es la tables y una columna es la table_name, entonces una consulta a estos, quedara de la siguiente manera. 0' UNION SELECT count(table_name),2 FROM information_schema.tables--

    Como existe la base de datos, nos ha devuelto la cantidad de tablas(47) que contiene esta, pero en el caso de no encontrarse, nos debera mostrar un error o simplemente no mostrar ningn dato. Ya sabemos que la consulta contiene 2 columnas, y que la versin de mysql es mayor a 5, ahora procederemos a extraer los nombres de las tablas y columnas. Para realizar esto debemos realizar una consulta de la siguiente manera. 0' UNION SELECT table_name,table_schema FROM information_schema.tables-- Nos devuelve los nombres de las 47 tablas, en el campo que dice first_name aparecen los nombres de las tablas y en el lugar de Surname aparece el nombre de la base de datos al que pertenece la tabla, a nosotros nos interesan todas las tablas que NO PERTENEZCAN A LA BASE DE DATOS information_schema.

  • Seguridad Informtica Facultad de Ingeniera 10

    Como vemos nos interesan las tablas guestbook y users, ahora sacaremos las columnas de las tablas. 0' UNION SELECT column_name,2 FROM information_schema.columns WHERE table_name='guestbook'--

    La tabla guestbook contiene 3 columnas.

    guestbook

    comment_id comment name

    Ahora sacamos las columnas de la tabla users, realizando la misma consulta.

  • Seguridad Informtica Facultad de Ingeniera 11

    Como vemos la tabla contiene 6 columnas.

    users

    user_id first_name last_name user password avatar

    Ahora ya estamos en condiciones de extraer los datos de la base de datos, a modo de ejemplo extraeremos los campos user y password de la tabla users. 0' UNION SELECT user,password FROM users--

    Hemos obtenido los datos de los 5 usuarios, y de la misma forma podemos seguir y sacar todos los datos de toda la base de datos. Un problema que vemos, es que an no conseguimos las claves de los usuarios, lo que conseguimos fueron los HASH MD5 de la password, para obtener la clave debemos crackear los HASH, utilizando herramientas como jhon de ripper, o inclusive muchas veces la conseguiremos buscando en google, por ejemplo tomamos el siguiente hash e99a18c428cb38d5f260853678922e03 , y lo buscamos en google.

  • Seguridad Informtica Facultad de Ingeniera 12

    Conseguimos la clave del usuario gordonb y es abc123, verificaremos que estos sean los datos, iniciando sesin con estos.

    Ingresamos.

    Debemos recordar, que esta vulnerabilidad ocurre debido a que los datos ingresados en la aplicacin web, no se filtran, por ende la responsabilidad de esta recae en el programador de la aplicacin. Tambin debemos saber que esta no es la nica manera de inyectar cdigo SQL, existen diferentes tcnicas dependiendo del filtrado de las variables(hay programadores que filtran estos datos pero el filtro es insuficiente) y el motor SQL que se encuentran utilizando. Tambin tenemos herramientas que realizan el proceso de inyeccin, de esta forma podremos extraer grandes cantidades de datos sin realizar tanto esfuerzo, una de la herramientas es SQLMAP, est escrita en python y la podemos descargar de aqu http://sqlmap.org/, veremos como realizar el mismo proceso con SQLMAP. Ejecutamos sqlmap:

    ./sqlmap.py --url="IPSERVIDOR/vulnerabilities/sqli/?id=&Submit=Submit" -p id --dbms="MYSQL" --cookie="security=low; PHPSESSID=xxxxxxxxxxxxxxx; cprelogin=no; cpsession=closed; langedit=; lang="

  • Seguridad Informtica Facultad de Ingeniera 13

    Los parmetros ingresados son:

    --url= IPSERVIDOR/dvwa/vulnerabilities/sqli/?id=&Submit=Submit

    Este contiene la url con el parmetro donde inyectaremos.

    -p id

    Es la variable vulnerable, a la que debe inyectar el cdigo.

    --dbms=MYSQL

    Ac le indicamos el motor sql que se encuentra utilizando.

    --cookie=security=low;PHPSESSID=XXXXXXX;cprelogin=no; cpsession=closed; langedit=; lang=

    Este parmetro lo utilizaremos en caso de encontrarnos logueado en una pgina, y la variable vulnerable es accesible desde dentro de la pgina. Los resultados de este son:

    Vemos como la aplicacin intenta inyectar cdigo con distintas tcnicas y al final detecta que es inyectable.

  • Seguridad Informtica Facultad de Ingeniera 14

    Luego le pedimos que nos liste las tablas con el parmetro tables.

    Ah vemos las tablas, ahora veremos las columnas de esta, agregando el parmetro columns.

    Conseguimos las columnas y los tipos de estas, adems si aadimos los parmetros.

    --dump -D subzero4_subzeroprodvwa -T users -C user,password

    Con estos parmetros conseguimos extraer los datos.

    Con esto finaliza la primera prctica en aplicaciones web.

  • Seguridad Informtica Facultad de Ingeniera 15

    Actividades

    1. Documentar el procedimiento de la gua. 2. Elaborar un mapa conceptual con los trminos conversados en el desarrollo de la gua.

    Preguntas

    1. Investigue el rol de magic_quotes? 2. Qu entendi por SQL injection? 3. Qu medidas le recomendara usted al desarrollador para que la gestin de la seguridad de la

    informacin no fuese vulnerable en el caso analizado? 4. Cul la clave de Pablo encontrada en la tabla de usuarios? 5. Qu interprete es necesario para poder utilizar SQLMAP? 6. Explique qu ocurrira si utiliza el operador booleano OR en la primera inyeccin SQL (1' xx 1=1

    -- ) de esta gua?

  • Seguridad Informtica Facultad de Ingeniera 16

    Pauta Evaluativa

    Criterios Indicadores

    Puntaje

    Nulo Regular Medio Bien Cumplido

    1 2 3 4 5

    Aspectos Formales

    Indicaciones de formato informe

    Correcta ortografa

    Correcto formato y calidad de citas bibliografa

    Contenido

    Expresa con claridad los contenidos solicitados

    Calidad de la explicacin del procedimiento

    Calidad de conclusiones

    Recursos didcticos y creativos utilizados

    Conducta Demuestra actitud de respeto en la actividad

    Puntualidad de entrega

    Indicaciones de formato

    1.- Estructura de informe:

    Portada

    Introduccin

    ndice

    Contenido o Explicacin del procedimientoo Actividades solicitadas en la gua o Conclusiones

    Bibliografa (APA) 2.- Mxima cantidad de hojas de Contenido: 10 hojas 3.- Tipo de letra: Courier 4.- Tamao de letra: 10 5.- Interlineado: Sencillo