CWE

常见的弱点枚举

一个由社区开发的软件&硬件缺陷类型的列表

2021 CWE最重要的硬件的弱点
CWE最危险的弱点
>CWE列表> CWE -个人字典定义(4.10)
ID

cwe - 116:不适当的编码或逃避的输出

弱点ID: 116
抽象:
结构:简单的
视图定制的信息:
+描述
产品准备一个结构化的信息沟通与另一个组件,但编码或逃避的数据丢失或错误地完成。因此,是不会保留消息的预期结构。
+扩展描述

不当编码或逃避可以让攻击者修改命令发送到另一个组件,插入恶意命令。

大多数产品都遵循一个特定的组件之间的通信协议,它使用结构化的消息,比如查询或命令。这些结构化的消息可以包含原始数据穿插元数据和控制信息。例如,“GET /索引。html HTTP / 1.1”是一个结构化的消息包含一个命令(“获得”)和一个参数(“/ index . html”)和元数据使用的是哪一种协议版本(“HTTP / 1.1”)。

如果一个应用程序使用attacker-supplied输入构造结构化的消息不正确编码或逃避,那么攻击者可以插入特殊字符,将导致数据被视为控制信息或元数据。因此,组件接收输出执行错误的操作,或者错误地解读数据。

+替代条款
输出卫生处理
输出验证
输出编码
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 支柱支柱——一个弱点是最抽象类型的弱点和代表一个主题类/基地/变体相关弱点。支柱是不同于一个类别作为支柱技术上仍然是一种弱点,描述了一个错误,而一个类别代表一个共同特征用于组相关的东西。 707年 不适当的中和
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 117年 不正确的输出中和日志
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 644年 不当的HTTP头中和脚本语法
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 838年 不恰当的编码输出环境
CanPrecede 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 74年 不当中和下游组件使用的特殊元素的输出(注射)
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 类型 ID 的名字
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 838年 不恰当的编码输出环境
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
架构和设计
实现
操作
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

类:不是特定于语言的(通常是普遍的)

技术

数据库服务器(通常是普遍的)

Web服务器(通常是普遍的)

+常见的后果
部分帮助这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 影响 可能性
完整性

技术的影响:修改应用程序数据

组件之间的通信可以被修改以意想不到的方式。意想不到的命令可以执行,绕过其他安全机制。传入的数据可以被误解。
完整性
保密
可用性
访问控制

技术的影响:执行未经授权的代码或命令

组件之间的通信可以被修改以意想不到的方式。意想不到的命令可以执行,绕过其他安全机制。传入的数据可以被误解。
保密

技术的影响:旁路保护机制

组件之间的通信可以被修改以意想不到的方式。意想不到的命令可以执行,绕过其他安全机制。传入的数据可以被误解。
+利用的可能性
+示范例子

示例1

这段代码显示提交的电子邮件地址作为一种形式的一部分。

(坏的代码)
例如语言:JSP
< %字符串邮件= request.getParameter(“电子邮件”);% >

电子邮件地址:< % = % >邮件

从形式读取参数值反射回客户端浏览器没有被编码输出之前,允许各种XSS攻击(cwe - 79)。

示例2

考虑一个聊天应用程序的前端web应用程序与后端服务器通信。后端遗留代码,不执行身份验证或授权,所以前端必须实现它。聊天协议支持两个命令,说,禁令,尽管只有管理员可以使用禁止命令。每个参数都必须由一个空格隔开。原始输入url编码。指定的消息传递协议允许将多个命令在同一行如果是由“|”分隔字符。

首先让我们看看后台命令处理程序代码

(坏的代码)
例如语言:Perl
(inputString = readLineFromFileHandle美元serverFH);

#生成一个字符串数组用“|”分隔字符。
@commands =分裂(/ \ | / inputString美元);

foreach cmd美元(@commands) {

#独立的运营商参数基于单个空格
(运营商,args美元)=分裂(/ / cmd美元2);

(args = UrlDecode美元args);
如果($符eq“禁令”){
ExecuteBan (args);
}
elsif(运营商eq”说“美元){
ExecuteSay (args);
}
}

前端web应用程序接收到命令,编码发送到服务器,执行授权检查,并将命令发送到服务器。

(坏的代码)
例如语言:Perl
$ inputString = GetUntrustedArgument(“命令”);
(cmd, argstr美元)=分裂(/ \ s + / inputString美元,2);

