1 属性
模式名 |
LDAP注入 |
模式ID |
|
参考 |
|
关键词 |
注入,分级目录结构,数据查询 |
STRIDE |
信息泄露,篡改,权限提升 |
分类 |
Web攻击方法 |
攻击模式介绍 |
LDAP(Lightweight Directory Access Protocol):轻量级目录访问协议,是一种在线目录访问协议,主要用于目录中资源的搜索和查询;每个LDAP查询使用一个或者多个搜索过滤器,它们决定了请求返回的目录项。搜索过滤器可以使用各种逻辑运算符来表示复制的搜索条件,常见的搜索过滤器如下: 简单匹配条件:对单个值进行匹配 (username=xiaofeng) 析取查询(or)指多个条件至少满足一个 (|(cn=searchitme1)(sn=searchitme2)(ou=searchitem3)) 合取查询(and)返回的目录项必须满足所有的条件: (&(username=xiaofeng)(password=3453456)) 和其他形式的注入一样,如果用户提交的输入不经过任何过滤而被直接插到LDAP搜索过滤器中,攻击者可以通过构造特定的输入来修改过滤器的结构,来进行非授权操作。 |
资源需求 |
1、web业务运行正常 2、存在LDAP服务系统 |
知识技能需求 |
数据库查询语言、LDAP相关查询语句知识 |
分析 |
测试一个应用是否存在代码注入漏洞典型的方法是向服务器发送会生成一个无效输入的请求。因此,如果服务器返回一个错误消息,攻击者就能知道服务器执行了构造的查询,可以利用代码注入技术。 向一项LDAP操作提交无效的输入并不会生成任何详细的错误信息。通常,由搜索功能返回的结果和发生的错误(如一个Http500状态码)有助于确定漏洞。但是渗透测试人员可以使用以下步骤相对可靠的确定LDAP注入漏洞: |
实施 |
1、尝试仅仅输入一个*作为搜索项。在LDAP中,*为通配符,如果返回大量结果,明显表示攻击针对的是一个LDAP查询; 2、尝试输入大量的闭合括号:)))))))),闭合前面输入的括号,从而破坏查询语句; 3、尝试通过输入各种旨在干扰不同类型的查询的表达式,并看是否可以通过这些表达式来影响返回结果。所有的LDAP均支持cn(common name)属性; )(cn=* *))(|(cn=* *))%00
|
利用 |
敏感数据泄露,权限提升,执行非授权操作,绕过认证 |
攻击结果 |
数据库等敏感数据泄露,服务器被控制且内网被渗透 |
机密性 |
高 |
完整性 |
高 |
可用性 |
高 |
设计阶段 |
|
应用配置 |
1、输入验证 2、参数化处理用户输入 3、错误消息处理 |
实例1 |
一个登陆页有两个文本框用于输入用户名和密码(图二)。Uname和Pwd是用户对应的输入。为了验证客户端提供的user/password对,构造如下LDAP过滤器并发送给LDAP服务器: (&(USER=Uname)(PASSWORD=Pwd)) 如果攻击者输入一个有效地用户名,如r00tgrok,然后在这个名字后面注入恰当的语句,password检查就会被绕过。 使得Uname=slisberger)(&)),引入任何字符串作为Pwd值,构造如下查询并发送给服务器: (&(USER= slisberger)(&)(PASSWORD=Pwd)) LDAP服务器只处理第一个过滤器,即仅查询(&(USER=slidberger)(&))得到了处理。这个查询永真,因而攻击者无需有效地密码就能获取对系统的访问。 |
实例2 |
现假设下面的查询会向用户列举出所有可见的低安全等级文档: (&(directory=document)(security_level=low)) 这里第一个参数document是用户入口,low是第二个参数的值。如果攻击者想列举出所有可见的高安全等级的文档,他可以利用如下的注入: document)(security_level=*))(&(directory=documents 生成的过滤器为: (&(directory=documents)(security_level=*))(&(direcroty=documents)(security_level=low)) LDAP服务器仅会处理第一个过滤器而忽略第二个,因而只有下面的查询会被处理: (&(directory=documents)(security_level=*))而 (&(direcroty=documents)(security_level=low)) 则会被忽略。结果就是,所有安全等级的可用文档都会列举给攻击者,尽管他没有权限查看它们。 |
案例3 |
假设一个资源管理器允许用户了解系统中可用的资源(打印机、扫描器、存储系统等)。这便是一个典型的OR注入案例,因为用于展示可用资源的查询为: (|(type=Rsc1)(type=Rsc2)) Rsc1和Rsc2表示系统中不同种类的资源,在图中,Rsc1=printer,Rsc2=scanner用于列出系统中所以可用的打印机和扫描器。 如果攻击者输入Rsc=printer)(uid=*),则下面的查询被发送给服务器: (|(type=printer)(uid=*))(type=scanner) LDAP服务器会响应所有的打印机和用户对象, |
相关参考 |
web安全测试规范1.4,黑客攻防技术宝典 |