LDAP注入(LDAP Injection)是一种针对轻量目录访问协议(LDAP)目录服务的攻击技术,类似于SQL注入,攻击者通过构造恶意输入来修改LDAP查询语句的逻辑。
工作方式:当应用程序将用户输入直接拼接到LDAP查询语句中时,攻击者可以通过精心构造的输入来改变原始查询的语义。
攻击目标:
假设应用程序使用以下LDAP查询进行用户认证:
(&(uid=USER_INPUT)(userPassword=PASSWORD_INPUT))
攻击者可以输入:
*)(uid=*))(|(uid=*
最终查询变为:
(&(uid=*)(uid=*))(|(uid=*)(userPassword=xxx))
这将返回所有用户,可能绕过认证。
如果查询为:
(cn=USER_INPUT)
攻击者输入:
*)(objectClass=*
查询变为:
(cn=*)(objectClass=*)
这将返回所有对象的信息。
输入验证:
* ( ) \ / NUL
等参数化查询:
转义处理:
(
转义为\28
,)
转义为\29
最小权限原则:
编码输出:
使用框架安全功能:
// 使用Spring LDAP的过滤条件构建器
import org.springframework.ldap.filter.AndFilter;
import org.springframework.ldap.filter.EqualsFilter;
public LdapQuery buildSafeQuery(String username) {
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("uid", username)); // 自动处理特殊字符
return query().filter(filter);
}
理解LDAP注入并实施适当的防护措施对于保护基于LDAP的应用程序至关重要,特别是在处理身份验证和目录查询功能时。