LDAP 和 LDAP 注入/预防
轻量级目录访问协议
LDAP(轻量级目录访问协议)是一种软件协议,您必须在大学和初创公司中使用它,使任何人都可以在公共 Internet 或网络上定位组织、个人和其他资源,例如网络中的文件和设备。企业内网。
LDAP 的一个常见用途是提供一个中心位置来存储用户名和密码。这允许许多不同的应用程序和服务连接到 LDAP 服务器以验证用户
我的大学 LDAP:
可以在本协议中执行的主要操作
- 添加:在数据库中添加新数据
- Bind(authenticate):所有的认证和加密都在这个部分完成
- 删除:删除数据drm数据库
- 搜索和比较:搜索操作用于搜索和读取条目。
- Modify : LDAP 客户端使用 MODIFY 操作来请求 LDAP 服务器对现有条目进行更改
- 解除绑定:关闭连接。
具有多个属性的简单目录条目:
dn: cn=akash sharan, dc=example, dc=com
objectClass: organizationalStudent
cn: akash sharan
存在一个 LDAP 统一资源标识符 (URI) 方案,客户端在不同程度上支持该方案,并且服务器在引用和继续引用中返回。
LDAP URI 语法:
ldap://host:port/DN?attributes?scope?filter?extensions
ldap://ldap.example.com/cn=akash%20sharan, dc=example, dc=com
host - IP address
DN - is the distinguished name to use as the search base.
for example - cn=John Doe, dc=example, dc=com
Attributes - is a comma-separated list of attributes to retrieve.
Scope specifies the search scope and can be "base"
(the default), "one" or "sub" classes.
Filter is a search filter.
Extensions are extensions to the LDAP URL format.
LDAP注入
LDAP 注入是一种用于利用基于 Web 的应用程序的攻击,这些应用程序基于用户输入构建 LDAP 语句。当应用程序无法正确清理用户输入时,可以通过类似于 SQL 注入的技术修改 LDAP 语句。
普通手术:
代码注入操作:
LDAP 注入示例:
对于用户搜索,以下代码负责采取行动
Insert the username
将在后端执行的 LDAP 查询
String ldapSearchQuery = "(cn =" + $userName + ")";
System.out.println(ldapSearchQuery);
如果变量 $userName 没有被验证,有可能完成 LDAP 注入,如下:
If a user puts “*” on box search, the system may return all the usernames on the LDAP base. If a user puts “akash) (| (password = * ) )”, it will generate the code below revealing akash’s password ( cn = akash ) ( | (password = * ) ).
预防
- 输入验证:必须清理所有用户端输入。它应该没有可能是恶意的可疑字符和字符串。存在 OWASP Api 可以帮助防御这些漏洞,例如:
- esapi-java
- C# AntiXSS 函数包括 Encoder.LdapFilterEncode(字符串)、Encoder.LdapDistinguishedNameEncode(字符串) 和 Encoder.LdapDistinguishedNameEncode(字符串, bool, bool)。
我将为您提供逃避上述搜索查询的搜索过滤器思想:
public static final String escapeLDAPSearchFilter(String filter) { // If using JDK >= 1.5 consider using StringBuilder StringBuffer sb = new StringBuffer(); for (int i = 0; i < filter.length(); i++) { char curChar = filter.charAt(i); switch (curChar) { case '\\': sb.append("\\5c"); break; case '*': sb.append("\\2a"); break; case '(': sb.append("\\28"); break; case ')': sb.append("\\29"); break; case '\u0000': sb.append("\\00"); break; default: sb.append(curChar); } } return sb.toString(); }
- 安全配置:在处理用户对象权限时保护敏感信息。当应用程序使用目录进行登录过程时,这一点尤为重要。在组织中设置ldap时应注意限制。
参考
https://www.owasp.org/index。 PHP/LDAP_Injection_Prevention_Cheat_Sheet
https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
http://www.faqs.org/rfcs/rfc2254.html
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。