应该只接受校验后的应用输入的另一种数据存储是组织的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目录服务交互的所有用户输入进行审核。