LDAP Injection
LDAP
LDAP Injection là một cuộc tấn công nhắm vào các ứng dụng web xây dựng các câu lệnh LDAP từ dữ liệu đầu vào của người dùng. Nó xảy ra khi ứng dụng không khử trùng dữ liệu đầu vào đúng cách, cho phép kẻ tấn công thao túng các câu lệnh LDAP thông qua proxy cục bộ, có khả năng dẫn đến truy cập trái phép hoặc thao túng dữ liệu
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
Ký tự "*" có thể đại diện thay thế một hay nhiều kí tự khác
Ví dụ:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))
Chú ý:
OpenLDAP : Nếu có 2 bộ lọc đến, chỉ thực thi bộ lọc đầu tiên.
ADAM hoặc Microsoft LDS : Với 2 bộ lọc, chúng sẽ báo lỗi.
SunOne Directory Server 5.0 : Thực thi cả hai bộ lọc.
Điều rất quan trọng là phải gửi bộ lọc với cú pháp đúng, nếu không sẽ xảy ra lỗi. Tốt hơn là chỉ gửi 1 bộ lọc.
Bộ lọc phải bắt đầu bằng: &
hoặc |
Ví dụ:(&(directory=val1)(folder=public))
(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void
Sau đó: (&(objectClass=
*)(ObjectClass=*))
sẽ là bộ lọc đầu tiên (bộ lọc được thực thi).
Bypass Login
LDAP hỗ trợ một số định dạng để lưu trữ mật khẩu: clear, md5, smd5, sh1, sha, crypt. Vì vậy có thể bất kì cái gì được chèn vào mật khẩu đều bị băm
Lists
Blind LDAP Injection
You may force False or True responses to check if any data is returned and confirm a possible Blind LDAP Injection:
Dump data
Lặp lại các chữ cái, chữ số và ký hiệu ascii:
Scripts
Khám phá các trường LDAP hợp lệ
Special Blind LDAP Injection (without "*")
Google Dorks
More Payloads
Defenses
1. Sử Dụng Hàm Mã Hóa LDAP Đúng Cách
1.1. Encode Distinguished Name (DN):
Vấn Đề: Distinguished Name (DN) là một định danh duy nhất trong LDAP và có thể chứa các ký tự đặc biệt cần được encode để tránh lỗi bảo mật. Các ký tự cầnencode bao gồm:
\ # + < > , ; " =
và các ký tự khoảng trắng ở đầu hoặc cuối.Ký Tự Được Cho Phép: Các ký tự đặc biệt như
* ( ) . & - _ [ ]
~ | @ $ % ^ ? : { } ! '` không cần encode.Giải Pháp: Để encode DN trong Java, có thể sử dụng whitelist để chỉ cho phép các ký tự hợp lệ.
1.2. Mã Hóa Search Filter:
Vấn Đề: Trong LDAP, các bộ lọc tìm kiếm sử dụng cú pháp hình thức prefix notation. Các ký tự cần encode trong bộ lọc tìm kiếm bao gồm:
() \ NUL
.Giải Pháp: Encode dữ liệu đầu vào theo RFC4515, nơi các ký tự không an toàn được chuyển đổi thành
\XX
, vớiXX
là mã hex của ký tự đó.
1.3. Các Thư Viện và Frameworks:
Java: Thư viện OWASP ESAPI cung cấp các phương thức encode cho LDAP, bao gồm
encodeForLDAP()
vàencodeForDN()
..NET: Thư viện AntiXSS (hiện là lớp Encoder) cung cấp các phương thức như
Encoder.LdapFilterEncode()
vàEncoder.LdapDistinguishedNameEncode()
.
2. Sử Dụng Framework Tự Động Bảo Vệ Chống LDAP Injection
.NET: Sử dụng LINQ to LDAP (hoặc các thư viện tương tự) có thể tự động encode các truy vấn LDAP, giảm nguy cơ lỗi bảo mật.
3. Các Biện Pháp Phụ Trợ
3.1. Nguyên Tắc Ít Quyền:
Mục Tiêu: Giảm thiểu thiệt hại từ các cuộc tấn công LDAP injection bằng cách giảm quyền hạn của tài khoản LDAP binding.
Thiết Lập: Đảm bảo rằng tài khoản LDAP binding có ít quyền hạn nhất cần thiết để thực hiện nhiệm vụ của nó.
3.2. Xác Thực Bind:
Mục Tiêu: Đảm bảo rằng LDAP được cấu hình với xác thực bind để ngăn chặn các cuộc tấn công LDAP injection thông qua xác thực và kiểm tra quyền hạn.
Cảnh Báo: Các cuộc tấn công vẫn có thể diễn ra qua kết nối không được xác thực hoặc bằng cách khai thác các bind không được xác thực.
3.3. Allow-List Input Validation:
Last updated