LDAP 注入:一个被忽视但危险的目录服务注入漏洞
好的,我现在需要帮用户总结这篇文章的内容。首先,我得仔细阅读文章,了解它的主要结构和重点。文章标题是关于LDAP注入的,看起来是一篇技术性的文章。 文章开头介绍了LDAP注入的定义和风险,指出它类似于SQL注入,但针对的是LDAP查询。接着详细解释了LDAP查询的语法和注入原理,包括如何构造Payload进行攻击。然后是实战部分,讨论了如何探测漏洞、构造Payload以及代码审计的方法。最后给出了防御要点和最佳实践。 用户的要求是用中文总结内容,控制在100字以内,并且不需要特定的开头。我需要提炼出文章的核心内容:LDAP注入的定义、风险、攻击方式、防御措施等。 可能需要注意的是,不要遗漏关键点,比如认证绕过、信息泄露、权限提升这些风险类别。同时要提到防御措施中的转义函数和最小权限原则。 现在试着组织语言:LDAP注入是一种目录服务攻击漏洞,可能导致认证绕过、信息泄露等高风险。文章详细介绍了攻击方式、防御策略及代码审计方法。 检查一下字数是否在限制内,并确保信息准确全面。 </think> LDAP注入是一种目录服务攻击漏洞,可能导致认证绕过、信息泄露等高风险。文章详细介绍了攻击方式、防御策略及代码审计方法。 2025-12-29 07:49:13 Author: www.freebuf.com(查看原文) 阅读量:4 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

LDAP 注入是一种与 SQL 注入高度相似的目录服务攻击漏洞。当应用程序不安全地将用户输入直接拼接到 LDAP 查询过滤器中时,攻击者可以通过注入特殊的 LDAP 元字符(如*()&|!=等),改变查询逻辑,导致认证绕过信息泄露权限提升或目录数据修改。

LDAP 广泛应用于企业身份认证(如 Active Directory、OpenLDAP),承载高价值数据(如用户凭证、组织架构、权限配置)。一旦注入成功,风险往往与高危 SQL 注入相当,甚至更高,因为它可能直接影响整个域环境的认证系统。

一、漏洞简介与风险剖析

  1. 什么是 LDAP 注入?
    定义:应用程序使用未验证或未转义的用户输入动态构造 LDAP 过滤器时,攻击者注入控制字符,干扰或重写查询逻辑。

  2. 核心风险

    风险类别描述影响程度
    认证绕过构造恒真过滤器(如 `*)((objectClass=*)`),跳过用户名/密码校验,直接登录
    信息枚举/泄露使用通配符*列出所有条目,暴露用户列表、邮箱、组、服务器等内部结构
    权限提升枚举信息后用于密码喷洒、横向移动,最终获取域管理员权限极高
    目录修改若绑定账号权限高,可未经授权修改/删除目录数据中到高
    拒绝服务注入复杂嵌套过滤器导致服务器资源耗尽

    2015 年 Ashley Madison 数据泄露事件中,攻击者利用 LDAP 注入绕过认证,泄露数百万用户数据。

