LDAP(Light Directory Access Portocol)는 X.500 표준을 기반으로 하는 경량 디렉터리 액세스 프로토콜로 디렉터리 데이터베이스 액세스 방법을 제공하는 데 자주 사용됩니다. 디렉토리 데이터베이스. 디렉토리는 질의, 탐색, 검색에 최적화된 전문 분산 데이터베이스로, Linux/Unix 시스템의 파일 디렉토리와 유사한 트리 구조로 데이터를 구성합니다. 공인 인증서, 보안 키, 회사의 물리적 장치 정보 등 자주 변경되지 않는 데이터를 디렉터리에 저장하는 데 적합합니다. SQL과 유사하게 LDAP는 쿼리 구문과 잠재적인 주입 공격 위험이 있는 검색 프로토콜입니다. LDAP 인젝션이란 클라이언트가 쿼리 요청을 보낼 때 입력 문자열에 일부 특수 문자가 포함되어 LDAP의 원래 쿼리 구조가 수정되어 더 많은 승인되지 않은 데이터에 접근할 수 있게 하는 공격 방법을 말합니다.
이 글에서는 CWE ID 90: LDAP 쿼리에 사용된 특수 요소의 부적절한 중립화('LDAP 주입') 샘플에 포함된 LDAP 주입 취약점의 원인과 복구 방법을 분석하기 위해 JAVA 언어 소스 코드를 예로 들어 설명합니다. 자세한 내용은 다음을 참조하세요.
CWE ID 90: LDAP 쿼리에 사용된 특수 요소의 부적절한 중립화('LDAP 삽입')
http://cwe.mitre.org/data/definitions/90.html
CWE ID 639: 사용자 제어 키를 통한 인증 우회
http://cwe.mitre.org/data/definitions/639.html
2. LDAP 주입의 위험
LDAP 주입은 사용자가 도입한 매개 변수를 사용하여 악성 LDAP 쿼리를 생성하고 LDAP 필터를 구성하여 액세스 제어 및 사용자 권한 상승을 우회하는 것입니다. 일반 필터 구성을 통해 AND, OR 연산 주입을 구현하여 민감한 정보를 획득합니다.
2018년 1월부터 2019년 1월까지 CVE에는 이와 관련된 취약점 정보가 총 4개 있었습니다. 일부 취약점은 다음과 같습니다.
CVE 번호 | Overview |
---|---|
CVE-2018-12689 | phpLDAPadmin 1.2.2는 cmd.php를 통해 허용됩니다. ? cmd=loginform 요청에서 조작된 serverid 매개변수 또는 로그인 패널에서 조작된 사용자 이름 및 비밀번호를 사용한 LDAP 주입. |
CVE-2018-5730 | MIT krb5 1.6 이상에서는 인증된 kadmin이 LDAP Kerberos 데이터베이스에 주체를 추가하여 "linkdn" 및 "containerdn" 데이터베이스 매개변수를 제공하여 DN 컨테이너 검사를 우회하거나 DN 컨테이너를 우회할 수 있습니다. DN 문자열을 확장자로 제공하여 확인하세요. |
CVE-2016-8750 | 4.0.8 이전의 Apache Karaf는 LDAPLoginModule을 사용하여 LDAP를 통해 사용자를 인증합니다. 그러나 사용자 이름은 올바르게 인코딩되지 않았으므로 LDAP 주입 공격에 취약하여 서비스 거부가 발생합니다. |
CVE-2011-4069 | PacketFence html/admin/login.php 3.0.2 이전에서는 원격 공격자가 조작된 사용자 이름을 통해 인증을 우회하기 위해 LDAP 주입 공격을 수행할 수 있습니다. |
예제는 Samate Juliet Test Suite for Java v1.3(https://samate.nist.gov/SARD/testsuite.php), 소스 파일 이름: CWE90_LDAP_Injection__connect_tcp_01.java에서 가져온 것입니다.
위 샘플 코드의 39~61행에서 프로그램은 TCP 연결을 만들고 소켓 데이터를 읽고 이를 data
, 118행에서 LDAP 쿼리 문을 동적으로 구성하고 119행에서 실행합니다. 예를 들어, 개인에는 성(sn), 이름(cn), 전화번호(telephoneNumber) 및 비밀번호(userPassword)와 같은 속성이 포함되어 있습니다. 이 쿼리는 data
변수라는 직원이 있는지 확인하기 위한 것이지만, 데이터 내용에 대한 필터링을 수행합니다
. 가장 간단한 인젝션 방법을 사용하면, 들어오는 매개변수의 값이 "*"일 경우 구축된 동적 쿼리 조건은 "(cn=*)"가 되어 전체 직원의 정보를 쿼리할 수 있어 정보 유출이 발생하게 된다. data
,在118 行动态构造一个 LDAP 查询语句,119 行对其加以执行。LDAP 为人员组织机构封装了常见的对象类,比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码 (userPassword) 等属性。该查询为了验证是否存在名为变量 data
的员工,但并未对变量 data
的内容做任何过滤。使用最简单的注入方式,令传入参数的值为“*”,则构造的动态查询条件为 "(cn=*)”,这样可以查询到所有员工的信息,导致信息泄露。
对上文中的样例代码进行360代码卫士检测后,发现存在“LDAP注入”漏洞,安全等级评定为高。数据污染源以及数据流向可以通过跟踪路径分析得出并在代码的第120行报告缺陷,图1亦如是
图1:LDAP 注入的检测示例
在上述修复代码中,第119行使用 javax.naming.ldap
包下扩展类 BaseControl
接收需要被处理的参数,第120行 control
对象调用 getEncodedValue()
方法将接收的参数 data
进行编码,编码后的值为字符对应的 ASN.1BER
그림 1: LDAP 주입 감지 예
javax.naming.ldap
BaseControl
패키지 아래의 확장 클래스는 필요한 매개변수를 받습니다. 처리되면 120행control
객체가 getEncodedValue()
메서드를 호출하여 매개변수 수신데이터
가 인코딩되고, 인코딩된 값은 ASN.1BER입니다. code> 해당 문자에 해당하는 인코딩 값입니다. 인코딩된 바이트 배열에는 명령 구문 분석과 관련된 특수 문자가 포함되어 있지 않으며 정상적인 구조와 내용으로 LDAP 쿼리 문을 구성할 수 있으므로 LDAP 삽입 발생을 방지할 수 있습니다. <blockquote>
<ul class=" list-paddingleft-2">360 코드가드를 이용해 복구된 코드를 검출해 보면 "LDAP 주입" 불량이 더 이상 존재하지 않는 것을 확인할 수 있습니다. 그림 2와 같이: <li><p></p></li>
<li><p>그림 2: 복구 후 탐지 결과 </p></li>
</ul>4. LDAP 주입을 방지하는 방법</blockquote>🎜🎜LDAP 주입의 근본 원인은 공격자가 LDAP 메타 문자를 사용하여 LDAP의 의미를 수정한다는 것입니다. 쿼리. LDAP 필터를 구성할 때 프로그래머는 명령 구문 분석으로 처리해야 하는 문자와 데이터 구문 분석으로 처리해야 하는 문자를 명확히 해야 합니다. 공격자가 프로그래머의 다양한 미리 설정된 상황에 침입하는 것을 방지하려면 화이트리스트 방법을 사용하여 LDAP 쿼리의 사용자 제어 값이 전적으로 미리 결정된 문자 집합에서 나오며 LDAP 메타 문자를 포함하지 않도록 해야 합니다. 사용자 제어 숫자 범위 요구 사항에 LDAP 메타 문자가 포함되어야 하는 경우 해당 인코딩 메커니즘을 사용하여 LDAP 쿼리에서 이러한 메타 문자의 의미를 이스케이프 처리해야 합니다. 🎜🎜🎜🎜🎜&,! , |, =, ,,, +, -, ", ',; 이러한 문자는 일반적인 상황에서는 사용되지 않습니다. 사용자 입력에 나타나는 경우 백슬래시로 이스케이프해야 합니다. 🎜 🎜🎜 🎜백슬래시로 처리해야 할 뿐만 아니라 해당 문자를 해당 ASCII 코드 값으로 변환해야 하는 (,),,*,/,NUL과 같은 문자도 있습니다 🎜🎜🎜🎜.
위 내용은 LDAP 주입을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!