2009-05-25 18:31
----------------------------------------------------------------
LDAP 注入
首发:http://lovelaozang.cn
翻译整理:老臧
资料来源:milw0rm,网络
参考文档:《LDAP injections》 Author: ka0x
----------------------------------------------------------------

-[ INDEX ]-
0x01: Introduction
0x02: Filters LDAP
0x03: LDAP injection in Web Applications
0x04: Links

---[ 0x01: Introduction ]
LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同

,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。简单说来,LDAP是一个得到关于人或

者资源的集中、静态数据的快速方式。 LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大



为了更好地了解轻量级目录访问协议 (LDAP),下面介绍 X.500 和目录访问协议 (DAP)。 

在 X.500 中,目录系统代理 (DSA) 是存储目录信息的数据库。 该数据库在形式上采用层级结构,可提供快速而有效的搜索与检索。 

目录用户代理 (DUA) 所提供的功能能通过专用 DUA 客户机、Web 服务器网关、或电子邮件应用程序在所有类型的用户界面上实现。 

目录访问协议 (DAP) 是一种在 X.500 目录服务中使用的协议,用来控制 DUA 代理与 DSA 代理之间的通讯。 这些代理分别代表用户、程序和目录。 

X.500 目录服务是应用程序层的进程。 目录服务可用来为网络中的所有要素提供全局而一致的命名服务,在网络名和地址之间进行转换,提供关于目录中对象的说明,并为目录中

的所有对象提供唯一的名称。 这些 X.500 对象是由不同级别的每类信息(如国家、州、城市、和单位等)所构成层级结构。 

这些对象可以是文件(例如在一个文件系统目录列表中)、网络实体(例如在网络命名服务中,如 Novell 公司的 DNS 等)、或其它类型的实体。 

轻量协议就是任何一类针对在高速互联网中使用而设计的协议。 高速传输协议 (HSTP)、Xpress 传输协议 (XTP)、以及轻量目录访问协议 (LDAP) 都是这类协议。 

轻量协议采用比传统的网络和传输层协议更简单而有效的方式将路由和传输服务集成起来。 这样就使以更高的效率在 ATM 或 FDDI 等高速网络和光缆等媒体上进行传输成为可能

。 

轻量协议采用多种措施和改进方法使传输简化和加速,例如采用 TCP/IP 等面向连接的传输以及固定报头和报尾大小,进而能节省随每个数据包传输目的地地址的开销。 

轻量目录访问协议 (LDAP) 是 X.500 协议的一个子集。 所以,LDAP 客户机与 X.500 客户机相比,规模更小、速度更快、实现更简单。 LDAP 独立于厂家,并可与 X.500 配合使

用,但非一定要求与 X.500 配合使用。 

与 X.500 相反,LDAP 支持进行任何类型的 Internet 访问所必须的 TCP/IP。 LDAP 是一种开放式协议,而应用程序则独立于主持目录的服务器平台。 

Active Directory 不是一种 X.500 目录。 相反,它采用 LDAP 作为访问协议,且支持 X.500 信息模式,而不要求系统承担所有的 X.500 开销。 这样做就可以提供较高的互操

作性,而这种互操作性恰恰是管理现实生活中的异机种网络所必须的。 

Active Directory 可支持从任何使用 LDAP 的客户端通过 LDAP 协议进行的访问。 LDAP 名称不如 Internet 名称那样直观,但是 LDAP 命名的复杂性通常被应用程序所掩盖。 

LDAP 名称采用被称作“属性命名”的 X.500 命名规则。 

LDAP URL 给主持 Active Directory 服务的服务器以及对象的属性名称命名。 例如: LDAP://SomeServer.Myco.Com/CN=jamessmith,OU=Sys,OU=Product,
OU=Division,O=myco,C=US
LDAP C API (RFC 1823) 是一种指导性的 RFC,是编写 LDAP 应用程序 C 语言编程的事实上的标准。 

通过将 DNS 和 X.500 命名标准、LDAP、其他关键协议以及丰富的 API 的最佳功能结合起来,Active Directory 可对所有资源进行集中管理,这些资源包括: 文件、外围设备、

