LDAP
LightweightDirectory Access Protocol
轻量级目录访问协议
目录大家都熟悉,是一个分级结构的存储区,其中保存着各种信息
而LADP 协议就是一个用来进行搜索行为的轻量级协议(相比于DAP)
说到存储和搜索,那么我们应该可以想到关系型数据库和SQL语句,LDAP 和 SQL语句是同一个作用,只不过是语法有些不一样而已
端口
tcp/udp 389 3268
利用方法
1. 如果在我们已知目标的账号和密码,而目标没有开放smb服务的时候,如果开放了LDAP,我们就可以直接连接这个服务,从而获取一定的信息
2. LDAP注入
讲述LDAP注入之前还是要先了解一下关于LDAP的查询相关的知识吧
可以类比着SQL语句来将,和SQL语句一样都是通过过滤器指定内容来进行筛选查询
1. 简单匹配查询
最常见的一种,就是要查询指定的那个
(username=admin)
2. 析取查询
就是我们经常说的 ”或”
(|(username=admin)(username=root))
3. 合取查询
就是我们经常说的 “与”
(&(username=guest)(password=admin888))
看到这里应该大家已经知道注入是如何产生的了,我们自行闭合边界或者构造其他语句
LDAP是不允许类似 and 1=1 这种语句存在的,全都是以括号那种格式的过滤器存在,LDAP中支持 * 通配符
我们来模拟一下注入吧
例一:
假如需要我们输入的是用户名和密码,对应的过滤器名字分别为username和password
输入 admin /pass,则语句为
(&(username=admin)(password=pass))
之后进行验证
如果我们输入 admin))(&(username=admin / pass
此时语句就会变为
(&(username= admin))(&(username=admin)(password=pass))
成功绕过限制
例二
通过学校官网查询自己的成绩,只输入学号,院系已经被规定好了,是computer
我们输入学号 1801
那么语句为 (&(stunum=1801)(department=computer))
此时如果我们只输入 * ,那就变成了 (&(stunum=*)(department=computer))
此时就查询到了计算机学院的所有学生的成绩,不过我们并不满意于此,我们还要查询其他学院的
输入 *)(department=*))(&stunum=1801
这时候语句就变成了
(&(stunum=*)(department=*))(&stunum=1801)(department=computer))
成功查询出所有院系的所有的学生的成绩
这个例子中有一个理想化的地方,就是我们提前知道department 这个字段,然而通常情况下我们是不知道的。
此时第一想法应该就是使用注释截断,不过LDAP似乎并没有注释符号
我们可以输入 *))%00
眼熟吧!没错,就是00截断,原来的语句会变成
(&(stunum=*))%00)(department=computer))
解析之后是
(&(stunum=*))null)(department=computer))
null 会把剩下的变为无效,使其认为到这已经结束了
检测方法
LDAP不会像SQL和数据库那样报出错误,所以只能通过结果和状态码来进行判断
1. 在搜索出输入 * ,看看是不是返回一堆结果
2. 输入很多的右括号 ) 看看是否出错
3. 强行在搜索过滤器中掺一脚
我们如果改变了过滤器,那么返回的结果也会有变化
此处就需要用到一个 cn 属性,所有的LDAP都支持这个属性,我们可以这样输入
)(cn=*
*))(|(cn=*
*))%00
以上便是针对LDAP的攻击姿势。