从一次漏洞挖掘入门Ldap注入
字数 1520 2025-08-26 22:11:34

LDAP注入漏洞挖掘与利用详解

1. LDAP基础概念

1.1 什么是LDAP

LDAP(Lightweight Directory Access Protocol)即轻量级目录访问协议,是一种运行于TCP/IP之上的在线目录访问协议,主要用于目录中资源的搜索和查询。最广泛使用的LDAP服务包括:

  • 微软的ADAM(Active Directory Application Mode)
  • OpenLDAP

1.2 LDAP数据存储结构

与MySQL等关系型数据库不同,LDAP采用树形结构存储数据:

  • dn(Distinguished Name):一条记录的位置
  • dc(Domain Component):一条记录所属的区域
  • ou(Organizational Unit):一条记录所属的组织
  • cn/uid(Common Name/User ID):一条记录的名字/ID

1.3 LDAP核心组件

  1. 条目(Entry):目录中存储的基本信息单元,包含若干属性和值,可包含子条目
  2. 对象类(ObjectClass)
    • 封装了可选/必选属性
    • 支持继承关系
    • 严格的等级之分(顶层是top和alias)
  3. 属性(Attribute):存储字段值,每个属性分配唯一的OID号码

2. LDAP查询语法

2.1 基本查询结构

一个圆括号内的判断语句称为过滤器(filter):

("&" or "|" (filter1) (filter2) (filter3))

2.2 逻辑操作符

  1. 逻辑与(&)

    (&(username=Hpdoger)(password=ikun))
    

    查找username为Hpdoger且password为ikun的所有条目

  2. 逻辑或(|)

    (|(username=Hpdoger)(displayname=Hpdoger))
    

    查找username或displayname为Hpdoger的所有条目

2.3 特殊符号

  • (&):绝对真(Absolute TRUE)
  • (|):绝对假(Absolute FALSE)
  • *:通配符

注意:LDAP的DN和所有属性默认不区分大小写。

3. LDAP注入原理

3.1 无逻辑操作符的注入

场景

(attribute=$input)

构造输入

$input=value)(injected_filter

完整查询语句

(attribute=value)(injected_filter)

影响

  • OpenLDAP:忽略第二个过滤器
  • ADAM:不允许有两个过滤器的查询

利用方法
使用通配符判断字段是否存在某值:

$input=x*

3.2 带有逻辑操作符的注入

场景1

(|(attribute=$input)(second_filter))

场景2

(&(attribute=$input)(second_filter))

构造输入

value)(injected_filter)

变形后的过滤器

(&(attribute=value)(injected_filter))(second_filter)

实际案例(万能密码)
原始查询:

(&(USER=$username)(PASSWORD=$pwd))

注入输入:

