6.4.8 LDAP注入

应该只接受校验后的应用输入的另一种数据存储是组织的X.500目录服务,这种服务一般使用轻量目录访问协议(LDAP)查询。允许LDAP查询的结构中存在未校验的输入,组织就会暴露在所谓的LDAP注入攻击面前。这种威胁使攻击者能够从LDAP树中提取重要的公司数据,如用户账户信息。操纵用于查询目录服务的过滤器,LDAP注入攻击能够对基于LDAP的单点登录环境进行破坏。考虑一个网站,允许你查询目录服务中的员工头衔,URL为:

http://www.megacorp.com/employee.asp?user=jwren

假定本页面的后台代码不校验输入:


<%@ Language=VBScript %>
<%
Dim userName
Dim filter
Dim ldapObj
userName = Request.QueryString("user")
filter = "(uid=" + CStr(userName) + ")"
Set ldapObj = Server.CreateObject("IPWorksASP.LDAP")
ldapObj.ServerName = LDAP_SERVER
ldapObj.DN = "ou=people,dc=megacorp,dc=com"
ldapObj.SearchFilter = filter
ldapObj.Search
While ldapObj.NextResult = 1
Response.Write("<p>")
Response.Write("<cTypeface:Bold><u>User information for: " +
ldapObj.AttrValue(0) + "</u></b><br>")
For i = 0 To ldapObj.AttrCount -1
Response.Write("<cTypeface:Bold>" + ldapObj.AttrType(i) +"</b>: " +
ldapObj.AttrValue(i) + "<br>" )
Next
Response.Write("</p>")
Wend
%>

想象一下恶意用户发送请求到如下URL的场景:

http://www.megacorp.com/employee.asp?user=*

这个应用将在对用户参数中包含*的请求响应中显示所有用户信息。输入*用户名的另一个例子可能导致应用返回密码过期的错误信息。输入(),整个LDAP查询将会在错误信息中显示出来:


(&(objectClass=User)(objectCategory=Person)(SamAccountName=
<username... this is where an attacker could start injecting new filters>)

得到这些泄露的信息,攻击者可以了解如何在查询上连接过滤器。但是,由于AND查询,数据提取可能只能通过LDAP盲(Blind)注入攻击。更多关于LDAP盲注入攻击的信息可在本章结尾的“参考与延伸阅读”小节中找到。

LDAP目录服务是管理组织的用户数据的关键储存库。如果发生了侵入,个人可识别信息几乎肯定会暴露,并且可能导致成功的验证旁路攻击。一定要对与LDAP目录服务交互的所有用户输入进行审核。