bee-boxLDAP注入学习之靶场练习
字数 2333 2025-08-18 11:38:52

LDAP注入攻击与防御全面指南

1. LDAP注入基础概念

LDAP(轻量级目录访问协议)注入是一种类似于SQL注入的攻击技术,攻击者通过构造恶意的输入来修改LDAP查询语句的逻辑,从而获取未授权的数据访问权限。

核心原理:LDAP注入的本质是通过精心构造的输入来"拼接圆括号",改变原始LDAP查询过滤器的逻辑结构。

2. LDAP关键函数详解

2.1 连接相关函数

  1. ldap_connect()

    • 功能:建立与LDAP服务器的连接
    • 语法:$LDAPCONN = ldap_connect($server)
    • 返回值:数值型,0表示连接失败,其他值表示成功
  2. ldap_set_option()

    • 功能:设置LDAP连接选项
    • 语法:ldap_set_option($link_identifier, $option, &$retval)
    • 重要选项:
      • LDAP_OPT_PROTOCOL_VERSION:设置协议版本(2或3)
      • LDAP_OPT_REFERRALS:控制是否自动追随引用
      • LDAP_OPT_NETWORK_TIMEOUT:设置网络超时
  3. ldap_bind()

    • 功能:绑定到LDAP目录
    • 语法:ldap_bind($link_identifier, $bind_rdn, $bind_password)
    • 参数说明:
      • $bind_rdn:登录路径,如cn=admin,dc=bwapp,dc=local
      • $bind_password:登录密码

2.2 查询相关函数

  1. ldap_search()

    • 功能:执行LDAP目录搜索
    • 语法:ldap_search($link_identifier, $dn, $filter)
    • 参数说明:
      • $dn:搜索的目录DN
      • $filter:搜索过滤器,如(objectClass=*)
  2. ldap_count_entries()

    • 功能:返回查询结果数量
    • 语法:ldap_count_entries($link_identifier, $search)

3. LDAP过滤器语法

3.1 基本运算符

运算符 字符 用途
等号 = 字段必须等于给定值
通配符 * 匹配除NULL外的任何值
括号 ( ) 分离过滤器逻辑
& 所有条件必须为真
| 至少一个条件为真
! 排除符合条件的对象

3.2 常用过滤器示例

  1. 返回所有对象:(objectClass=*)
  2. 返回所有用户对象:(&(objectClass=user)(objectCategory=person))
  3. 返回群组:(objectCategory=group)
  4. 排除特定条件:(&(&(objectClass=user)(objectCategory=person))(!(mail=test*)))
  5. 组合条件查询:(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))

4. LDAP注入技术详解