$username = admin)(&)(

变形后的查询:

(&(USER=admin)(&))((PASSWORD=$pwd))

4. 实战案例分析

4.1 漏洞发现

  1. 发现SSO系统登录点存在不同回显
  2. 通过!字符测试确认布尔型注入点
  3. 确认是LDAP注入漏洞

4.2 信息收集

  1. 确定objectclass

    username=admin)(objectclass%3d$str
    

    发现存在personuser两个objectclass

  2. 枚举属性

    username=admin)($str%3d*
    
  3. 继承链分析

    top -> person -> organizationalperson -> user
    

4.3 数据盲注

  1. 盲注手机号

    username=admin)(mobile=%s*&password=123
    

    通过通配符逐步添加数字猜测

  2. 盲注用户名

    • 使用笛卡尔积方法生成用户名组合
    • 通过通配符测试存在性

5. 防御措施

  1. 输入验证

    • 过滤特殊字符(( ) | & *等)
    • 使用白名单验证输入格式
  2. 权限控制

    • 限制LDAP查询账户的权限
    • 禁止匿名查询
  3. 编码处理

    • 对用户输入进行LDAP编码
  4. 使用预编译语句

    • 类似SQL的预编译方式处理LDAP查询

6. 扩展知识

  1. LDAP注入类型

    • AND注入
    • OR注入
    • 盲注
  2. 历史漏洞参考

    • Joomla! LDAP注入导致登录认证绕过漏洞
    • 其他Web应用中的LDAP实现漏洞
  3. 工具推荐

    • LDAP查询工具(如Apache Directory Studio)
    • 模糊测试工具(如Burp Suite)

通过深入理解LDAP协议和查询机制,结合实际的注入案例,安全研究人员可以有效地发现和利用LDAP注入漏洞,同时也为开发人员提供了加固系统的思路。

LDAP注入漏洞挖掘与利用详解 1. LDAP基础概念 1.1 什么是LDAP LDAP(Lightweight Directory Access Protocol)即轻量级目录访问协议,是一种运行于TCP/IP之上的在线目录访问协议,主要用于目录中资源的搜索和查询。最广泛使用的LDAP服务包括: 微软的ADAM(Active Directory Application Mode) OpenLDAP 1.2 LDAP数据存储结构 与MySQL等关系型数据库不同,LDAP采用树形结构存储数据: dn (Distinguished Name):一条记录的位置 dc (Domain Component):一条记录所属的区域 ou (Organizational Unit):一条记录所属的组织 cn/uid (Common Name/User ID):一条记录的名字/ID 1.3 LDAP核心组件 条目(Entry) :目录中存储的基本信息单元,包含若干属性和值,可包含子条目 对象类(ObjectClass) : 封装了可选/必选属性 支持继承关系 严格的等级之分(顶层是top和alias) 属性(Attribute) :存储字段值,每个属性分配唯一的OID号码 2. LDAP查询语法 2.1 基本查询结构 一个圆括号内的判断语句称为过滤器(filter): 2.2 逻辑操作符 逻辑与(&) : 查找username为Hpdoger且password为ikun的所有条目 逻辑或(|) : 查找username或displayname为Hpdoger的所有条目 2.3 特殊符号 (&) :绝对真(Absolute TRUE) (|) :绝对假(Absolute FALSE) * :通配符 注意 :LDAP的DN和所有属性默认不区分大小写。 3. LDAP注入原理 3.1 无逻辑操作符的注入 场景 : 构造输入 : 完整查询语句 : 影响 : OpenLDAP:忽略第二个过滤器 ADAM:不允许有两个过滤器的查询 利用方法 : 使用通配符判断字段是否存在某值: 3.2 带有逻辑操作符的注入 场景1 : 场景2 : 构造输入 : 变形后的过滤器 : 实际案例(万能密码) : 原始查询: 注入输入: 变形后的查询: 4. 实战案例分析 4.1 漏洞发现 发现SSO系统登录点存在不同回显 通过 ! 字符测试确认布尔型注入点 确认是LDAP注入漏洞 4.2 信息收集 确定objectclass : 发现存在 person 和 user 两个objectclass 枚举属性 : 继承链分析 : 4.3 数据盲注 盲注手机号 : 通过通配符逐步添加数字猜测 盲注用户名 : 使用笛卡尔积方法生成用户名组合 通过通配符测试存在性 5. 防御措施 输入验证 : 过滤特殊字符( ( ) | & * 等) 使用白名单验证输入格式 权限控制 : 限制LDAP查询账户的权限 禁止匿名查询 编码处理 : 对用户输入进行LDAP编码 使用预编译语句 : 类似SQL的预编译方式处理LDAP查询 6. 扩展知识 LDAP注入类型 : AND注入 OR注入 盲注 历史漏洞参考 : Joomla ! LDAP注入导致登录认证绕过漏洞 其他Web应用中的LDAP实现漏洞 工具推荐 : LDAP查询工具(如Apache Directory Studio) 模糊测试工具(如Burp Suite) 通过深入理解LDAP协议和查询机制,结合实际的注入案例,安全研究人员可以有效地发现和利用LDAP注入漏洞,同时也为开发人员提供了加固系统的思路。