sábado, octubre 06, 2007

LDAP Injection & Blind LDAP Injection (Parte III de III)

********************************************************
Índice:
LDAP Injection & Blind LDAP Injection (Parte I de III)
LDAP Injection & Blind LDAP Injection (Parte II de III)
LDAP Injection & Blind LDAP Injection (Parte III de III)
********************************************************

En este parte del artículo simplemente se han probado las inyecciones descritas por Sacha Faust en su documento "LDAP Injection" sobre entornos ADAM y OpenLDAP.

LDAP Injection con ADAM de Microsoft

Para realizar todas las pruebas de las cadenas a inyectar hemos utilizado la herramienta LDAP Browser que permite conectarse a distintos árboles LDAP y una cliente web creado con el componente IPWorksASP.LDAP de la empresa /n Software, para realizar las pruebas de ejecución de filtros. En la imagen 1 se muestra la estructura que hemos creado de ejemplo en ADAM.


Imagen: Estructura del árbol LDAP creado en ADAM

Supongamos ahora que la aplicación 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 imagen siguiente:

Imagen: Se obtiene un objeto de respuesta con el filtro (cn=Impresora_1)

Lo deseable por un atacante que realice una inyección sería poder acceder a toda la información mediante la inclusión una consulta que nos devolviera todas las impresoras, en un supuesto ataque. En el ejemplo, vemos cual debería ser el resultado a obtener con una consulta siguiendo la RFC 4515 sobre ADAM: (|(cn=Impresora_1)(cn=Impresora*))

Imagen: Todas las impresoras

Sin embargo, como se puede apreciar, para construir ese filtro, necesitaríamos inyectar un operador y un paréntesis al principio. En el ejemplo, la inyección no “parece” ser muy útil pues se está realizando en ambas condicionantes sobre cn, pero ese filtro sólo está creado para ilustrar la necesidad de inyectar código antes del filtro y en el medio del filtro. Si probamos la inyección propuesta por Sacha Faust en ADAM: (cn=Impresora_1)(|(cn=Impresora*))

Imagen: Inyección sin resultados

Como se puede apreciar en la captura, en la última prueba, la inyección no produce ningún error, pero a diferencia de las pruebas que realiza Sacha Faust con SunOne Directory Server 5.0, el servidor ADAM no devuelve más datos. Es decir, sólo devuelve los datos del primer filtro completo y el resto de la cadena es ignorado.

LDAP Injection con OpenLDAP

Para realizar las pruebas de inyección en OpenLDAP hemos utilizado el árbol que ofrece de pruebas el propio proyecto OpenLPAD.org cuya estructura es la siguiente:

Imagen: Estructura del árbol LDAP en OpenLDAP

Sobre esta estructura ejecutamos una consulta para buscar a un usuario obteniendo un único objeto como resultado: (uid=kurt)

Imagen: Al ejecutar el filtro (uid=kurt) obtenemos un único resultado

Si quisiéramos ampliar el número de resultados, siguiendo la RFC 4515 deberíamos ejecutar una consulta en la que inyectáramos un operador OR y un filtro que incluyera a todos los resultados, como se puede ver en la siguiente imagen: (|(uid=kurt)(uid=*))

Imagen: Todos los usuarios

Si realizamos la inyección tal y como propone Sacha Faust en su documento sobre LDAP obtendríamos los siguientes resultados: (uid=kurt)(|(uid=*))

Imagen: Inyección OpenLDAP. Se ignora el segundo filtro.

Como puede apreciarse en la captura, el servidor OpenLDAP ha ignorado el segundo filtro y solo ha devuelto un usuario, de igual forma que realizaba ADAM.

********************************************************
Índice:
LDAP Injection & Blind LDAP Injection (Parte I de III)
LDAP Injection & Blind LDAP Injection (Parte II de III)
LDAP Injection & Blind LDAP Injection (Parte III de III)
********************************************************

Eleven Paths Blog

Seguridad Apple

Entradas populares