Está en la página 1de 16

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

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

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

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 <?php aparece un if( isset($_GET['submit']) ) que pregunta, si la variable submit que
es pasada va GET ha sido declarada.
Luego en $id = $_GET['id']; se obtiene a travs de GET los datos guardados en id, estos son guardados
en la variable $id declarada en PHP.
En la siguiente lnea:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id' ";

se declara la variable $getid, sta guarda la consulta que se realizar a la base de datos, pero si nos
fijamos, veremos como a esta consulta se le pasa la variable $id con los datos obtenidos a travs de GET
anterior.
Otro dato interesante a tener en cuenta, es el uso de comillas '', que encierra la variable $id, ya que con
esto podemos darnos cuenta, que la columna user_id es de tipo STRING y no un entero, este dato es
importante a la hora de realizar una Inyeccin SQL.
Con esto basta para saber que la aplicacin es vulnerable y que los datos que son pasados a travs de
GET no son filtrados, por ende si ingresamos algo como esto 1' AND 1=1 -- , la consulta queda de la
siguiente manera.
SELECT first_name, last_name FROM users WHERE user_id = '1' AND 1=1 -- '

Hemos anulado la comilla que nos imponan desde el cdigo PHP, esto se ha realizado con un comentario
de lnea, recordemos que en sql para realizar el comentario de una lnea, se utilizan los caracteres --, con
un espacio despus de los -- .

Seguridad Informtica Facultad de Ingeniera

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

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

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

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

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

Como vemos nos interesan las tablas guestbook y users, ahora sacaremos las columnas de las tablas.
0'
UNION
SELECT
table_name='guestbook'--

column_name,2

FROM

information_schema.columns

WHERE

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

10

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

11

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

12

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

13

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

14

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

15

Pauta Evaluativa
Puntaje
Criterios

Aspectos
Formales

Indicadores

Nulo

Regular

Medio

Bien

Cumplido

Indicaciones de formato informe


Correcta ortografa
Correcto formato y calidad de citas bibliografa
Expresa con claridad los contenidos solicitados

Contenido

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 procedimiento
o 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

Seguridad Informtica Facultad de Ingeniera

16

También podría gustarte