4.1 基本注入方法

  1. 通配符注入

    • 输入*可以匹配所有记录
    • 示例:(cn=*)会返回所有cn属性的记录
  2. 逻辑注入

    • 通过注入)(来闭合原有条件并添加新条件
    • 示例注入:*)(objectclass=* → 过滤器变为:(|(cn=*)(objectclass=*)(sn=*))

4.2 高级注入技巧

  1. 绕过认证

    • 构造(|(cn=admin)(cn=*))这样的过滤器,可能绕过认证
  2. 信息泄露

    • 通过注入获取敏感信息:*)(objectClass=user))(&(objectClass=*
  3. 权限提升

    • 修改过滤器获取管理员权限信息

5. 防御措施

5.1 输入验证

  1. 对用户输入进行严格的白名单验证
  2. 过滤特殊字符:( ) & | * ! =

5.2 安全编码实践

  1. 使用参数化查询或预编译的LDAP过滤器
  2. 最小权限原则:LDAP绑定账户只具有必要的最小权限

5.3 配置加固

  1. 启用LDAP协议版本3(更安全)
  2. 配置适当的访问控制列表(ACLs)
  3. 禁用匿名绑定

5.4 日志监控

  1. 监控异常的LDAP查询模式
  2. 设置查询结果数量限制

6. 实战案例解析

6.1 bwapp靶场分析

  1. 漏洞代码

    $filter = "(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for))";
    
  2. 注入过程

    • 正常输入:test(|(cn=test)(sn=test)(uid=test))
    • 恶意输入:*)(objectclass=*(|(cn=*)(objectclass=*)(sn=*)(uid=*))
  3. 结果

    • 返回所有对象,包括敏感的管理员账户

7. 附录:LDAP注入速查表

攻击类型 注入示例 效果
信息泄露 *)(objectClass=* 获取所有对象
绕过认证 `admin)( (cn=admin`
属性枚举 *)(mail=* 获取所有邮件地址
权限提升 *)(memberOf=CN=Admins 获取管理员列表

通过深入理解LDAP协议、过滤器语法和PHP的LDAP函数,安全人员可以更好地防御LDAP注入攻击,而渗透测试人员则可以更有效地发现此类漏洞。

LDAP注入攻击与防御全面指南 1. LDAP注入基础概念 LDAP(轻量级目录访问协议)注入是一种类似于SQL注入的攻击技术,攻击者通过构造恶意的输入来修改LDAP查询语句的逻辑,从而获取未授权的数据访问权限。 核心原理 :LDAP注入的本质是通过精心构造的输入来"拼接圆括号",改变原始LDAP查询过滤器的逻辑结构。 2. LDAP关键函数详解 2.1 连接相关函数 ldap_ connect() 功能:建立与LDAP服务器的连接 语法: $LDAPCONN = ldap_connect($server) 返回值:数值型,0表示连接失败,其他值表示成功 ldap_ set_ option() 功能:设置LDAP连接选项 语法: ldap_set_option($link_identifier, $option, &$retval) 重要选项: LDAP_OPT_PROTOCOL_VERSION :设置协议版本(2或3) LDAP_OPT_REFERRALS :控制是否自动追随引用 LDAP_OPT_NETWORK_TIMEOUT :设置网络超时 ldap_ bind() 功能:绑定到LDAP目录 语法: ldap_bind($link_identifier, $bind_rdn, $bind_password) 参数说明: $bind_rdn :登录路径,如 cn=admin,dc=bwapp,dc=local $bind_password :登录密码 2.2 查询相关函数 ldap_ search() 功能:执行LDAP目录搜索 语法: ldap_search($link_identifier, $dn, $filter) 参数说明: $dn :搜索的目录DN $filter :搜索过滤器,如 (objectClass=*) ldap_ count_ entries() 功能:返回查询结果数量 语法: ldap_count_entries($link_identifier, $search) 3. LDAP过滤器语法 3.1 基本运算符 | 运算符 | 字符 | 用途 | |--------|------|------| | 等号 | = | 字段必须等于给定值 | | 通配符 | * | 匹配除NULL外的任何值 | | 括号 | ( ) | 分离过滤器逻辑 | | 与 | & | 所有条件必须为真 | | 或 | \| | 至少一个条件为真 | | 非 | ! | 排除符合条件的对象 | 3.2 常用过滤器示例 返回所有对象: (objectClass=*) 返回所有用户对象: (&(objectClass=user)(objectCategory=person)) 返回群组: (objectCategory=group) 排除特定条件: (&(&(objectClass=user)(objectCategory=person))(!(mail=test*))) 组合条件查询: (|(&(objectClass=user)(objectCategory=person))(objectCategory=group)) 4. LDAP注入技术详解 4.1 基本注入方法 通配符注入 : 输入 * 可以匹配所有记录 示例: (cn=*) 会返回所有cn属性的记录 逻辑注入 : 通过注入 )( 来闭合原有条件并添加新条件 示例注入: *)(objectclass=* → 过滤器变为: (|(cn=*)(objectclass=*)(sn=*)) 4.2 高级注入技巧 绕过认证 : 构造 (|(cn=admin)(cn=*)) 这样的过滤器,可能绕过认证 信息泄露 : 通过注入获取敏感信息: *)(objectClass=user))(&(objectClass=* 权限提升 : 修改过滤器获取管理员权限信息 5. 防御措施 5.1 输入验证 对用户输入进行严格的白名单验证 过滤特殊字符: ( ) & | * ! = 5.2 安全编码实践 使用参数化查询或预编译的LDAP过滤器 最小权限原则:LDAP绑定账户只具有必要的最小权限 5.3 配置加固 启用LDAP协议版本3(更安全) 配置适当的访问控制列表(ACLs) 禁用匿名绑定 5.4 日志监控 监控异常的LDAP查询模式 设置查询结果数量限制 6. 实战案例解析 6.1 bwapp靶场分析 漏洞代码 : 注入过程 : 正常输入: test → (|(cn=test)(sn=test)(uid=test)) 恶意输入: *)(objectclass=* → (|(cn=*)(objectclass=*)(sn=*)(uid=*)) 结果 : 返回所有对象,包括敏感的管理员账户 7. 附录:LDAP注入速查表 | 攻击类型 | 注入示例 | 效果 | |---------|---------|------| | 信息泄露 | *)(objectClass=* | 获取所有对象 | | 绕过认证 | admin)(|(cn=admin | 可能绕过认证 | | 属性枚举 | *)(mail=* | 获取所有邮件地址 | | 权限提升 | *)(memberOf=CN=Admins | 获取管理员列表 | 通过深入理解LDAP协议、过滤器语法和PHP的LDAP函数,安全人员可以更好地防御LDAP注入攻击,而渗透测试人员则可以更有效地发现此类漏洞。