LDAP注入是一种针对使用LDAP(轻量级目录访问协议)进行查询或认证的Web应用程序的攻击技术。攻击者通过向LDAP查询语句中注入恶意代码,来绕过认证、获取未授权数据或修改目录信息。
LDAP基础概念
LDAP查询使用过滤器语法:
(attribute=value)- 基本过滤条件
&(cond1)(cond2)- AND操作
|(cond1)(cond2)- OR操作
!- NOT操作
*- 通配符
示例查询:
ldap
(cn=John*) (&(objectClass=user)(uid=jdoe))
LDAP注入原理
1. 身份验证绕过
最常见的攻击场景是登录绕过。
正常查询:
ldap
(&(uid=userInput)(password=userPass))
注入攻击:
sql
用户名: admin)(uid=*) 密码: 任意
结果查询变为:
ldap
(&(uid=admin)(uid=*))(password=任意))由于
(uid=*)总是为真,查询成功验证!
2. 信息泄露
通过精心构造的查询获取额外信息。
示例:
sql
用户名: *)(uid=*
查询变为:
ldap
(&(uid=*)(uid=*))(password=xxx))
可能返回所有用户信息。
LDAP注入类型
1. AND注入
python
# 原始查询: (&(uid=INPUT1)(password=INPUT2)) # 攻击输入: 用户名: admin)(&) # 使整个条件为真 密码: xxx # 最终查询: (&(uid=admin)(&))(password=xxx)) # LDAP解析为: (&(uid=admin)(&)) 和 (password=xxx)
2. OR注入
python
# 原始查询: (|(uid=INPUT1)(password=INPUT2)) # 攻击输入: 用户名: admin)(uid=admin 密码: 任意 # 最终查询: (|(uid=admin)(uid=admin)(password=任意)) # 返回uid=admin的记录
3. 盲注(Blind Injection)
当错误信息不显示时,通过布尔逻辑判断:
python
# 测试用户是否存在 用户名: admin)(uid=*))(&(uid=admin # 如果返回成功,说明admin存在 # 提取信息 - 测试密码第一个字符 用户名: admin)(password=a*))(&(uid=admin
总结
LDAP注入是严重的安全漏洞,可能导致:
-
身份验证绕过
-
敏感信息泄露
-
目录数据篡改
-
权限提升
关键防御策略:
-
始终验证和过滤用户输入
-
使用参数化查询或预编译语句
-
实施适当的错误处理(不泄露详细信息)
-
定期进行安全测试和代码审查
-
保持LDAP服务器和库的更新
通过实施这些措施,可以显著降低LDAP注入的风险,保护目录服务的安全性。