(转载翻译)什么是LDAP注入以及如何防御

nicky   ·   发表于 2020-04-10 08:44:03   ·   技术文章投稿区

LDAP注入是利用输入验证漏洞向轻量级目录访问协议服务器注入并执行查询。通过向易受攻击的应用程序提供特殊构造的用户输入,攻击者可以从组织的LDAP目录中提取敏感信息。LDAP服务对于许多组织的日常运作是比较重要的,成功的LDAP注入可以为进一步攻击系统和应用提供有价值的信息。在本文中,我们将研究LDAP的工作原理和防御。

LDAP服务器的重要性

轻型目录访问协议(LDAP)是一种开放应用程序协议,用于访问和维护IP网络中的目录服务。公司通常会把相关用户和资源的信息放在中央目录中,应用程序可以使用LDAP语法访问和控制信息。实际上,LDAP服务器是通往大量敏感信息的入口,这些敏感信息可以是登录信息,员工ID,共享的网络资源设备。

尽管不如SQL那样公开,但LDAP注入攻击可以产生公司内部基础结构有价值的信息,甚至可能让攻击者访问数据库和其它内部系统。

LDAP语法

客户端可以通过发生特定的请求来查询LDAP服务器。如果找到与LDAP搜索过滤器匹配的东西,则服务器会返回所请求的信息。下面是写简单的例子:
(cn = John*)匹配以John开头的内容

(! (cn = *Doe))匹配名称不是Doe结尾的内容

(&(cn=J)(cn=Doe))匹配内容为J开头并以Doe结尾的内容

(&(|(cn=John)(cn=Jane))(cn=*Doe))匹配内容为John或Jane开头并以Doe结尾的内容

LDAP的注入原理

与SQL注入原理一样,当应用程序将未经过滤的用户输入直接查到LDAP语句时就会出现LDAP漏洞。通过使用LDAP过滤器语法设计合适的字符串,攻击者可以使用LDAP服务器执行各种查询和其它LDAP语句。如果结合错误配置或受损权限,LDAP注入可以修改一些关键值

尽管LDAP注入有很多类型不过主要就分为两种方法:
1.身份验证绕过:目前服务通常用于用户身份验证和授权,因此最基本的LDAP注入攻击时绕过密码检查。采取以下JavaScript代码,可以直接从储存在遍历的enterUser和enterPwd中的用户输入中安装一个简单的LDAP过滤器:

对于非恶意用户,生成的过滤器应该类似于:

假如查询为true,那么目录中存在用户和密码组合,所以用户已经登录。但是,攻击者可以输入LDAP过滤器代码作为用户ID(以红色显示),来创建始终为true的过滤器,比如:

这可以让攻击者无需使用有效的用户名或密码就可以获得访问权限

2.信息泄露:如果易受攻击的应用程序使用LDAP筛选器来配置共享资源(比如打印机)则攻击者可能会注入LDAP筛选器代码来列出组织目录中的所有资源。假设以下列出打印机和扫描器的过滤并不靠谱:

如果攻击者可以输入另外一个值而不是打印机的,而且知道该目录中的用户名使用了userID,则可以注入以下代码:

这可以列出所有打印机和用户对象,并且服务器可以忽略扫描器部件

LDAP盲注

如果要直接查询LDAP服务器,攻击者可能需要知道或猜属性名称,以便可以在过滤器中指定它们。LDAP盲注是一种更高级的利用技术,可以通过发送多个请求并检查服务器响应来确定查询是否有效提取未知信息。结合其它优化和自动化功能,攻击者可以使用yes/no问题来获取信息:有效的服务器响应就是yes服务器错误就代表no。有效的LDAP有以下步骤:

属性发现:攻击者可以查询各种可能的属性并监视服务器响应。如果存在属性,则服务器会返回有效反应。否则就是404。假设某个应用在检索用户的地方没有过滤的话:

如果攻击者可以控制用户输入的话,他们就可以注入以下代码来检查此目录中的用户对象是否具有其它敏感属性:

如果department属性存在(并在John Doe是一个有效的用户名ID)则服务器会返回有效响应。否则攻击者可以列举其它属性名称

布尔化:一旦知道属性名称后,攻击者可以发送一系列包含通配字符和比较运算符的请求来确定特定的属性值。同样仅考虑两个服务器响应,布尔化是将搜索过程转化为yes/no的结果。

假设上一个实例中的department属性存在。要发现部门名称,攻击者可以通过注入以下代码来检查第一个字母来开始攻击:

有效的服务器响应就代表存在以字母a开头的部门。攻击者可以继续进行ab,ac等处理来发现后续字符。对于数值,可以使用<=和>=遍历可能存在的值

减少字符:为了最大程度的减少请求数量,攻击者可以使用多个通配符来找出目标值中任意位置存在的字符。比如,以下注入的有效服务器响应:

这是代表包含字母’x’的部门名称。如果返回错误或空的响应,可以取消这个字符换另外一个。这样可以减少查找目标值所需的请求数量。

防止LDAP注入的方法

与其它注入攻击一样,在应用程序中进行正确的输入验证和编码对于消除LDAP注入很重要。应该根据应用程序要求对LDAP查询中可能使用的每个用户输入进行清理并进行编码来确保可以安全的转义所有剩余的LDAP特殊字符,包括至少()!|&*。为了获取最大的安全性和便利性,应该使用现成的框架或库来转义特殊字符和组装LDAP过滤器。

转载:https://www.netsparker.com/blog/web-security/ldap-injection-how-to-prevent/

用户名金币积分时间理由
奖励系统 100.00 0 2020-07-28 20:08:24 投稿满 10 赞奖励
奖励系统 50.00 0 2020-05-21 11:11:34 投稿满 5 赞奖励
admin 50.00 0 2020-04-11 09:09:00 一个受益终生的帖子~~

打赏我,让我更有动力~

0 Reply   |  Until 2020-4-10 | 510 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.