📜  LDAP 和 LDAP 注入/预防

📅  最后修改于: 2022-05-13 01:56:20.391000             🧑  作者: Mango

LDAP 和 LDAP 注入/预防

轻量级目录访问协议

LDAP(轻量级目录访问协议)是一种软件协议,您必须在大学和初创公司中使用它,使任何人都可以在公共 Internet 或网络上定位组织、个人和其他资源,例如网络中的文件和设备。企业内网。

LDAP 的一个常见用途是提供一个中心位置来存储用户名和密码。这允许许多不同的应用程序和服务连接到 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图

代码注入操作:

LDAP 代码注入图

LDAP 注入示例:
对于用户搜索,以下代码负责采取行动

Insert the username

将在后端执行的 LDAP 查询

String ldapSearchQuery = "(cn =" + $userName + ")";
System.out.println(ldapSearchQuery);

如果变量 $userName 没有被验证,有可能完成 LDAP 注入,如下:

预防

  • 输入验证:必须清理所有用户端输入。它应该没有可能是恶意的可疑字符和字符串。存在 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

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。