LDAP注入该如何理解

1、LDAP 注入

LDAP (Light Directory Access Portocol) 是基于X.500标准的轻量级目录访问协议,提供访问目录数据库方法的服务和协议,常用于与目录数据库组成目录服务。其中目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,类似于Linux/Unix系统中的文件目录。公用证书、安全密钥、公司的物理设备信息等修改并不频繁的数据适合存储在目录中。可以将LDAP理解为一种搜索协议,它类似于SQL,拥有查询语法,也存在被注入攻击的风险。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-12689 phpLDAPadmin 1.2.2 允许通过 cmd.php?cmd = loginform 请求中精心设计的 serverid 参数或登录面板中精心设计的用户名和密码进行 LDAP 注入。
CVE-2018-5730 MIT krb5 1.6 或更高版本允许经过身份验证的 kadmin 将主体添加到 LDAP Kerberos 数据库,以通过提供 “linkdn” 和 “containerdn” 数据库参数来绕过DN容器检查,或者通过提供作为扩展的DN字符串来绕过 DN 容器检查。
CVE-2016-8750 4.0.8 之前的 Apache Karaf 使用 LDAPLoginModule 通过 LDAP 对用户进行身份验证。但是没有正确编码用户名,因此容易受到 LDAP 注入攻击,导致拒绝服务。
CVE-2011-4069 PacketFence 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注入该如何理解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注入该如何理解”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注亿速云网站!小编会继续为大家带来更好的文章!

文章标题:LDAP注入该如何理解,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/27470

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月20日 下午11:53
下一篇 2022年9月20日 下午11:53

相关推荐

  • windows驱动精灵usb驱动如何安装

    驱动精灵usb驱动安装方法: 1、打开进入驱动精灵点击“一键体检”。 2、等待扫描计算机。 3、扫描完成后点击“驱动程序”。 4、下拉找到USB,选择“下载”。 5、下载完成后点击“安装”。 6、等待安装即可。 7、最后点击“完成”即可完成安装。 读到这里,这篇“windows驱动精灵usb驱动如何…

    2022年9月13日
    7300
  • sumif函数如何使用

    sumif函数的使用方法: 1、首先进入excel,然后选择单元格, 点击fx,输入:SUMIF点击“转到”。 2、然后选择SUMIF函数,点击确定,选择“求和范围”。 3、然后点击“criteria”输入求和条件, 图中以>60数值举例,最后点击确定即可。 到此,相信大家对“sumif函数如…

    2022年8月27日
    4900
  • 怎么用好MySQL索引

    为了更好地进行解释,我创建了一个存储引擎为InnoDB的表user_innodb,并批量初始化了500W+条数据。包含主键id、姓名字段(name)、性别字段(gender,用0,1表示不同性别)、手机号字段(phone),并为name和phone字段创建了联合索引。 CREATE TABLE `u…

    2022年9月21日
    5400
  • MySQL中replace into与replace区别是什么

    0.故事的背景 【表格结构】 CREATE TABLE `xtp_algo_white_list` ( `strategy_type` int DEFAULT NULL, `user_name` varchar(64) COLLATE utf8_bin DEFAULT NULL, `status` …

    2022年9月1日
    4700
  • 如何借助CSS 更好的控制定时器

    平时工作中很多场合都要用到定时器,比如延迟加载、定时查询等等,但定时器的控制有时候会有些许麻烦,比如鼠标移入停止、移出再重新开始。这次介绍几个借助 CSS 来更好的控制定时器的方法,一起了解一下吧,相信可以带来不一样的体验。 一、hover 延时触发 有这样一个场景,在鼠标停留在一个元素上1s后才触…

    2022年9月16日
    12100
  • MySQL乐观锁和悲观锁如何实现

    锁分类 MySQL的中锁按照范围主要分为表锁、行锁和页面锁。其中myisam存储引擎只支持表锁,InnoDB不仅仅支持行锁,在一定程度上也支持表锁。按照行为可以分为共享锁(读锁)、排他锁(写锁)和意向锁。按照思想分为乐观锁和悲观锁。 表结构 下面的SQL语句是表的结构: CREATE TABLE `…

    2022年9月8日
    3700
  • Mysql锁的内部实现机制是什么

    注:所列举代码皆出自Mysql-5.6 虽然现在关系型数据库越来越相似,但其背后的实现机制可能大相径庭。实际使用方面,因为SQL语法规范的存在使得我们熟悉多种关系型数据库并非难事,但是有多少种数据库可能就有多少种锁的实现方法。 Microsoft Sql Server2005之前只提供页锁,直到20…

    2022年9月15日
    7300
  • windows会声会影2020如何去除视频水印

    会声会影2020去除视频水印的方法 1、首先我们将视频导入到会声会影中。 2、点击轨道中的视频,然后我们可以看到在左上角的视频窗口四角可以调整视频画面的大小。 3、我们把视频往上或者往外拉(取决于水印位置),直到水印消失即可。 到此,相信大家对“windows会声会影2020如何去除视频水印”有了更…

    2022年9月15日
    5500
  • html的缩进属性介绍

    在html中,缩进属性是“text-indent”属性;该属性用于规定文本块中首行文本的缩进,只需将属性值设置为合理的大小即可,若属性值为正值,则首行会被缩进到右边,若属性值为负值,则首行会被缩进到左边,语法为“<element style=”text-indent:属性值&#82…

    2022年9月13日
    29700
  • Python怎么使用sqlite3第三方库读写SQLite数据库

    1 数据概览 学生课程成绩:studentID、name、english、chinese、math,存在一定缺失值 2 任务定义 基于学生课程成绩文件,使用pandas和sqlite3将学生信息输入SQLite数据库,请在完成对应数据库操作后分析学生课程成绩信息,计算各科目平均分并给出总分排名。 3…

    2022年9月21日
    8500
联系我们
关注微信
关注微信
分享本页
返回顶部
PingCode 比 Jira 更好用的研发管理工具。免费试用