插件窝 干货文章 LDAP注入该如何理解

LDAP注入该如何理解

LDAP 输入 注入 转义 781    来源:    2025-04-22

LDAP注入理解与防护

LDAP注入(LDAP Injection)是一种针对轻量目录访问协议(LDAP)目录服务的攻击技术,类似于SQL注入,攻击者通过构造恶意输入来修改LDAP查询语句的逻辑。

LDAP注入的基本原理

  1. 工作方式:当应用程序将用户输入直接拼接到LDAP查询语句中时,攻击者可以通过精心构造的输入来改变原始查询的语义。

  2. 攻击目标

    • 绕过身份验证
    • 获取未授权访问
    • 泄露敏感信息
    • 修改目录数据

LDAP注入示例

1. 认证绕过示例

假设应用程序使用以下LDAP查询进行用户认证:

(&(uid=USER_INPUT)(userPassword=PASSWORD_INPUT))

攻击者可以输入:

*)(uid=*))(|(uid=*

最终查询变为:

(&(uid=*)(uid=*))(|(uid=*)(userPassword=xxx))

这将返回所有用户,可能绕过认证。

2. 信息泄露示例

如果查询为:

(cn=USER_INPUT)

攻击者输入:

*)(objectClass=*

查询变为:

(cn=*)(objectClass=*)

这将返回所有对象的信息。

LDAP注入防护措施

  1. 输入验证

    • 使用白名单验证输入格式
    • 过滤特殊字符:* ( ) \ / NUL
  2. 参数化查询

    • 使用LDAP API提供的参数化查询功能
    • 避免直接拼接用户输入
  3. 转义处理

    • 对用户输入中的特殊字符进行转义
    • 例如将(转义为\28)转义为\29
  4. 最小权限原则

    • LDAP连接使用最小必要权限
    • 限制匿名访问
  5. 编码输出

    • 对从LDAP返回的数据进行HTML编码后再显示
  6. 使用框架安全功能

    • 利用现代框架(如Spring LDAP)的内置安全功能

实际防御代码示例(Java)

// 使用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的应用程序至关重要,特别是在处理身份验证和目录查询功能时。