본문 바로가기 ← 메인

💉 LDAP 삽입 (LDAP Injection) - 실습 시뮬레이터

CWE-90: Improper Neutralization of Special Elements used in an LDAP Query

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 취약점 식별
  • ⬜ 이스케이프 함수 구현
✏️ Java 코드 에디터 취약한 코드
LdapService.java 💡 입력값의 특수문자를 이스케이프(replace)하세요.
public void searchUser(String user) throws NamingException {
    DirContext ctx = new InitialDirContext(env);
    
    // [취약한 코드] 입력값을 검증 없이 LDAP 필터 생성에 사용
    // user에 "*)(cn=*" 입력 시 모든 사용자 검색 가능
    String filter = "(cn=" + user + ")";
    
    NamingEnumeration<SearchResult> results = ctx.search("ou=users,dc=example,dc=com", filter, controls);
}
💡 수정 가이드 (KISA 가이드 기준)
1. 특수문자 이스케이프

LDAP 필터에서 특별한 의미를 갖는 문자들(*, (, ), \, /)을 이스케이프합니다.

user = user.replace("\\", "\\5c") .replace("*", "\\2a") .replace("(", "\\28") .replace(")", "\\29") .replace("/", "\\2f") .replace("\0", "\\00"); String filter = "(cn=" + user + ")";
📊 분석 결과 및 설명
🎯 목표

LDAP 쿼리 구성 시 사용자 입력값에 포함된 특수문자가 쿼리의 구조를 변경하지 못하도록 필터링해야 합니다.

⚠️ 현재 취약점

LDAP Injection

공격자가 입력값을 조작하여 의도하지 않은 LDAP 쿼리를 실행하고 디렉터리 정보를 열람하거나 수정할 수 있습니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 취약점 식별
  • ⬜ escape_filter_chars 적용
🐍 Python 코드 에디터 취약한 코드
ldap_utils.py 💡 ldap3.utils.conv.escape_filter_chars를 사용하세요
from ldap3 import Connection

def find_user(conn, username):
    # [취약한 코드] 문자열 포맷팅으로 필터 생성
    # username에 *)(cn=* 입력 시 모든 사용자 검색 가능
    search_filter = "(cn=%s)" % username
    conn.search('dc=example,dc=com', search_filter)
💡 수정 가이드 (Python 가이드 기준)
1. escape_filter_chars 사용

ldap3 라이브러리의 유틸리티 함수를 사용하여 특수문자를 이스케이프합니다.

from ldap3.utils.conv import escape_filter_chars search_filter = "(cn=%s)" % escape_filter_chars(username)
📊 분석 결과 및 설명
🎯 목표

Python LDAP 라이브러리 사용 시에도 입력값 검증 및 이스케이프 처리가 필수적입니다.

⚠️ 현재 취약점

LDAP Injection

이스케이프되지 않은 입력값은 필터 로직을 우회할 수 있습니다.

📰 실제 사고사례 & 표준 매핑
LDAP 인젝션으로 인증을 우회하거나 디렉토리의 사용자 정보가 무단 조회된 사례가 있습니다.
🏷️ CWE-90 OWASP A03 Injection
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류