cwe - 94:不当控制生成的代码(代码注入)
视图定制的信息:
当一个产品允许用户输入包含代码的语法,有可能对攻击者工艺代码以这样一种方式,它将改变产品的预期控制流。这样的改变可能导致执行任意代码。 注入问题包含了各种各样的问题,减轻以非常不同的方式。出于这个原因,讨论这些弱点的最有效的方法是注意的不同特性进行分类注入的弱点。需要注意的最重要的问题是,注入所有的问题都有一个共同点,即。,他们允许注入控制平面数据到用户控制飞机。这意味着过程的执行可能被改变通过合法的数据通道发送代码,使用任何其他机制。虽然缓冲区溢出,和许多其他缺陷,包括获得执行进一步的使用问题,注入的问题只需要解析数据。最经典的实例化这个类别的软弱是SQL注入和格式字符串漏洞。
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”研究概念”(cwe - 1000)
相关观点“软件开发”(cwe - 699)
简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
相关视图”架构概念”(cwe - 1008)
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
示例1 这个例子试图写用户消息到消息文件,允许用户查看它们。
(坏的代码)
例如语言:PHP
$ MessageFile =“messages.out”;
如果($ _GET[“行动”= =“NewMessage”) {
$ name = $ _GET [“name”); }美元消息= $ _GET(“信息”); $处理= fopen (MessageFile美元," + "); 写入文件($处理,”< / b > < b > $ name说美元消息<人力资源> \ n”); 文件关闭($处理); 回声”消息得救了! < p > \ n”; else if ($ _GET[“行动”= =“ViewMessages”) {
包括(MessageFile美元); }而程序员MessageFile只包括数据计划,攻击者可以提供信息,如:
(攻击代码)
name = h4x0r
消息= % 3 c ? php % 20系统(% 22 / bin / ls % 20-l % 22); ? % 3 e 将解码后:
(攻击代码)
< ?php系统(“/ bin / ls - l”); ? >
程序员认为他们只是包括常规数据文件的内容,但PHP解析和执行代码。现在,这段代码执行任何时候人消息的看法。 注意,XSS (cwe - 79在这种情况下)也是可能的。 示例2 edit-config。pl:这CGI脚本用于修改配置文件中的设置。
(坏的代码)
例如语言:Perl
使用CGI qw(:标准);
子config_file_add_key {
我的(关键帧,美元,美元arg) = @ _;
#代码添加一个字段/文件的关键就在这里 子config_file_set_key {
我的(关键帧,美元,美元arg) = @ _;
#代码设置特定文件的关键就在这里 子config_file_delete_key {
我的(关键帧,美元,美元arg) = @ _;
#代码从一个特定的文件删除键就在这里 子handleConfigAction {
我的(帧,行动美元)= @ _;
我美元关键=参数(关键); 我$ val =参数(“val”); #这是高效的代码,特别是如果你必须调用 #任何几十种不同的功能之一! 我的代码=美元”config_file_ action_key美元(美元\帧美元\键,美元\ val);”; 美元eval(代码); $ configfile =“/ home / cwe / config.txt”; 打印头; 如果(定义(参数('行动'))){
handleConfigAction (configfile美元,参数('行动')); }其他{
打印”指定的任何行动! \ n”; }脚本打算采取行动的参数和调用多种功能的基于该参数的值——config_file_add_key (), config_file_set_key(),或config_file_delete_key ()。它可以单独设置一个条件来调用每个函数,但eval()是一个强大的方法使用更少的代码做同样的事情,尤其是当涉及大量的函数或变量。不幸的是,在这种情况下,攻击者可以提供其他值在操作参数,如:
(攻击代码)
中(“,”、“);系统(“/ bin / ls”);
这将产生以下字符串handleConfigAction ():
(结果)
config_file_add_key (”、“,”);系统(“/ bin / ls”);
可以添加任意Perl代码后,攻击者已经“关闭”建设的原始的函数调用,为了防止解析错误造成恶意eval()失败之前攻击者的有效载荷被激活。这个特定的操作系统()调用会失败后,因为“_key(\ $帧\键,美元\ $ val)”部分的字符串会导致一个错误,但这是无关紧要的攻击,因为负载已经激活。 示例3 这个简单的脚本要求用户提供一个数字列表作为输入,并将它们添加在一起。
(坏的代码)
例如语言:Python
def main ():
和= 0 main ()数量= eval(输入("输入一个空格分隔的数字列表:")) num的数字:
=和+ num求和 打印(f”之和{数字}={和}")eval()函数可以将用户提供的列表,并将它转换成一个Python列表对象,因此允许程序员使用列表理解方法来处理数据。但是,如果代码提供给eval()函数,它将执行代码。例如,恶意用户可以提供以下字符串:
(攻击代码)
__import__(“子流程”)。getoutput (rm - r *)
这将删除当前目录中的所有文件。由于这个原因,不建议使用eval()不可信的输入。 来完成这个不使用eval()是应用整数转换输入在一个try /除了块。如果用户提供的输入不是数字,这将提高ValueError。通过避免eval(),没有机会执行输入字符串的代码。
(好的代码)
例如语言:Python
def main ():
和= 0 main ()数量=输入(输入一个空格分隔的数字列表:)。分割(" ") 试一试:
num的数字: 除了ValueError:
=和+ num求和 打印(f”之和{数字}={和}")
print(“错误:无效输入”)
另一种选择是使用ast.literal_eval()函数从Python的ast模块。这个函数只考虑Python文字作为有效数据类型和不会执行任何代码中包含用户输入。
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
更多的信息是可用的,请选择一个不同的过滤器。
|
使用常见的弱点枚举(CWE)和相关的引用从这个网站的使用条款。CWE赞助的美国国土安全部(DHS)网络和基础设施安全机构(CISA)和管理的国土安全系统工程和发展研究所这是由(HSSEDI)manbetx客户端首页(斜方)。版权©2006 - 2023,斜方公司。manbetx客户端首页CWE、水煤浆、CWRAF, CWE标志是斜方公司的商标。manbetx客户端首页 |