首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。
本文部分内容来自互联网和翻译
1、一些多余的话
LDAP注入和SQL注入,原理上非常相似
但是LDAP往往包含很多的数据,相对来说,危害性更加大。
2、一些案例
这些案例不一定是LDAP造成的,但是性质基本上差不多
WooYun: 腾讯某服务配置不当内部海量敏感信息泄露!
http://www.wooyun.org/bugs/wooyun-2013-045626
WooYun: 腾讯某研发中心某系统多用户弱口令可能导致该产品线及业务受影响!
http://www.wooyun.org/bugs/wooyun-2013-046031
…
3、LDAP注入攻击介绍
LDAP服务开启的端口是389,如果发现某个服务器上开启了该端口很可能就是开启了LDAP服务,针对LDAP的软件有ldapbroswer、ldap blind explorer;
LDAP注入攻击和SQL注入攻击相似。在有漏洞的环境中,有些参数没有得到合适的过滤,因而攻击者可以注入任意恶意代码。
下面的案例将会致代码注入:
(attribute=value):如果过滤器用于构造查询单缺少逻辑操作符,如value)(injected_filter的注入会导致两个过滤器(attribute=value)(injected_filter)。在OpenLDAP实施中,第二个过滤器会被忽略,只有第一个会被执行。而在ADAM中,有两个过滤器的查询是不被允许的,因而这个注入毫无用处。
(|(attribute=value)(second_filter)) or (&(attribute=value)(second_filter)):如果第一个用于构造查询的过滤器有逻辑操作符,形如value)(injected_filter)的注入会变成如下过滤器:(&(attribute=value)(injected_filter)) (second_filter)。虽然过滤器语法上并不正确,OpenLDAP还是会从左到右进行处理,忽略第一个过滤器闭合后的任何字符。一些LDAP客户端Web组成会忽略第二个过滤器,将ADAM和OpenLDAP发送给第一个完成的过滤器,因而存在注入。
一些应用框架在将请求发送给服务器之前会检查过滤器是否正确,在这种情况下,过滤器语义上必须是正确的,其注入如:value)(injected_filter))(&(1=0。这会导致出现两个不同的过滤器,第二个会被忽略:(&(attribute=value)(injected_filter))(&(1=0)(second_filter))。
既然第二个过滤器会被LDAP服务器忽略,有些部分便不允许有两个过滤器的查询。这种情况下,只能构建一个特殊的注入以获得单个过滤器的LDAP查询。value)(injected_filter这样的注入产生的结果是:(&(attribute=value)(injected_filter)(second_filter))。
测试一个应用是否存在代码注入漏洞典型的方法是向服务器发送会生成一个无效输入的请求。因此,如果服务器返回一个错误消息,攻击者就能知道服务器执行了他的查询,他可以利用代码注入技术。
4、 LDAP注入攻击中的AND注入
这种情况,应用会构造由”&”操作符和用户引入的的参数组成的正常查询在LDAP目录中搜索,例如:
(&(parameter1=value1)(parameter2=value2))
这里Value1和value2是在LDAP目录中搜索的值,攻击者可以注入代码,维持正确的过滤器结构但能使用查询实现他自己的目标。
权限提升
现假设下面的查询会向用户列举出所有可见的低安全等级文档:
(&(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))
则会被忽略。结果就是,所有安全等级的可用文档都会列举给攻击者,尽管他没有权限查看它们。
5、LDAP注入攻击的OR注入
这种情况,应用会构造由”|”操作符和用户引入的的参数组成的正常查询在LDAP目录中搜索,例如:
(|(parameter1=value1)(parameter2=value2))
这里Value1和value2是在LDAP目录中搜索的值,攻击者可以注入代码,维持正确的过滤器结构但能使用查询实现他自己的目标。
信息泄露
假设一个资源管理器允许用户了解系统中可用的资源(打印机、扫描器、存储系统等)。这便是一个典型的OR注入案例,因为用于展示可用资源的查询为:
(|(type=Rsc1)(type=Rsc2))
Rsc1和Rsc2表示系统中不同种类的资源, Rsc1=printer,Rsc2=scanner用于列出系统中所以可用的打印机和扫描器。
如果攻击者输入Rsc=printer)(uid=*),则下面的查询被发送给服务器:
(|(type=printer)(uid=*))(type=scanner)
LDAP服务器会响应所有的打印机和用户对象。