Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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".
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 -- .
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.
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).
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--
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
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
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
comment_id
comment
name
Ahora sacamos las columnas de la tabla users, realizando la misma consulta.
10
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.
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="
12
Vemos como la aplicacin intenta inyectar cdigo con distintas tcnicas y al final detecta que es
inyectable.
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.
14
Actividades
15
Pauta Evaluativa
Puntaje
Criterios
Aspectos
Formales
Indicadores
Nulo
Regular
Medio
Bien
Cumplido
Contenido
Conducta
Indicaciones de formato
16