#删除多余的空格和CRLF变化的空间
$ argstr = ~ s / \ s + / / gs;

$ argstr = UrlEncode ($ argstr);
如果(($ cmd eq“禁令”)& & (!IsAdministrator(用户名)美元)){
死”的错误:你不是管理。\ n”;
}

#与文件服务器使用文件句柄
$ fh = GetServerFileHandle (myserver);

印刷美元跳频“cmd argstr美元\ n”;

很明显,而协议和后端允许多个命令发送一个请求,前端只打算发一个命令。然而,UrlEncode函数可能会离开“|”字符完好无损。如果攻击者提供了:

(攻击代码)
世界|禁止user12问好

然后前端将看到这是一个“说”的命令,和美元argstr看起来像“hello world user12 |禁令”。由于命令是“说”,检查“禁令”命令将失败,和前端后端将url编码的命令:

(结果)
% 20世界问好| % 20 user12的禁令

然而,后端将把这些当作两个独立的命令:

(结果)
世界问好
禁止user12

不过,请注意,如果前端正确编码的“|”“% 7 c”,后端将只处理一个命令。

示例3

这个例子需要用户输入,通过它通过一个编码方案,然后创建一个用户指定的目录。

(坏的代码)
例如语言:Perl
子GetUntrustedInput {
返回($ ARGV [0]);
}

子编码{
我的(str)美元= @ _;
$ str = ~ s / \ & / \, / gs;
$str =~ s/\"/\"/gs;
str = ~ s / \ '美元/事情就让它\,/ gs;
$ str = ~ s / \ < / \ & lt; / gs;
$str =~ s/\>/\>/gs;
返回(str);
}

子doit {
我的美元uname =编码(GetUntrustedInput(“用户名”));
打印”< b >欢迎,美元uname ! < / b > < p > \ n”;
系统(“cd /home/$ uname;/bin/ls - l”);
}

程序员编码的尝试危险的人物,然而denylist编码是不完整的(cwe - 184),攻击者仍然可以通过一个分号,导致与指挥系统注入(cwe - 77)。

此外,编码与命令执行例程用于不当。攻击者甚至不需要插入自己的分号。攻击者可以利用编码程序提供分号分隔的命令。如果攻击者提供一个字符串的形式:

(攻击代码)
“pwd

然后程序将编码撇号和插入分号,哪些功能作为命令分隔符时传递给系统功能。这允许攻击者完成命令注入。

+观察到的例子
参考 描述
链:身份验证例程在Go-based敏捷开发产品不逃避的用户名(cwe - 116),允许LDAP注入(cwe - 90)
OS命令注入在备份软件使用shell元字符的文件名;正确的行为需要这个文件名是不能改变的。
Web应用程序时不设置字符集将页面发送给浏览器,允许XSS攻击当浏览器选择一个意想不到的编码。
程序不设置字符集向浏览器发送一个页面时,允许XSS攻击当浏览器选择一个意想不到的编码。
SQL注入通过密码参数;一个强大的密码可能包含“&”
跨站点脚本在聊天应用程序通过消息主题,通常可能包含“&”和其他XSS-related字符。
跨站点脚本在聊天应用程序通过消息,通常会允许包含任意内容。
+潜在的缓解措施

阶段:体系结构和设计

策略:库或框架

使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。

例如,考虑使用ESAPI编码控制(REF-45)或类似的工具、库或框架。这些将帮助程序员编码输出的方式不容易错误。

交替,使用内置函数,但考虑使用包装器,以防这些功能被发现有漏洞。

阶段:体系结构和设计

策略:参数化

如果可用,使用结构化机制自动执行数据和代码之间的分离。这些机制可以提供相关的引用,编码,自动验证,而不是依赖于开发人员提供此功能在每一个点生成输出。

例如,存储过程可以执行数据库查询结构和减少SQL注入的可能性。

阶段:体系结构和设计;实现

理解的上下文将使用您的数据编码,将预期。这是特别重要的不同组件之间传送数据的时候,或者当生成输出可以包含多个编码同时,如web页面或多部分邮件。研究所有预期的通信协议以及数据表现方式来决定所需要的编码策略。

阶段:体系结构和设计

