9.5 注入LDAP

LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)用于访问网络中的目录服务。目录是一个分级结构的数据存储区,其中可能包含任何类型的信息,但常用于保存个人 信息,如姓名、电话号码、电子邮件地址和工作职能等。Windows域中使用的Active Directory就是这种目录的一个典型示例。LDAP还常用在企业内联网Web应用程序中,如允许用户查看并修改雇员信息的人力资源应用程序。

每个LDAP查询使用一个或多个搜索过滤器,它们决定了请求返回的目录项。搜索过滤器可以使用各种逻辑运算符来表示复杂的搜索条件。最常用的搜索过滤器如下。

img002 简单匹配条件 (simple match conditions)对单个属性的值进行匹配。例如,通过用户名搜索用户的应用程序函数可能使用以下过滤器:

img278a

img002 析取查询 (disjunctive queries)指定多个条件,返回的目录项必须满足其中任何一个条件。例如,在多个目录属性中查找用户提供的搜索项的搜索函数可能使用以下过滤器:

img278b

img002 合取查询 (conjunctive queries)指定多个条件,返回的目录项必须满足所有这些条件。例如,LDAP中实施的登录机制可能使用以下过滤器:

img278c

和其他形式的注入一样,如果用户提交的输入不经任何确认即被插入到LDAP搜索过滤器中,攻击者就可以通过提交专门设计的输入来修改过滤器的结构,以检索数据或执行未授权操作。

一般而言,与SQL注入漏洞相比,LDAP注入漏洞更难以被攻击者利用,原因如下。

img002 搜索过滤器采用逻辑运算符来指定析取或合取查询的位置通常位于用户提交的数据的插入位置之前,因而无法被修改。因此,简单匹配条件和合取查询不会受与SQL注入类似的“or 1=1”类型的攻击。

img002 在常用的LDAP服务中,返回的目录属性将作为搜索过滤器中的独立参数传递给LDAP API,并且通常在应用程序中进行了硬编码。因此,攻击者无法通过修改用户提交的输入来检索与查询检索的属性不同的属性。

img002 应用程序很少返回有用的错误消息,因此,通常攻击者只能“盲目”利用各种漏洞。

9.5.1 利用LDAP注入

尽管存在上述限制,但在许多情况下,攻击者仍然可以利用LDAP注入漏洞从应用程序中获取数据,或执行未授权操作。通常,实施这类攻击的方法与搜索过滤器的结构、用户输入的进入点,以及后端LDAP服务本身的执行细节密切相关。

1.析取查询

以允许用户查看指定业务部门的雇员的应用程序为例。其搜索结果仅限于用户获得授权可以查看的地理区域。例如,如果一名用户获得授权可以查看伦敦和雷丁地区,并且他搜索的是“销售”部门,应用程序将执行以下析取查询:

img278d

这里,应用程序构建了一个析取查询,并在用户提交的输入之前前置了一些表达式来执行所需的访问控制。

在这种情况下,攻击者可以通过提交以下搜索项对查询进行修改,以返回所有地区的所有雇员的资料:

img279a

* 字符是LDAP中的通配符,可匹配任何数据项。如果将这个输入嵌入LDAP搜索过滤器中,应用程序将执行以下查询:

img279b

由于这是一个析取查询并且包含通配符搜索项(department=* ),因此,它会对所有目录项进行匹配。它会返回所有地区的所有员工的资料,从而突破应用程序的访问控制。