主机连接、数据库、Web 访问、用户、以及其它对象、服务、和网络资源。 

---[ 0x02: Filters LDAP ]
这是很重要的是要了解LDAP 过滤器是如何工作的。
FC 4515 (6/2006) (http://tools.ietf.org/html/rfc4515).

Filter = ( filtercomp )
Filtercomp = and / or / not / item
And = & filterlist
Or = | filterlist
Not = ! filter
Filterlist = 1*filter
Item = simple / present / substring
Simple = attr filtertype assertionvalue
Filtertype = "=" /"~="/ ">=" / "<="
Present = attr = *
Substring = attr "=" [initial] * [final]
Initial = assertionvalue
Final = assertionvalue


逻辑运算符:
- AND "&"
- OR "|"
- NOT "!"

关系运算符:
<=, >=, =, ~=

通配符"*" 用来取替代字符。

例如:
(&(objectClass=user)(uid=*))
: We return a list of all objects of type user, no matter
which takes the value of the attribute "uid."

PS:[在远程 LDAP 目录的“Directory Assistance”文档中配置搜索过滤器]

如果服务器使用目录服务搜索远程 LDAP 目录,可以使用该目录的“Directory Assistance”文档中的“Type of search filter to use”域,以控制使用哪种 LDAP 搜索过滤器

搜索目录。下面是可供选择的选项。 搜索过滤器选项 描述 
Standard LDAP(缺省) 使用标准的 LDAP 搜索过滤器,该过滤器适用于大多数 LDAP 目录服务器,包括 Domino、IBM 目录服务器和 Netscape/iPlanet 目录服务器 
Active Directory 使用适用于 Active Directory 服务器的预定义搜索过滤器。如果远程 LDAP 目录是 Active Directory,请选择此选项。 
Custom 用于定义自己的搜索过滤器。 
注意 Active Directory 搜索过滤器选项替代了 R5 NOTES.INI 中的设置项 WebAuth_AD_Group(该设置项允许搜索 Active Directory 群组)。 
定义定制的搜索过滤器
如果搜索未返回结果或返回错误的结果,可能需要定义定制的搜索过滤器。如果远程 LDAP 目录服务器使用非标准的架构,可能会出现这种情况。 

在“Type of search filter to use”域中选择“Custom”后,会出现下列三个用于定义定制的搜索过滤器的域。 定制搜索过滤器域 描述 
Mail Filter 如果目录服务是为 Notes 用户在目录中查找邮件地址而设置的,请指定一个用于在目录中查找名称的搜索过滤器。保留此域为空将使用下列缺省的搜索过滤器: 
(|(cn=%*)(|(&(sn=%a)(givenname=%z))(&(sn=%z)(givenname=%a))))

Authentication Filter 指定一个搜索过滤器,用于在使用远程 LDAP 目录验证客户机时搜索名称。保留此域为空将使用下列缺省的搜索过滤器: 
(|(cn=%*)(|(&(sn=%a)(givenname=%z))(&(sn=%z)(givenname=%a))))

Authorization Filter 指定一个搜索过滤器,用于在 Notes 数据库授权时查找群组成员。保留此域为空将使用下列缺省的搜索过滤器: 
(|(&(objectclass=groupOfUniqueNames)(UniqueMember=%*))(&(objectclass=groupOfNames)(Member=%*)))

要定义定制的搜索过滤器,应该熟悉 RFC 2251 和 2254 中描述的有效的搜索过滤器语法。 

定制 LDAP 搜索过滤器的语法
要定义定制的搜索过滤器,请将参数插入标准 LDAP 搜索过滤器中,以代表要搜索的名称的一部分。 名称部分 定义为 名称部分样例(粗体) 要插入的代表名称部分的参数 
名 从第一个字符到第一个空格或标点之间的字符串 Alex M Davidson %a 
姓 从最后一个空格或标点到最后一个字符之间的字符串 Alex M Davidson %z 
全名 完整姓名 Alex M Davidson %* 
本地部分 RFC 822 邮件地址的本地部分 amd@acme.com %l 
网络域部分 RFC 822 邮件地址的网络域部分 amd@acme.com %d 

定制的 LDAP 搜索过滤器样例 要搜索的名称 “Directory Assistance”文档中的搜索过滤器公式 用于搜索名称的搜索过滤器 
Alex M Davidson (|(gn=%a)(sn=%z)(cn=%*)(mail=%l)) (|(gn=Alex)(sn=Davidson)(cn=Alex M Davidson)(mail="")) 
amd (EmpID=%*) (EmpID=amd) 
amd (EmpID=%z) (EmpID="") 
amd (mail=%*@acme.com) (mail=amd@acme.com) 
amd (mail=%*@*) (mail=amd@*) 
amd@acme.com (mail=*@%d) (mail=*@acme.com) 
amd@acme.com (mail=%*) (mail=amd@acme.com) 
amd@acme.com (uid=%l) (uid=amd) 
blue (color=%*) (color=blue) 

---[ 0x03: LDAP injection in Web Applications ]

LDAP注入方法跟SQL注入方法十分相像。
攻击技术是用来经营的网站建成LDAP的判决,直接从
提供的数据用户。

易受攻击的代码评论:
+++++++++++++++++++++++++++++++++++++

line 0: <html>
line 1: <body>
line 2: <%@ Language=VBScript %>
line 3: <%
line 4: Dim userName
line 5: Dim filter
line 6: Dim ldapObj
line 7:
line 8: Const LDAP_SERVER = "ldap.example"
line 9:
line 10: userName = Request.QueryString("user")
line 11:
line 12: if( userName = "" ) then
line 13: Response.Write("<b>Invalid request. Please specify a valid user name</b><br>")
line 14: Response.End()
line 15: end if
line 16:
line 17:
line 18: filter = "(uid=" + CStr(userName) + ")" ' searching for the user entry
line 19:
line 20:
line 21: 'Creating the LDAP object and setting the base dn
line 22: Set ldapObj = Server.CreateObject("IPWorksASP.LDAP")
line 23: ldapObj.ServerName = LDAP_SERVER
line 24: ldapObj.DN = "ou=people,dc=spilab,dc=com"
line 25:
line 26: 'Setting the search filter
line 27: ldapObj.SearchFilter = filter
line 28:
line 29: ldapObj.Search
line 30:
line 31: 'Showing the user information
line 32: While ldapObj.NextResult = 1
line 33: Response.Write("<p>")
line 34:
line 35: Response.Write("<b><u>User information for : " + ldapObj.AttrValue(0) + "</u></b><br>")
line 36: For i = 0 To ldapObj.AttrCount -1
line 37: Response.Write("<b>" + ldapObj.AttrType(i) + "</b> : " + ldapObj.AttrValue(i) + "<br>" )
line 38: Next
line 39: Response.Write("</p>")
line 40: Wend
line 41: %>
line 42: </body>
line 43: </html>

+++++++++++++++++++++++++++++++++++++

在第10行注意变量userName初始化参数的user,然后迅速验证,看看是否值是零。
如果该值不是零,第18行就是用来初始化变量userName是的过滤器 。
第27行将用于,为这个新的变量直接建立一个LDAP搜索。
攻击者完全控制在LDAP server上什么会被咨询.当代码运行到32到40行时,你将得到咨询结果。所有的结果和属性将会展现给用户。

Example 1:
http://website/ldap.asp?user=*

在这个例子中派出性质的“ * ”参数在“用户”结束在变量的过滤器。
这一判断的LDAP将显示任何物体有一个属性的UID 。
我们证明了所有用户和他们的信息。

Example 2:
http://website/ldap.asp?user=laozang)(|(homedirectory=*)

它会向我们显示到用户laozang的路径 。他们可以在离开之前做代码测试。

---[ 0x03: Links ]

http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
http://es.wikipedia.org/wiki/LDAP
http://www.ldapman.org/
Insert mode
posted on 2011-04-11 14:06  微笑着忘记  阅读(819)  评论(0编辑  收藏  举报