LDAP注入漏洞与防护
字数 912 2025-11-12 05:53:40
LDAP注入漏洞与防护
1. 漏洞描述
LDAP(轻量级目录访问协议)注入是一种通过操纵LDAP查询语句中的用户输入,破坏查询逻辑或未授权访问目录数据的攻击手法。类似SQL注入,攻击者通过构造特殊输入,使应用程序执行非预期的LDAP查询,可能导致信息泄露、权限提升或数据篡改。例如,登录功能若直接将用户输入拼接到LDAP过滤器中,可能被绕过认证。
2. LDAP查询基础
LDAP查询使用过滤器(Filter)语法,常见运算符:
&:逻辑与(例如&(条件1)(条件2))|:逻辑或(例如|(条件1)(条件2))!:逻辑非(例如!(条件))=:等值匹配(例如(cn=admin))
示例:登录查询过滤器可能为:
(&(username=输入用户名)(password=输入密码))
3. 漏洞产生场景
假设登录功能代码如下(伪代码):
username = request.getParameter("username")
password = request.getParameter("password")
filter = "(&(cn=" + username + ")(userPassword=" + password + "))"
若用户输入 admin)(cn=*))(|(cn=* 作为用户名,过滤器变为:
(&(cn=admin)(cn=*))(|(cn=*)(userPassword=...))
由于 | 运算符的优先级,查询会匹配所有 cn 属性存在的条目,从而绕过密码验证。
4. 攻击类型与示例
- 认证绕过:如上例,通过注入逻辑运算符使查询条件恒真。
- 信息泄露:注入通配符
*枚举数据,例如输入*作为用户名,查询(cn=*)返回所有条目。 - 权限提升:修改查询中的角色属性,例如注入
)(role=admin使查询附加高权限条件。
5. 防护方案
- 输入验证:
- 禁止输入中包含
( ) & | = *等特殊字符。 - 使用白名单限制格式(如用户名只允许字母数字)。
- 禁止输入中包含
- 参数化查询:使用LDAP库的转义函数(如Python的
ldap3.utils.conv.escape_filter_chars)对输入进行编码:from ldap3.utils.conv import escape_filter_chars safe_username = escape_filter_chars(username) - 最小权限原则:LDAP连接使用低权限账户,限制查询范围。
- 日志监控:记录异常查询行为,检测多次通配符使用。
6. 进阶防护
- 静态代码分析:自动化检测代码中的字符串拼接模式。
- Web应用防火墙(WAF):配置规则拦截包含LDAP关键字的异常请求。
- 定期渗透测试:模拟攻击验证防护措施有效性。
通过严格输入处理与安全编码实践,可有效消除LDAP注入风险。