0x01 前言

前两天爆了一个LDAP漏洞,据说存在了8年现在才被发现,感概一下,不知这8年来有多少站被搞了。。。
想着复现这个漏洞,就先复习一下LDAP注入的相关知识吧,差了很多资料,记一下笔记。

0x02 LDAP介绍

在学习LDAP注入之前,首先要了解LDAP的运行机制。
什么是LDAP?LDAP(Lightweight Directory Access Protocol):轻量级目录访问协议,是一种在线目录访问协议。LDAP主要用于目录中资源的搜索和查询,是X.500的一种简便的实现。
简单来说,可以理解为LDAP是某种搜索协议,就像我们熟知的数据库一样,我们利用SQL语句进行查询数据库中的数据。而LDAP也有一套自己的查询语句,来进行查询。

LDAP查询语法

search语法:attribute operator value
search filter options:( "&" or "|" (filter1) (filter2) (filter3) ...) ("!" (filter))

LDAP的搜索语法其实很容易,这里看不明白的话,往下看一下具体实例就会明白的。

0x03 LDAP注入攻击

轻量级目录访问协议是通过TCP/IP查询和修改目录服务的协议,使用最广泛的LDAP服务如微软的ADAM(Active Directory Application Mode)和OpenLDAP。

(&(attribute=value)(injected_filter)) (second_filter)

需要注意的是,在OpenLDAP中,第二个过滤器会被忽略,只有第一个会被执行,那么类似上面的这种注入就可以成功的。而在ADAM中,有两个过滤器的查询是不被允许的,那么这种注入是没什么用的。

  • AND LDAP注入

当后端的代码如下

(&(parameter1=value1)(parameter2=value2))

这里value1和value2都会被查询,其中value1和value2是用户可控的,如果过滤不完善,就会存在LDAP注入的可能。
比如一个用户登录的场景,用户输入username和password,应用会构造一个过滤器并发给LDAP服务器进行查询。

(&(username=uname)(password=pwd))

当用户输入一个有效的用户名,例如admin,那么就有可能在username字段后面进行注入,从而在不知道密码的情况下进行登陆。

payload: admin)(&))
result: (&(username=admin)(&))(password=123))

LDAP服务器只会处理第一个过滤器,而第一个过滤器永真,因此绕过了登录框

  • OR LDAP注入

当后端代码如下:

(|(parameter1=value1)(parameter2=value2))

一个典型的OR LDAP注入的场景就是:
假设一个资源管理器允许用户了解系统中可用的资源(打印机、扫描器、存储系统等)。用于展示可用资源的查询为:

(|(type=Rsc1)(type=Rsc2))

Rsc1和Rsc2表示系统中不同种类的资源,例如,Rsc1=printer,Rsc2=scanner用于列出系统中所以可用的打印机和扫描器。

payload: Rsc1=printer)(uid=*)
result: (|(type=printer)(uid=*))(type=scanner))

LDAP服务器会响应所有的打印机和用户对象

  • LDAP盲注
    - LDAP AND盲注
    假设一个Web应用想从一个LDAP目录列出所有可用的Epson打印机,错误信息不会返回,应用发送如下的过滤器:
(&(objectclass=printer)(type=Epson*))

