LDAP注入攻击原理与防御详解
字数 1321 2025-11-22 02:51:24
LDAP注入攻击原理与防御详解
1. 知识点描述
LDAP(轻量级目录访问协议)是一种用于访问和维护目录服务的协议,常用于企业身份认证系统(如Active Directory、OpenLDAP)。LDAP注入攻击是指攻击者通过构造恶意的输入,篡改LDAP查询语句的逻辑,从而绕过认证、越权访问或泄露敏感数据。其原理与SQL注入类似,但由于LDAP查询语法不同,需专门分析其注入点与利用方式。
2. LDAP查询基础语法
LDAP查询使用过滤器(Filter)表达式,常见语法如下:
- 逻辑运算符:
&(与)、|(或)、!(非) - 匹配规则:
=(等于)、>=(大于等于)、<=(小于等于) - 通配符:
*(匹配任意字符) - 示例查询:
- 验证用户登录:
(&(username=admin)(password=123456)) - 搜索用户:
(cn=*John*)
- 验证用户登录:
3. LDAP注入原理
攻击者通过输入包含LDAP元字符(如*、|、&、!、(、))的恶意数据,改变原始查询的逻辑结构。例如:
-
场景1:认证绕过
原始查询:(&(username=用户输入)(password=密码))
若用户输入admin)(*)),查询变为:
(&(username=admin)(*))(password=密码))
由于(*)匹配所有条目,且&操作符需所有条件为真,但部分LDAP实现可能忽略语法错误或宽松解析,导致绕过认证。 -
场景2:信息泄露
原始查询:(cn=用户输入)
若用户输入*)(objectClass=*))(|(cn=*,查询变为:
(cn=*)(objectClass=*))(|(cn=*)
通过注入*和逻辑运算符,可返回所有条目内容。
4. 注入步骤分解
步骤1:识别注入点
- 测试输入字段(如用户名、搜索框)是否允许特殊字符。
- 观察系统返回错误信息(如LDAP语法错误)或异常行为。
步骤2:构造Payload
- 闭合原参数:添加
)提前结束当前条件。 - 注入新条件:使用
|或&添加永真条件(如(cn=*))。 - 注释剩余部分:部分场景需用
))或通配符忽略后续查询。
步骤3:利用结果
- 认证绕过:通过永真条件使查询恒成立。
- 数据枚举:通过通配符逐步猜测字段值(如
a*、b*)。
5. 防御措施
- 输入过滤:转义LDAP元字符(如
\*、\28代替()。 - 白名单验证:仅允许合法字符(如字母数字)。
- 参数化查询:使用LDAP库的预编译接口(如Java的
InitialDirContext)。 - 最小权限原则:LDAP连接账户仅需读权限,避免滥用。
- 错误信息隐藏:禁止返回详细LDAP错误至前端。
6. 实例分析
假设登录查询为:
(&(username=输入1)(password=输入2))
攻击者输入:
- 用户名:
admin)(|(username=admin)) - 密码:任意值
最终查询变为:
(&(username=admin)(|(username=admin))(password=任意值))
若LDAP服务器忽略语法错误,仅评估(username=admin)条件,可能直接放行。
通过理解LDAP查询结构、注入点构造及防御方法,可有效应对此类攻击。