Post

Java LDAP 처리 코딩 기법

1. 정의

LDAP 질의문이나 결과로 외부 입력이 부분적으로 적절한 처리 없이 사용되면 LDAP 질의문이 실행될 때 공격자는 LDAP 질의문의 내용을 마음대로 변경할 수 있다. 특히 여기서는 LDAP 질의문 자체에 외부 입력이 영향을 주는 경우를 말한다.

2. 안전한 코딩 기법

  • 외부 입력에 대한 적절한 유효성 검증 후 사용해야 하며, LDAP 사용 시 질의문을 제한하여 허용된 레코드만을 접근하도록 하는 접근 제어 기능을 사용해야 한다.

3. 예제

다음의 예제는 외부의 입력(name)이 검색을 위한 base 문자열의 생성에 사용되고 있다. 이 경우 임의의 루트 디렉터리를 지정하여 정보에 접근할 수 있으며, 적절한 접근제어가 동반되지 않을 경우 노출이 발생할 수 있다.

  • 안전하지 않은 코드의 예
1
2
3
4
5
6
7
8
9
10
11
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) {
}

외부 입력에 대한 적절한 유효성 검증 후 사용해야 하며, LDAP 사용 시 질의문을 제한하여 허용된 레코드만을 접근하도록 하는 접근 제어 기능을 사용해야 한다.

  • 안전한 코드의 예
1
2
3
4
5
6
7
8
9
10
11
12
13
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) {
}

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.