• LDAP注入漏洞


    1、LDAP 注入

    LDAP (Light Directory Access Portocol) 是基于X.500标准的轻量级目录访问协议,提供访问目录数据库方法的服务和协议,常用于与目录数据库组成目录服务。其中目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,类似于Linux/Unix系统中的文件目录。适合将公用证书、安全密钥以及公司物理设备信息等不经常变更的数据存储于目录中。类似于SQL,LDAP是一种搜索协议,具有查询语法,并存在潜在的注入攻击风险。LDAP注入是指客户端发送查询请求时,输入的字符串中含有一些特殊字符,导致修改了LDAP本来的查询结构,从而使得可以访问更多的未授权数据的一种攻击方式。

    本篇文章以 JAVA 语言源代码为例,分析CWE ID 90:Improper Neutralization of Special Elementsused in an LDAP Query ('LDAP Injection')样本中LDAP注入漏洞产生的原因以及修复方法。详细请参见:

    • CWE ID 90: Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')

      http://cwe.mitre.org/data/definitions/90.html

    • CWE ID 639:Authorization Bypass ThroughUser-Controlled Key

      http://cwe.mitre.org/data/definitions/639.html

    2. LDAP 注入的危害

    LDAP 注入是利用用户引入的参数生成恶意 LDAP 查询,通过构造 LDAP 过滤器来绕过访问控制、用户权限提升。通过针对正常过滤器的构造,实现 AND、OR 操作注入,以获取敏感信息。

    从2018年1月至2019年1月,CVE中共有4条漏洞信息与其相关。部分漏洞如下:

    CVE 编号概述
    CVE-2018-12689phpLDAPadmin 1.2.2 允许通过 cmd.php?cmd = loginform 请求中精心设计的 serverid 参数或登录面板中精心设计的用户名和密码进行 LDAP 注入。
    CVE-2018-5730MIT krb5 1.6 或更高版本允许经过身份验证的 kadmin 将主体添加到 LDAP Kerberos 数据库,以通过提供 “linkdn” 和 “containerdn” 数据库参数来绕过DN容器检查,或者通过提供作为扩展的DN字符串来绕过 DN 容器检查。
    CVE-2016-87504.0.8 之前的 Apache Karaf 使用 LDAPLoginModule 通过 LDAP 对用户进行身份验证。但是没有正确编码用户名,因此容易受到 LDAP 注入攻击,导致拒绝服务。
    CVE-2011-4069PacketFence 3.0.2 之前的 html / admin / login.php 允许远程攻击者进行 LDAP 注入攻击,从而通过精心设计的用户名绕过身份验证。

    3、示例代码

    示例源于 Samate Juliet Test Suite for Java v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE90_LDAP_Injection__connect_tcp_01.java。

    3.1缺陷代码

    LDAP注入该如何理解

    【程序员必备开发工具推荐】Apifox一款免费API管理工具Apifox = Postman + Swagger + Mock + JMeter

    LDAP注入该如何理解

    上述示例代码 39-61 行,程序进行 TCP 连接并读取Socket的数据并赋值给变量 data,在118 行动态构造一个 LDAP 查询语句,119 行对其加以执行。LDAP 为人员组织机构封装了常见的对象类,比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码 (userPassword) 等属性。该查询为了验证是否存在名为变量 data 的员工,但并未对变量 data 的内容做任何过滤。使用最简单的注入方式,令传入参数的值为“*”,则构造的动态查询条件为 "(cn=*)”,这样可以查询到所有员工的信息,导致信息泄露。

    对上文中的样例代码进行360代码卫士检测后,发现存在“LDAP注入”漏洞,安全等级评定为高。数据污染源以及数据流向可以通过跟踪路径分析得出并在代码的第120行报告缺陷,图1亦如是

    LDAP注入该如何理解

    图1:LDAP 注入的检测示例

    3.2 修复代码

    LDAP注入该如何理解

    在上述修复代码中,第119行使用 javax.naming.ldap 包下扩展类 BaseControl 接收需要被处理的参数,第120行 control 对象调用 getEncodedValue() 方法将接收的参数 data 进行编码,编码后的值为字符对应的 ASN.1BER 编码值。编码后的字节数组不存在参与命令解析的特殊字符,可以构造结构、内容正常的 LDAP 查询语句,这样就避免了 LDAP 注入的发生。

    使用360代码卫士对修复后的代码进行检测,可以看到已不存在“LDAP注入”缺陷。如图2:

    LDAP注入该如何理解

    图2:修复后检测结果

    4 、如何避免 LDAP 注入

    LDAP注入的根本原因是攻击者利用LDAP元字符来修改LDAP查询的含义。在构造LDAP筛选器时,程序员需明确哪些字符该被视作命令解析,哪些字符应被视作数据解析。为了防止攻击者侵犯程序员的各种预设情况,应使用白名单的方法,确保LDAP查询中由用户控制的数值完全来自于预定的字符集合,应不包含任何LDAP元字符。如果由用户控制的数值范围要求必须包含 LDAP元字符,则应使用相应的编码机制转义这些元字符在LDAP查询中的意义。

    • 如&、!、|、=、<、>、,、+、-、”、’、;这些字符正常情况下不会用到,如果用户的输入中出现了,需要用反斜杠转义处理。

    • 还有些字符如(、)、\、*、/、NUL这些字符不仅需要用反斜杠处理,还要将字符变成相应的ASCII码值。

    参考:LDAP注入该如何理解-安全-PHP中文网 

  • 相关阅读:
    Java多线程同步工具类:Semaphore、CountDownLatch 、CyclicBarrier、Exchanger原理剖析
    UTF-8字符串操作方法
    ggVennDiagram--绘制简单美观不同调色板的韦恩图1
    Go的题目
    【技术积累】算法中的动态规划【一】
    【线性代数基础进阶】二次型-补充+练习
    【MVC】C# MVC基础知识点、原理以及容器和管道
    K8S基本概念+pod生命周期+容器重启策略+Init容器和边车容器+pod探针+postStart和preStop
    SQL学习路径
    Node学习笔记之Node简介
  • 原文地址:https://blog.csdn.net/seanyang_/article/details/134022894