1. 정의
LDAP 처리 (LDAP Manipulation)
LDAP 질의문이나 결과로 외부 입력이 부분적으로 적절한 처리없이 사용되면 LDAP 질의문이 실행될 때 공격자는 LDAP 질의문의 내용을 마음대로 변경할 수 있다. 특히 여기서는 LDAP 질의문 자체에 외부 입력이 영향을 주는 경우를 말한다.
2. 해결방법
- 외부 입력에 대한 적절한 유효성 검증 후 사용해야 하며, LDAP 사용시 질의문을 제한하여 허용된 레코드만을 접근하도록 하는 접근 제어 기능을 사용해야 한다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
try
{
// 외부로 부터 입력을 받는다.
String name = props.getProperty(“ldap.properties");
// 입력값에 대한 BasicAttribute를 생성한다.
BasicAttribute attr = new BasicAttribute("name", name);
// 외부 입력값이 LDAP search의 인자로 사용이 된다.
NamingEnumeration answer = ctx.search("ou=NewHires", attr.getID(), new SearchControls());
printSearchEnumeration(answer);
ctx.close();
}
catch (NamingException e) { ... }
}
public void printSearchEnumeration(NamingEnumeration value)
{
try
{
while (value.hasMore())
{
SearchResult sr = (SearchResult) value.next();
System.out.println(">>>" + sr.getName() + "\n" + sr.getAttributes());
}
}
catch (NamingException e) { ... }
}
============================================================================
위의 예제는 외부의 입력(name)이 검색을 위한 base 문자열의 생성에 사용되고 있다. 이 경우 임의의 루트 디렉토리를 지정하여 정보에 접근할 수 있으며, 적절한 접근제어가 동반되지 않을 경우 정보 누출이 발생할 수 있다.
============================== 안전한 코드의 예 =============================
try
{
// 외부로 부터 입력값을 받는다.
String name = props.getProperty("name");
// 입력값에 대한 검사를 한다.
if (name == null || "".equals(name)) return;
String filter = "(name =" + name.replaceAll("\\*", "") + ")";
// 검증된 입력값을 LDAP search 인자로 사용한다.
NamingEnumeration answer = ctx.search("ou=NewHires", filter, new SearchControls());
printSearchEnumeration(answer);
ctx.close();
}
catch (NamingException e) { ... }
}
public void printSearchEnumeration(NamingEnumeration value)
{
try
{
while (value.hasMore())
{
SearchResult sr = (SearchResult) value.next();
System.out.println(">>>" + sr.getName() + "\n" + sr.getAttributes());
}
}
catch (NamingException e) { ... }
}
============================================================================
위의 코드처럼 외부 입력에 대한 적절한 유효성 검증 후 사용해야 하며, LDAP 사용시 질의문을 제한하여 허용된 레코드만을 접근하도록 하는 접근 제어 기능을 사용해야 한다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(21) - Eval Injection (0) | 2017.11.22 |
---|---|
시큐어코딩(20) - External Control of System or Configuration Setting (0) | 2017.11.22 |
시큐어코딩(18) - SQL Injection: mybatis Data Map (0) | 2017.11.18 |
시큐어코딩(17) - SQL Injection: Persistence (0) | 2017.11.18 |
시큐어코딩(16) - SQL Injection: JDO (0) | 2017.11.18 |