二、LDAP 查询语法与注入原理

  1. LDAP 过滤器基础
    LDAP 过滤器采用前缀 notation,支持逻辑运算和通配符:

    元字符含义示例注入影响
    &逻辑 AND(&(uid=user)(pass=pwd))联合条件
    ``逻辑 OR`(
    !逻辑 NOT(!(objectClass=group))取反条件
    *通配符(cn=joh*)模糊匹配所有
    ()分组/结构边界用于定义过滤器边界关闭原有条件,注入新逻辑
    \00空字节可用于截断某些实现边界绕过

    注入核心:未转义的元字符会被 LDAP 服务器解释为操作符,导致查询意图被篡改。

  2. 漏洞原理与 Payload 构造详解
    常见模式:应用程序拼接过滤器如(&(uid=输入)(objectClass=person))

    认证绕过 Payload 示例

    • 输入用户名:admin)(|(uid=*)(密码随意)
      最终过滤器:(&(uid=admin)(|(uid=*))(objectClass=person))→ OR 条件恒真,绕过密码校验。
    • 输入用户名:*)(|(objectClass=*)
      最终过滤器:(&(uid=*)(|(objectClass=*))(objectClass=person))→ 匹配所有对象。
    • 输入用户名:*)(uid=*))(|(uid=*(经典 OWASP 示例)
      最终过滤器始终为真。

    信息泄露 Payload 示例

    • 输入搜索词:*→ 返回所有条目。
    • 输入:*)(mail=*)→ 枚举所有邮箱。
    • 输入:)(|(cn=*)(mail=*)→ 返回所有 cn 或 mail。

    权限提升示例

    • 先枚举用户列表:输入*)(objectClass=user)→ 获取所有 uid。
    • 再结合密码喷洒攻击常见弱密码。

    不同语言不安全代码示例

    • Python

      filter = f"(&(uid={user_input})(userPassword={password}))"
      
    • Java(JNDI):

      String filter = "(&(uid=" + userInput + ")(objectClass=person))";
      
    • .NET

      string filter = $"(&(uid={userInput})(objectClass=person))";
      
  3. 盲注(Blind LDAP Injection)
    当无直接错误或结果返回时,类似 SQL 盲注:

    • 布尔盲注:构造真/假条件,根据响应差异(登录成功/失败、结果数量)枚举。
      示例 Payload:*)(objectClass=user)(真:返回结果多;假:无结果)。
      逐步枚举属性值:如检查密码首字符是否 'a':*)(userPassword=a*)
    • 时间盲注:注入复杂嵌套 OR/NOT 查询耗时,根据响应延迟判断(某些实现支持)。
    • 属性发现:盲注枚举常见属性(如 department、mail)是否存在。

三、实战思路:探测、Payload 构造与代码审计

  1. 探测与定位方向

    • 登录/SSO 页面、搜索功能(员工目录、邮箱查找)。
    • 指纹探测:输入*()&|,观察结果增多、错误或异常行为。
  2. 常见 Payload 构造表(测试用例扩展)

    编号输入 Payload目的预期效果
    T1alice基线正常正常匹配
    T2*通配符泄露返回所有条目
    T3*)((objectClass=*)认证绕过
    T4admin)((uid=*)伪造管理员登录
    T5)(mail=)枚举邮箱泄露所有 mail
    T6\00空字节截断绕过某些校验
    T7jo‍hn(零宽字符)不可见绕过绕过正则/黑名单
    T8)(userPassword=a)盲注枚举密码首字符布尔响应差异
    T9%2A%28%29(URL 编码)编码绕过解码后注入
  3. 代码审计(SAST)与检测

    • 常见危险模式:字符串拼接构造过滤器(如+f-stringString.format)。

    • Semgrep 规则扩展示例(支持 Python/Java/JS/.NET):

      rules:
        - id: ldap-injection-detect
          patterns:
            - pattern-either:
                - pattern: "... + $USER + ..."
                - pattern: f"...{$USER}..."
                - pattern: String.format("...(uid=%s)...", $USER)
          message: "潜在 LDAP 注入:避免字符串拼接构造过滤器,使用参数化或转义函数。"
          languages: [python, java, javascript, csharp]
          severity: ERROR
      
    • 其他语言审计点

      • Java:检测new InitialDirContext+ 字符串拼接。
      • .NET:检测DirectorySearcher.Filter拼接。
      • Python:检测未使用ldap3.utils.conv.escape_filter_chars

    单元测试示例(Python ldap3):

    @pytest.mark.parametrize("input_value, expected_escaped", [
        ("alice", "alice"),
        (")(|(objectClass=*)", "\\29\\28\\7c\\28objectClass\\3d\\2a\\29\\29"),
        ("*", "\\2a"),
        ("\\", "\\5c"),
    ])
    def test_escape_effective(input_value, expected_escaped):
        safe = escape_filter_chars(input_value)
        assert expected_escaped in safe
        assert any(char in safe for char in "()*&|!") == False  # 未转义形式不应出现
    

四、防御要点与最佳实践

遵循深度防御:输入处理 + 权限控制 + 监控。

  1. 首选防御:转义与参数化

    • 专用转义函数(RFC 4515 标准):

      语言推荐函数/库
      Pythonldap3.utils.conv.escape_filter_chars()
      JavaUnboundID SDK 或手动转义\*\2a
      .NETSystem.DirectoryServices+ 自定义转义
      PHPldap_escape()(LDAP_ESCAPE_FILTER)
    • 参数化查询:避免拼接,使用库提供的模板(如 Java{0}占位)。

    • 白名单验证:用户名仅允许[a-zA-Z0-9_-],拒绝其他。

  2. 最小权限原则

    • 应用绑定账号仅授予必要读取权限,禁止修改。
    • 避免使用域管理员账号。
  3. 运行时监控与辅助

    • 日志异常查询:含大量*|、嵌套括号或结果异常多。
    • 速率限制登录/搜索接口。
    • WAF 规则阻挡常见 Payload(但非万能,易被零宽/编码绕过)。
    • 错误遮蔽:不返回 LDAP 原始错误。
  4. 开发者/运维 Checklist

    状态检查项
    必做输入是否经转义/白名单?
    必做绑定账号是否最小权限(只读)?
    推荐CI 是否集成 SAST 检测拼接?
    推荐是否有绕过向量单元测试?
    运维是否监控异常查询模式?

总结

LDAP 注入虽不如 SQL 注入常见,但企业环境中危害极大,可能直接导致域渗透。核心防御:绝不拼接字符串,始终使用专用转义/参数化函数;结合最小权限与监控,形成多层防线。开发阶段通过 SAST 与单元测试捕获,生产环境通过日志审计阻断,才能有效降低风险。

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/vuls/464222.html
如有侵权请联系:admin#unsafe.sh