在某些情况下,输入验证可能是一个重要的战略输出编码并不是一个完整的解决方案。例如,你可能会提供相同的输出,将加工由多个消费者使用不同的编码或陈述。在其他情况下,您可能需要允许用户提供的输入包含控制信息,如有限支持格式化的HTML标记在wiki或公告栏。当这种类型的需求必须满足,使用非常严格allowlist限制可以使用控制序列。确认由此产生的句法结构是你所希望的。使用普通的编码方法的其余部分输入。

阶段:体系结构和设计

使用输入验证作为深度防护措施来减少输出编码错误(见的可能性CWE-20)。

阶段:需求

完全指定哪些编码所需的组件,将彼此间的通信。

实施阶段:

当组件之间交换数据,确保组件都使用相同的字符编码。确保适当的编码应用于每个接口。时显式地设置您所使用的编码协议允许你这样做。
+检测方法

自动静态分析

这个弱点常常可以发现使用自动静态分析工具。许多现代工具使用数据流分析或基于技术来减少假阳性的数量。

有效性:温和

注意:这不是一个完美的解决方案,因为100%的准确率和覆盖率不可行。

自动动态分析

这个弱点能被探测到的使用动态交互的工具和技术的软件使用大型测试套件和许多不同的输入,如模糊测试(起毛)健壮性测试和故障注入。软件的操作可能慢下来,但它不应该成为不稳定,崩溃,或者产生不正确的结果。
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 751年 2009年前25 -安全组件之间的交互
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 845年 CERT甲骨文安全Java编码标准(2011)第二章-输入验证和数据卫生处理(IDS)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 883年 CERT c++安全编码部分49 -杂项(MSC)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 992年 SFP二级集群:错误的输入转换
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 1003年 弱点简化映射的漏洞发布
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1134年 SEI CERT甲骨文Java安全编码标准,指南00。输入验证和数据卫生处理(IDS)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1179年 01 SEI CERT Perl编码标准,指导方针。输入验证和数据卫生处理(IDS)
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1347年 OWASP十大2021类别A03:2021 -注射
+笔记

的关系

这个弱点是主要缺点与注入(cwe - 74)由于注入的固有性质涉及违反了结构化的消息。

的关系

cwe - 116CWE-20有着密切的关联,因为根据结构化信息的本质,正确输入验证可以间接地阻止特殊字符改变结构化信息的意义。例如,通过确认数字ID字段应该只包含0 - 9的字符,程序员有效地防止注入攻击。

然而,输入验证并不总是足够的,特别是当严格的数据类型必须支持较少,如自由格式的文本。考虑一个SQL注入场景,在该场景中,一个姓是插入一个查询。“O ' reilly”这个名字可能会通过验证步骤,因为它是一种常见的姓氏在英语语言。但是,它不能直接插入到数据库,因为它包含了““撇号的角色,这将需要转义或中和。在这种情况下,剥离撇号可能减少SQL注入的风险,但是它会产生不正确的行为,因为错误的名字将被记录下来。

术语

使用“编码”和“逃避”条件差别很大。例如,在一些编程语言中,术语交替使用,而其他语言为不同的任务提供api,使用这两个术语。这种重叠使用扩展到了网络,如“逃脱”JavaScript函数,其目的是说明编码。编码和逃避的概念早在Web几十年。鉴于这种情况下,很难CWE采取一致的词汇,不会被误解的一些选区。

理论

这是一个数据/指令边界误差数据的边界不够执行之前发送到不同的控制范围。

研究的差距