使用这个查询,如果有可用的Epson打印机,其图标就会显示给客户端,否则没有图标出现。如果攻击者进行LDAP盲注入攻击”)(objectClass=))(&(objectClass=void”,Web应用会构造如下查询:

(&(objectclass=*)(objectClass=*))(&(objectClass=void)(type=Epson*))

仅对第一个过滤器进行处理:

(&(objectclass=*)(objectClass=*))

结果是,打印机的图标会一定显示出来,因为该查询永远会有结果,过滤器objectClass=*总是返回一个对象。当图标被显示时响应为真,否则为假。
例如构造如下的注入:

(&(objectClass=*)(objectClass=users))(&(objectClass=foo)(type=Epson*))

(&(objectClass=*)(objectClass=resources))(&(objectClass=foo)(type=Epson*))

这种代码注入的设置允许攻击者推测可能存在于LDAP目录服务中不同对象类的值。当响应Web页面至少包含一个打印机图标时,对象类的值就是存在的,另一方面而言,如果对象类的值不存在或没有对它的访问,就不会有图标出现。

    - LDAP OR盲注

这种情况下,用于推测想要的信息的逻辑是相反的,因为使用的是OR逻辑操作符。接下来使用的是同一个例子,OR环境的注入为:

         (|(objectClass=void)(objectClass=void))(&(objectClass=void)(type=Epson*))

这个LDAP查询没有从LDAP目录服务获得任何对象,打印机的图标也不会显示给客户端(FALSE)。如果在响应的Web页面中有任何图标,则响应为TRUE。故攻击者可以注入下列LDAP过滤器来收集信息:

         (|(objectClass=void)(objectClass=users))(&(objectClass=void)(type=Epson*))
(|(objectClass=void)(objectClass=resources))(&(objectClass=void)(type=Epson*))

0x04 LDAP注入防御

LDAP注入的防御跟SQL注入的防御其实差不多,主要就是要把用户输入的东西过滤好,基本就可以防御了。
下图包含了LDAP中用到的特殊字符和需要转义处理的字符:

 

左边的字符在正常情况下是不会用到的,如果在用户的输入中出现了需要用反斜杠转义处理。而右边的圆括号这些如果不过滤的话就会导致过滤器闭合而生产攻击者需要的filter,这里看到不仅是用反斜杠处理,还将字符变成了相应的ASCII码值,这些符号本不该出现。

这段php防御代码可以记录一下:

function ldapspecialchars($string) {
$sanitized=array('\\' => '\5c',
'*' => '\2a',
'(' => '\28',
')' => '\29',
"\x00" => '\00'); return str_replace(array_keys($sanitized),array_values($sanitized),$string);
}

LDAP服务开启的端口是389,如果发现某个服务器上开启了该端口很可能就是开启了LDAP服务


作者:Pino_HD
链接:http://www.jianshu.com/p/d94673be9ed0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【LDAP】LDAP注入漏洞与防御的更多相关文章

  1. SQL注入漏洞篇

    一篇SQL注入漏洞汇总,更新中-- 如有缺陷 望大佬指正 SQL注入产生的原因? 当程序执行逻辑时没有对用户输入的参数做过滤处理,使参数直接与后台数据库产生逻辑交互,即SQL注入黑客就可以利用各种SQ ...

  2. 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞

    看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...

  3. WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案(转)

    对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...

  4. WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案

    对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...

  5. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  6. XML实体注入漏洞

    XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...

  7. Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴

    本文由云+社区发表 0x00 前言 干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtiger CRM)进行白盒审计, ...

  8. SQL注入漏洞解决方法

    本文只指针编码层次的SQL注入漏洞解决方法,例子代码是以java为主. 1,参数化的预编译查询语句 不安全例子 String query = "SELECT account_balance ...

  9. XXE注入攻击与防御

    在研究XXE注入攻击之前先了解一下什么是XXE 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括 ...

随机推荐

  1. [NOI2014]购票(斜率优化+线段树)

    题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接 ...

  2. http_proxy_module模块常用参数

    Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器. http_proxy_module模块常用参数: p ...

  3. Windows下安装flask虚拟环境

    前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...

  4. 前端JS Excel解析导入

    本文转载自:https://www.cnblogs.com/yinqingvip/p/6743213.html 需要用到js-xlsx:下载地址:js-xlsx <!DOCTYPE html&g ...

  5. Mysql 远程连接服务器

    #授权外部访问 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; #清空mysql缓存 ...

  6. 第二篇:用Android Studio编写Hello World

    将Android Studio的环境搭建好后,第一个写Hello World测试程序.Android Studio v3.2.1. 一.新建工程 点击Start a new Android Studi ...

  7. 团体程序设计天梯赛(CCCC) L3012 水果忍者 上凸或下凹的证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code #include <cstdio> #include ...

  8. jmeter-录制, 编辑脚本,性能测试全过程review

    录制脚本 jmeter下载安装略过不谈,上步骤: 1.在测试计划新建-threads-线程组 2.在工作台新建-非测试原件-http代理服务器,设置端口和包含网址 不包含网址 3.在手机/浏览器,设置 ...

  9. python 购物车小程序

    python 购物车小程序 功能要求:1.启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. ...

  10. CodeForces165E 位运算 贪心 + 状压dp

    http://codeforces.com/problemset/problem/165/E 题意 两个整数 x 和 y 是 兼容的,如果它们的位运算 "AND" 结果等于 0,亦 ...