问题:XMLDecoder注入

针对 xml 解码器的注入攻击
反序列化用户控制的 XML ,程序没有进行验证, 会让攻击者有机会在服务器上执行恶意代
码。
例:下面代码片段中, XMLDecoder 处理不可信的输入。
...
XMLDecoder decoder = new XMLDecoder(new InputSource(new
InputStreamReader(request.getInputStream(), "UTF-8")));
Object object = decoder.readObject();
decoder.close();
...
如果输入以下 XML 文档,会实例化 ProcessBuilder 对象,并调用其静态 start() 方法以运行 Windows
计算器。
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
修复:XMLDecoder注入
尽量避免将 XMLDecoder 与由用户控制的数据一起使用。如程序中不能避免,需要验证输入的 XML
问题:LDAP 注入
LDAP ,轻量目录访问协议
|dn : 一条记录的位置 |
dc : 一条记录所属区域 |
|ou : 一条记录所属组织 |
|cn/uid: 一条记录的名字 /ID|
此处我更喜欢把 LDAP 和 数据库类比起来,我是直接把 LDAP 看成是一个主要用于查询的数据库。
数据库用 来存数据, LDAP 来存数据。数据库主要是三个 DB,TABLE,ROW 来定位一条记录,而 LDAP
首先要说明是哪一棵树 dc ,然后是从树根到目的所经过的所有 分叉 ou group ),最后就是目标的名
字,例如 UID 等等。
具体到如何定义如下:
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com
其中树根是 dc=waibo,dc=com ,分叉 ou=bei,ou=xi,ou=dong ,目标 cn=honglv
注意要把 “cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org” 看成是一个整体,它只是属性 dn
具体的一条记录如下:
dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org
objectClass organizationalPerson
cn:stan
cn: 小刀
sn: 小刀
description:a good boy
(保存成 LDIF 文件,可以导入到 LDAP 数据库中) LDAP 基本语法
=( 等于 )
查找 属性为 “ LDAP 注入是指客户端发送查询请求时,输入的字符串中含有一些特殊字符,导致
修改了 LDAP 本来的查询结构,从而使得可以访问更多的未授权数据的一种攻击方式。
例如:以下代码动态构造一个 LDAP 查询,并对其加以执行,该查询可以检索所有报告给指定
经理的雇员记录。该经理的名字是从 HTTP 请求中读取的,因此不可信任。
...
DirContext ctx = new InitialDirContext(env);
String managerName = request.getParameter("managerName");
//retrieve all of the employees who report to a manager
String filter = "(manager=" + managerName + ")";
NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",filter);
...
在正常情况下,诸如搜索向 John Smith 经理报告的雇员,该代码执行的筛选器如下:
(manager=Smith, John” 的所有对象,可以使用: )
(givenName=John)
这会返回 属性为 “John” 的所有对象。圆括号是必需的,以便强调 LDAP 语句的开始和结束。
&( 逻辑与 )
如果具有多个条件并且希望全部条件都得到满足,则可使用此语法。例如,如果希望查找居住在
Dallas 并且 “John” 的所有人员,可以使用:
(&(givenName=John)(l=Dallas))
请注意,每个参数都被属于其自己的圆括号括起来。整个 LDAP 语句必须包括在一对主圆括号中。
操作符 & 表明,只有每个参数都为真,才会将此筛选条件应用到要查询的对象。
!( 逻辑非 )
此操作符用来排除具有特定属性的对象。假定您需要查找 “John” 的对象以外的所有对象。则应
使用如下语句:
(!givenName=John)
此语句将查找 不为 “John” 的所有对象。请注意: ! 操作符紧邻参数的前面,并且位于参数的圆括
号内。由于本语句只有一个参数,因此使用圆括号将其括起以示说明
* (通配符)
可使用通配符表示值可以等于任何值。使用它的情况可能是:您希望查找具有职务头衔的所有对象。
为此,可以使用:
(title=*)
这会返回 “title” 属性包含内容的所有对象。另一个例子是:您知道某个对象的 属性的开头两个字
母是 “Jo” 。那么,可以使用如下语法进行查找:
(givenName=Jo*)
这会返回 “Jo” 开头的所有对象。
高级用法 eg:
您需要一个筛选条件,用来查找居住在 Dallas Austin ,并且名为 “John” 的所有对象。使用的语法
应当是:
(&(givenName=John)(|(l=Dallas)(l=Austin)))
LDAP 注入
LDAP 注入攻击和 SQL 注入攻击相似,因此接下来的想法是利用用户引入的参数生成 LDAP 查询。一
个安全的 Web 应用在构造和将查询发送给服务器前应该净化用户传入的参数。在有漏洞的环境中,这些参
数没有得到合适的过滤,因而攻击者可以注入任意恶意代码。
使用得最广泛的 LDAP ADAM OpenLDAP ,下面的结论将会致代码注入:
引入
(attribute=value)
如果过滤器用于构造查询单缺少逻辑操作符,如 value)(injected_filter ,瞬间导致产生了两个过滤器,
(attribute=value)(injected\_filter)
通常,在 OpenLDAP 实施中,第二个过滤器会被忽略,只有第一个会被执行。
而在 ADAM 中,有两个过滤器的查询是不被允许的,因而这个注入毫无用处。
(|(attribute=value)(second_filter)) or (&(attribute=value)(second_filter))
如果第一个用于构造查询的过滤器有逻辑操作符,形如 value)(injected_filter) 的注入会变成如下过滤
器:
(&(attribute=value)(injected_filter)) (second_filter)
虽然过滤器语法上并不正确, OpenLDAP 还是会从左到右进行处理,忽略第一个过滤器闭合后的任
何字符。
但是有的浏览器会进行检查,检查过滤器是否正确,这种情况下 value)(injected_filter))(&(1=0 ,于是
就出现了下述 payload
(&(attribute=value)(injected_filter))(&(1=0)(second_filter))
既然第二个过滤器会被 LDAP 服务器忽略,有些部分便不允许有两个过滤器的查询。这种情况下,只
能构建一个特殊的注入以获得单个过滤器的 LDAP 查询,如 value)(injected_filter 得到
(&(attribute=value)(injected_filter)(second_filter))
AND 注入
这种情况,应用会构造由 ”&” 操作符和用户引入的的参数组成的正常查询在 LDAP 目录中搜索,例如:
(&(parameter1=value1)(parameter2=value2))
这里 Value1 value2 是在 LDAP 目录中搜索的值,攻击者可以注入代码,维持正确的过滤器结构但
能使用查询实现他自己的目标。
绕过访问控制
一个登陆页有两个文本框用于输入用户名和密码,过滤器如下:
(&(USER=Uname)(PASSWORD=Pwd))
如果攻击者输入一个有效地用户名,如 r00tgrok ,然后再这个名字后面注入恰当的语句, password
检查就会被绕过。输入 Uname=slisberger)(&)) ,得到如下
(&(USER= slisberger)(&)(PASSWORD=Pwd))
LDAP 服务器只处理第一个过滤器,即仅查询 (&(USER=slidberger)(&)) 得到了处理。这个查询永真 ,
成功绕过
权限提升
现假设下面的查询会向用户列举出所有可见的低安全等级文档:
(&(directory=document)(security_level=low))
这里第一个参数 document 是用户入口, low 是第二个参数的值。如果攻击者想列举出所有可见的高
安全等级的文档,他可以利用如下的注入: **document)(security_level=*))(&(directory=documents**
得到
(&(directory=documents)(security_level=*))(&(direcroty=documents)(security_level=low))
LDAP 服务器仅会处理第一个过滤器而忽略第二个,因而只有下面的查询会被处理:
(&(directory=documents)(security_level=*))
结果就是,所有安全等级的可用文档都会列举给攻击者
OR 注入
这种情况,应用会构造由 ”|” 操作符和用户引入的的参数组成的正常查询在 LDAP 目录中搜索,例如:
(|(parameter1=value1)(parameter2=value2))
这里 Value1 value2 是在 LDAP 目录中搜索的值,攻击者可以注入代码,维持正确的过滤器结构但
能使用查询实现他自己的目标。
具体的注入方式和 AND 差不太多,不予详述。
AND 盲注
假设一个 Web 应用想从一个 LDAP 目录列出所有可用的 Epson 打印机,错误信息不会返回,应用发
送如下的过滤器:
(&(objectClass=printer)(type=Epson*))
正确的过滤器为:
(&(objectClass=printer)(type=Epson*))
而当注入 )(objectClass=))(&(objectClass=void 时得到
(&(objectClass=*)(objectClass=*))(&(objectClass=void)(type=Epson*))
执行第一个,过滤器 objectClass=* 总是返回一个对象。当图标被显示时响应为真,否则为假。
这样我们就可以猜第二个括号的 objectclass 字段有些什么内容了。
LDAP 盲注技术让攻击者使用基于 TRUE/FALSE 的技术访问所有的信息。
盲注深入
攻击者可以使用字母、数字搜索提取属性的值,这个想法的关键在于将一个复杂的值转化为
TRUE/FALSE 列表。这个机制,通常称为 booleanization ,大意是二值化吧,图十二概括了该机制,可用于
不同的方式。
假设攻击者想知道 department 属性的值,处理如下:
(&(idprinter=HPLaserJet2100)(department=a*))(object=printer))
(&(idprinter=HPLaserJet2100)(department=f*))(object=printer))
(&(idprinter=HPLaserJet2100)(department=fa*))(object=printer))
如此根据返回的不同结果猜解是否正确,和 MYSQL 盲注类似。
同样,攻击者可以使用字符集削减技术减少获得信息所需的请求数,为完成这一点,他使用通配符
测试给定的字符在值中是否为 anywhere
(&(idprinter=HPLaserJet2100)(department=*b*))(object=printer))
(&(idprinter=HPLaserJet2100)(department=*n*))(object=printer))
这样子可以看 department 中是否有 b n ,巧用可以加速猜解过程,当然一般肯定都是写脚本猜解
但是,由于筛选器是通过连接一个常数基本查询串和一个用户输入串动态构造而成的,因此,该查询只在
managerName 不包含任何 LDAP 元字符时才能正常运行。如果攻击者为 managerName 输入字符串
Hacker, Wiley)(|(objectclass=*) ,则该查询会变成:
(manager=Hacker, Wiley)(|(objectclass=*))
根据执行查询的权限,增加 |(objectclass=*) 条件会导致筛选器与目录中的所有输入都匹配,而
且会使攻击者检索到有关用户输入池的信息。根据执行 LDAP 查询的权限大小,此次攻击的影响范围可能
会有所差异,但是如果攻击者能够控制查询的命令结构,那么这样的攻击至少会影响执行 LDAP 查询的用
户可以访问的所有记录。
修复:LDAP 注入
LDAP 注入的根本原因是攻击者提供了可以改变 LDAP 查询含义的 LDAP 元字符。构造 LDAP 筛选器
时,程序员应清楚哪些字符应作为命令解析,而哪些字符应作为数据解析。为了防止攻击者侵犯程序员的
各种预设情况,应使用白名单的方法,确保 LDAP 查询中由用户控制的数值完全来自于预定的字符集合,
应不包含任何 LDAP 元字符。如果由用户控制的数值范围要求必须包含 LDAP 元字符,则应使用相应的编
码机制转义这些元字符在 LDAP 查询中的意义。
例如:以下代码片段中使用 Spring 框架 EqualsFilter 类来构造一个编码得当的筛选器字符串。不
论请求参数中是否存在 LDAP 元字符,这一字符串都可以保护指令的命令结构。
...
DirContext ctx = new InitialDirContext(env);
String managerName = request.getParameter("managerName");
//retrieve all of the employees who report to a manager
EqualsFilter filter = new EqualsFilter("manager", managerName);
NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",filter.toString())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909441.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909441.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909441.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 对象层级处理小结

一.第一优先级Camera Culling Mask属性指定Camera显示的Layer,可以多选 Depth:Depth大的Camera显示的Layer显示在前面 二.避免使用PositionZ调整遮挡关系 在 2D 游戏中,虽然可以通过 Z 轴来调整显示顺序,但这与 2D 游戏的设计理念不符。在可以控制显示层级的多个要素或方…

python基础举例

最近又重新开始学python&#xff0c;浅浅记录下学习到的东西&#xff08;也方便自己回顾看&#xff09; 缩进、空格对于python很重要&#xff0c;一定要注意&#xff01; 以下代码是基于pycharm编写的。 01 输出 #注释 # 单行注释用# &#xff0c;ctrl/是单行注释的快捷键 # …

开疆智能ModbusTCP转Canopen网关连接汇川PLC配置案例

本案例是通过开疆智能研发的ModbusTCP转Canopen网关将汇川PLC与陀螺仪连接进行组网通讯。 准备阶段 软件&#xff1a;InoProShop(V1.7.3)&#xff0c;CANopen Configuration Studio PLC&#xff1a;汇川AC801-0221-R0R0 网关&#xff1a;开疆智能ModbusTCP转Canopen网关 陀…

Tess4J:基于 Java 的 OCR 解决方案

在现代软件开发中&#xff0c;图像识别与文本提取已成为许多应用场景中的关键环节。OCR&#xff08;Optical Character Recognition&#xff09; 技术使得从图像中提取文字成为可能。Tess4J 是一个基于 Java 的 OCR 开发库&#xff0c;它封装了 Google Tesseract OCR 引擎的本地…

Vue3 + JavaScript 父组件点击按钮触发子组件事件方法

在 Vue 3 中&#xff0c;父组件点击按钮触发子组件事件有以下三种常用方式&#xff1a; 方法 1&#xff1a;使用 ref 直接调用子组件方法&#xff08;推荐&#xff09; vue 复制 下载 <!-- 父组件 --> <template><button click"callChildMethod"…

超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 @Docker

InfiniSynapse 通过自研的第二代LLM-Native RAG实现了企业业务的理解&#xff0c;精准的Schema召回保证数据的准确性。提供专门为大模型优化的InfiniSQL语言&#xff0c;从而可以更加准确的生成查询语句&#xff0c;通过 InfiniSQL 引擎让人类第一次对存储在各种数据源的全模态…

解决国内无法加载谷歌验证码(reCAPTCHA):URL 重定向配置指南

解决国内无法加载谷歌验证码&#xff08;reCAPTCHA&#xff09;&#xff1a;URL 重定向配置指南 在搭建网站或使用某些应用时&#xff0c;经常会遇到需要调用谷歌验证&#xff08;reCAPTCHA&#xff09;API 的情况。然而&#xff0c;由于网络环境的特殊性&#xff0c;国内多数…

【Qt】如何使用QtInstallerFramework打包Qt程序

使用 Qt Installer Framework 可以将你的 Qt 程序打包成一个带有安装向导的安装包&#xff0c;适用于 Windows、Linux 和 macOS 平台。以下是完整的打包流程&#xff0c;以你当前开发的 ecgexport 应用为例。 &#x1f9f0; 一、准备工作 1. 安装 Qt Installer Framework 下载…

如何编写高效的Prompt:从入门到精通

在人工智能时代&#xff0c;特别是随着大型语言模型(LLM)如ChatGPT、Claude等的普及&#xff0c;编写高质量的Prompt(提示词)已成为一项关键技能。一个好的Prompt可以显著提高AI输出的质量和相关性&#xff0c;而一个糟糕的Prompt可能导致无用甚至误导性的结果。本文将带你深入…

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…

【机械视觉】Halcon—【十三、实例找各个区域面积和中心点】

找区域面积和中心点 *获取图像 read_image (Image, fabrik) *关闭窗口 dev_close_window () *打开窗口 dev_open_window (0, 0, 512, 512, black, WindowID) *设置输出字体&#xff0c;14号字&#xff0c;Courier字体&#xff0c;粗体 set_display_font (WindowID, 14, mono, …

MongoDB 基础

一、MongoDB 基础概念 1. 什么是 MongoDB MongoDB 是一个文档型数据库&#xff0c;数据以类似 JSON 的文档形式存储&#xff0c;使用 BSON 格式。设计理念是应对大数据量1、高性能和灵活性需求。数据组织方式&#xff1a;数据库→2集合→文档&#xff0c;其中集合类似于关系型…

RNN:从记忆困境到序列建模革命

在自然语言处理的战场上&#xff0c;一个句子中的每个单词都承载着前文的记忆。当传统神经网络面对这种时序依赖束手无策时&#xff0c;循环神经网络&#xff08;RNN&#xff09; 以独特的循环结构开启了序列建模的新纪元。它像人类阅读般记忆上下文&#xff0c;却也因记忆衰减…

阳台光伏配套电表ADL200N-CT/D16-Wf-1

安科瑞 华楠 18706163979 引言 在“双碳”目标推动下&#xff0c;绿色能源正逐步走进日常生活。阳台光伏作为一种新型分布式发电方式&#xff0c;凭借灵活安装、高效节能的特点&#xff0c;成为城市家庭和工商业用户的新选择。安科瑞推出的ADL200N-CT/D16-Wf-1阳光光伏电表&a…

功能测试—软件的生命周期

市场需求调研 可行性研究 从企业的人力储备、技术储备、资金储备等方面出发&#xff0c;论证经济效益或者社会效益能否达到预期 项目立项 需求开发 输出&#xff1a;需求规格说明书需求评审&#xff08;需求测试&#xff09;&#xff1a;测试&#xff08;测试负责人、资深测…

PostgreSQL 日常维护

目录 前言 基本使用 1. 登录数据库 2. 数据库操作 2.1 列出库 2.2 创建库 2.3 删除库 2.4 切换库 2.5 查看库大小 3. 数据表操作 3.1 列出表 3.2 创建表 3.3 复制表 3.4 删除表 3.5 查看表结构 4. 模式操作命令 4.1 创建模式 4.2 默认模式 4.3 删除模式 4.4…

STM32F4通用定时器TIM9-TIM14讲解及PWM呼吸灯实例解读

STM32F4通用定时器TIM9-TIM14讲解及PWM呼吸灯实例解读 前言小贴士 通用定时器原理定时器的内部时钟源通用定时器TIM9-TIM14的对比共同点区别 TIM9-TIM14功能说明时基单元计数模式时钟选择 定时器框图理解和分析TIM10/TIM11/TIM13/TIM14输入捕获输出比较 TIM9和TIM12独立通道输入…

whttpserver:一个命令极速搭建文件上传与下载服务器

whttpserver 是一个简单的HTTP服务器&#xff0c;类似于python -m http.server&#xff0c;但增加了文件上传和编辑的功能。 1. 安装 whttpserver 模块 # 临时设置环境变量 PYTHONUTF81&#xff0c;强制 Python 使用 UTF-8 编码 set PYTHONUTF81 pip install whttpserver 2.…

【0.2 漫画操作系统原理】

🖥️ 漫画操作系统原理 🎯 学习目标:深入理解操作系统核心原理,为Java并发编程和性能优化打下坚实基础 🎪 第一章:操作系统初识篇 🤔 什么是操作系统? 想象一下,你是一个大型图书馆的馆长… 📚 没有操作系统 vs 有操作系统没有操作系统: 读者1 → 直接找书架…

第1章 C# 和 .NET 框架 笔记

第1章 C# 和 .NET 框架 1.1 在 .NET 之前 C#为在.NET框架上开发程序而设计的编程语言。 MFC&#xff08;Microsoft Foundation Class&#xff0c;微软基础类库&#xff09; 微软公司提供的一个类库&#xff0c;以 C 类的形式封装了 Windows 的 API&#xff0c;并包含一个应…