虽然许多漏洞发布相关输出编码不足,有这样一个强调输入验证作为一个保护机制,描述的根本原因很少。CVE内,重点主要是理解SQL注入和跨站点脚本编制等问题。很可能这个弱点经常发生在自定义协议支持多种编码,未必可检测与自动化技术。
+分类法映射
映射分类名称 节点ID 适合 映射节点名
WASC 22 输出处理不当
CERT甲骨文安全Java编码标准(2011) IDS00-J 确切的 清洁不可信的数据通过在信任边界
CERT甲骨文安全Java编码标准(2011) IDS05-J 使用ASCII文件和路径名的一个子集
SEI CERT甲骨文Java编码标准 IDS00-J 不精确的 防止SQL注入
SEI CERT Perl编码标准 IDS33-PL 确切的 清洁不可信的数据通过在信任边界
+引用
REF-45 OWASP。“OWASP企业安全API (ESAPI)项目”。<http://www.owasp.org/index.php/ESAPI>。
REF-46 Joshbw。“卫生处理输出”。2008-09-18。<http://www.analyticalengine.net/archives/58>。
[REF-47] " PK。“清除用户数据:怎么去做”。2008-09-11。<http://www.diovo.com/2008/09/sanitizing-user-data-how-and-where-to-do-it/>。
[REF-48]耶利米格罗斯曼。“输入验证或输出过滤,哪个更好?”。2007-01-30。<http://jeremiahgrossman.blogspot.com/2007/01/input-validation-or-output-filtering.html>。
[REF-49]吉姆Manico。“输入验证,不是那么重要”。2008-08-10。<http://manicode.blogspot.com/2008/08/input-validation-not-that-important.html>。
(REF-50)迈克尔·爱丁顿。“防止XSS与正确的输出编码”。<http://phed.org/2008/05/19/preventing-xss-with-correct-output-encoding/>。
[REF-7]大卫迈克尔·霍华德和勒布朗。编写安全代码。11章,“问题”标准表示363页。第二版。微软出版社。2002-12-04。<https://www.microsoftpressstore.com/store/writing -安全-代码- 9780735617223>。
+内容的历史
+提交
提交日期 提交者 组织
2006-07-19 CWE社区
CWE社区的成员提交的延长早期CWE版本
+修改
修改日期 修饰符 组织
2008-07-01 肖恩Eidemiller Cigital
添加/更新示范例子
2008-07-01 Eric Dalci Cigital
更新Time_of_Introduction
2008-09-08 CWE内容团队 主教法冠
更新的名字,关系
2009-01-12 CWE内容团队 主教法冠
更新Alternate_Terms、Applicable_Platforms Common_Consequences Demonstrative_Examples,描述,Likelihood_of_Exploit,名字,Observed_Examples, Potential_Mitigations,引用,Relationship_Notes,关系,Research_Gaps, Terminology_Notes Theoretical_Notes
2009-03-10 CWE内容团队 主教法冠
更新描述,Potential_Mitigations
2009-05-27 CWE内容团队 主教法冠
更新Related_Attack_Patterns
2009-07-27 CWE内容团队 主教法冠
更新Demonstrative_Examples
2009-10-29 CWE内容团队 主教法冠
更新的关系
2009-12-28 CWE内容团队 主教法冠
更新Demonstrative_Examples Potential_Mitigations
2010-02-16 CWE内容团队 主教法冠
更新Detection_Factors Potential_Mitigations、引用Taxonomy_Mappings
2010-04-05 CWE内容团队 主教法冠
更新Potential_Mitigations
2010-06-21 CWE内容团队 主教法冠
更新Potential_Mitigations
2011-03-29 CWE内容团队 主教法冠
更新Relationship_Notes、人际关系
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences、关系、Taxonomy_Mappings
2011-09-13 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2012-05-11 CWE内容团队 主教法冠
更新引用关系,Taxonomy_Mappings
2012-10-30 CWE内容团队 主教法冠
更新Potential_Mitigations
2014-06-23 CWE内容团队 主教法冠
更新的引用
2014-07-30 CWE内容团队 主教法冠
更新Demonstrative_Examples、人际关系
2015-12-07 CWE内容团队 主教法冠
更新的关系
2017-01-19 CWE内容团队 主教法冠
更新的关系
2017-05-03 CWE内容团队 主教法冠
更新Related_Attack_Patterns
2017-11-08 CWE内容团队 主教法冠
更新Applicable_Platforms、Common_Consequences Demonstrative_Examples Likelihood_of_Exploit,引用,Taxonomy_Mappings
2018-03-27 CWE内容团队 主教法冠
更新的引用
2019-01-03 CWE内容团队 主教法冠
更新的关系,Taxonomy_Mappings
2019-06-20 CWE内容团队 主教法冠
更新的关系
2020-02-24 CWE内容团队 主教法冠
更新的关系
2020-06-25 CWE内容团队 主教法冠
更新Applicable_Platforms、Demonstrative_Examples Potential_Mitigations
2021-03-15 CWE内容团队 主教法冠
更新的关系,Terminology_Notes
2021-10-28 CWE内容团队 主教法冠
更新的关系
2022-10-13 CWE内容团队 主教法冠
更新Observed_Examples
2023-01-31 CWE内容团队 主教法冠
更新描述
+以前的条目名称
改变日期 以前的条目名称
2008-04-11 输出验证
2008-09-09 不正确的输出卫生处理
2009-01-12 输出不足的卫生处理
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日