LDAP注入该如何理解

发布时间 - 2023-05-22 00:00:00    点击率:

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.htmlCWE ID 639:Authorization Bypass ThroughUser-Controlled Keyhttp://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缺陷代码

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

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


图1:LDAP 注入的检测示例

3.2 修复代码


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

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


图2:修复后检测结果

4 、如何避免 LDAP 注入

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

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

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


# Java  # php  # sql  # 分布式  # html  # for  # 封装  # Directory  # 字符串  # 对象  # ASCII  # 数据库  # apache  # http  # https  # linux  # unix  # Access  # 身份验证  # 不存在  # 类似于  # 需要用  # 值为  # 是一个  # 特殊字符  # 是一种  # 是指  # 并在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  ,交易猫的商品怎么发布到网站上去?  iOS验证手机号的正则表达式  网站图片在线制作软件,怎么在图片上做链接?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  原生JS获取元素集合的子元素宽度实例  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Swift中swift中的switch 语句  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在阿里云域名上完成建站全流程?  如何彻底删除建站之星生成的Banner?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何选择PHP开源工具快速搭建网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Angular 表单中正确绑定输入值以确保提交与验证正常工作  浅述节点的创建及常见功能的实现  进行网站优化必须要坚持的四大原则  Thinkphp 中 distinct 的用法解析  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  详解jQuery中的事件  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Android 常见的图片加载框架详细介绍  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  利用python获取某年中每个月的第一天和最后一天  如何在腾讯云服务器上快速搭建个人网站?  如何注册花生壳免费域名并搭建个人网站?  手机网站制作与建设方案,手机网站如何建设?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Android GridView 滑动条设置一直显示状态(推荐)  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何彻底卸载建站之星软件?  教你用AI润色文章,让你的文字表达更专业  Laravel怎么使用Intervention Image库处理图片上传和缩放  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何实现javascript表单验证_正则表达式有哪些实用技巧  焦点电影公司作品,电影焦点结局是什么?  手机软键盘弹出时影响布局的解决方法  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  JS中对数组元素进行增删改移的方法总结  网易LOFTER官网链接 老福特网页版登录地址  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何用狗爹虚拟主机快速搭建网站?