La inyección LDAP a ciegas es una variante más sutil de la inyección LDAP donde el atacante no recibe un output directo del payload inyectado. En su lugar debe inferir la información basado en el comportamiento de la aplicación.
La blind LDAP injection requiere diferentes acercamientos debido a la falta de resultados específicos de queries. Los atacantes deben confiar en las señales indirectas, como cambios en el comportamiento de la aplicación, mensajes de error o tiempos de respuesta para deducir la estructura de la query LDAP y la existencia de vulnerabilidades.
Por ejemplo, debajo hay un trozo de código de http://IP/blind.php que usa una query LDAP para comprobar la existencia de un usuario pero sólo devuelve un error genérico al fallar. La aplicación también comprueba si el email subido es el mismo que el email de la base de datos.
$username = $_POST['username']; $password = $_POST['password']; $ldap_server = "ldap://localhost"; $ldap_dn = "ou=users,dc=ldap,dc=thm"; $admin_dn = "cn=tester,dc=ldap,dc=thm"; $admin_password = "tester"; $ldap_conn = ldap_connect($ldap_server); if (!$ldap_conn) { die("Could not connect to LDAP server"); } ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3); if (!ldap_bind($ldap_conn, $admin_dn, $admin_password)) { die("Could not bind to LDAP server with admin credentials"); } $filter = "(&(uid=$username)(userPassword=$password))"; $search_result = ldap_search($ldap_conn, $ldap_dn, $filter); if ($search_result) { $entries = ldap_get_entries($ldap_conn, $search_result); if ($entries['count'] > 0) { foreach ($entries as $entry) { if (is_array($entry)) { if (isset($entry['cn'][0])) { if($entry['uid'][0] === $_POST['username']){ $message = "Welcome, " . $entry['cn'][0] . "!\n"; }else{ $message = "Something is wrong in your password.\n"; } } } } } else { $error = true; } } else { echo "LDAP search failed\n"; } ldap_close($ldap_conn);
Este código es vulnerable a blind LDAPi porque el filtro LDAP es construído sin sanitizar el input del usuario. Sin embargo, sólo ofrece feedback genérico haciéndolo difícil de explotar directamente.
Para expplotar esta vulnerabilidad se puede usar una técnica conocida como Boolean-Based Blind LDAPi. El atacante inyecta condiciones en el username para hacer la query LDAP true o false observando el comportamiento de la aplicación para inferir información.
Por ejemplo, un atacante puede probar a inyectar un username como a*)(|(&, el cual al incluirse en la query LDAP comprueba cualquier usuario con a en su uid:
Injected Username and Password
username=a*%29%28%7C%28%26&password=pwd%29
El payload de arriba es la versión URL-encodeada de a*)(|(& para el username y pwd) para la contraseña.

Query LDAP Resultante
(&(uid=a*)(|(&)(userPassword=pwd)))

Si la aplicación devuelve "Something is wrong with your password", el atacante puede inferir que un usuario con una cuenta que empieza por a en su uid existe en el directorio LDAP. Para comprobar el siguiente caracter reiteramos el proceso.
Injected Username and Password
username=ab*%29%28%7C%28%26&password=pwd%29

Query LDAP Resultante
(&(uid=ab*)(|(&)(userPassword=pwd)))

Esto indica que el siguiente caracter no es "b". Un atacante puede automatizar este tipo de comprobación adivinando caracteres del email iterativamente, observando el comportamiento de la aplicación en respuesta al input crafteado, similar a la Boolean-Based SQLi.
Técnicas para Extraer Información
- Explotación Booleana: Esto involucra inyectar condiciones que son evaluadas en true o false y observar el comportamiento de la aplicación.
- Inferencia Basada en Errores: En algunos casos inyecciones específicas pueden disparar mensajes de eeror peculiares ofreciendo pistas sobre la estructura LDAP.
