基础知识
什么是LDAP
LDAP(Lightweight Directory Access Protocol):轻量级目录访问协议,是一种在线目录访问协议,主要用于目录中资源的搜索和查询,是X.500的一种简便的实现。
LDAP有三种基本的通信机制:没有处理的匿名访问;基本的用户名、密码形式的认证;使用SASL、SSL的安全认证方式。
使用最广泛的LDAP服务如微软的ADAM(Active Directory Application Mode)和OpenLDAP。
默认端口389 加密端口636
LDAP结构
LDAP 目录是以树状的层次结构来存储数据

dn 表示一条记录所处的位置。
dc 表示一条记录所属的区域。
ou 代表一条记录所属的组织。
cn 表示一条记录的名字。
这些理解起来也很容易,LDAP 就好比我们程序用的关系型数据库,关系型数据库我们一般用数据库名称、表名、行来定位一条数据记录,而 LDAP 首先要说明是哪一棵树 (dc),然后是从树根到目标所经过的所有分叉 (ou),最后就是目标的名字 (cn)。
LDAP语法
= 等于的作用,例如查找 Name 等于 weiketang 的对象:
(Name=weiketang)
& 多条件满足查询,例如 Name 等于 weiketang 的,同时性别为男的,这里用 1 表示:
(&(Name=weiketang)(sex=1))
| 或查询,例如 Name 等于 weiketang,或性别为男的:
(!(Name=weiketang)(sex=1))
! 非查询,用来排除对象,例如 Name 不等于 weiketang 的:
(!Name=weiketang)
* 星号代表通配符,可表示任何内容,例如查询 Name 有内容的,相当于不为空,基本上是查询所有:
(Name=*)
Web应用中的LDAP注入
(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))。
AND注入
- 绕过访问控制
后端语句
(&(
本文介绍了LDAP的基础知识,包括其通信机制、结构和语法。重点讲解了Web应用中的LDAP注入,如AND注入、OR注入和盲注,并提供了攻击手法示例。同时,文章也讨论了防御措施,建议对特殊字符进行过滤或转义处理。
最低0.47元/天 解锁文章
455

被折叠的 条评论
为什么被折叠?



