PHP中的zaproxy扫描报告解决方案



我正在使用zaproxy对我的站点进行自动测试。扫描报告中存在P1警报。我不知道如何纠正这个错误。有人能帮我吗

https://example.com/index.php?id=1535&source=home&storyId=468&r=video%2Fview%22%26timeout+%2FT+5%26%22&mode=current
Parameter
r
Attack
video/view"&timeout /T 5&"

好的,所以这是一个定时攻击。如果服务器负载不足,则这些问题很容易出现误报。

您应该始终尝试手动验证扫描工具(包括ZAP)报告的任何潜在漏洞。

在这种情况下,打开浏览器中引用的URL-加载大约需要5秒吗?然后把URL上的"5"改成更大的,比如"30"——现在花了30秒吗?

如果花费大约相同的时间,那么这很可能是假阳性。

警报详细信息

高(中)远程操作系统命令注入说明

用于未经授权执行操作系统命令的攻击技术。当应用程序接受不受信任的输入以不安全的方式构建操作系统命令时,可能会发生这种攻击,包括不正确的数据净化和/或不正确的外部程序调用。

URL

https://example.com/index.php?id=1535&source=home&storyId=468&r=视频%2View%22%26超时+%2FT+5%26%22&mode=当前

Parameter

r

Attack

视频/视图"&timeout/T5&">

URL

https://example.com/index.php?id=1535&source=home&storyId=468&r=视频%2View&模式=当前%22%7超时+%2FT+5

Parameter

模式

Attack

当前"|超时/T5

URL

https://example.com/index.php?r=site/login

Parameter

用户时区

Attack

&睡眠5s&

URL

https://example.com/js/tinymce/tinymce.min.js?version=1405493567%26sleep+%7B0%7Ds%26

Parameter

版本

Attack

1405493567&睡觉{0}s&

URL

https://example.com/themes/sharperax/css/sh-style.css?version=1454508637%22%26sleep+5s%26%22

Parameter

版本

Attack

1454508637"睡眠5s&">

实例

5

解决方案

如果可能的话,使用库调用而不是外部进程来重新创建所需的功能。

在"监狱"或类似的沙箱环境中运行代码,该环境强制执行进程和操作系统之间的严格边界。这可能会有效地限制哪些文件可以在特定目录中访问,或者哪些命令可以由您的软件执行。

操作系统级别的例子包括Unix chroot监狱、AppArmor和SELinux。一般来说,托管代码可以提供一些保护。例如,java SecurityManager中的java.io.FilePermission允许您指定对文件操作的限制。

这可能不是一个可行的解决方案,它只会限制对操作系统的影响;您申请的其余部分可能仍会受到影响。

对于将用于生成要执行的命令的任何数据,请尽可能多地将这些数据置于外部控制之外。例如,在web应用程序中,这可能需要将命令存储在会话状态的本地,而不是将其发送到隐藏的表单字段中的客户端。

使用一个经过审查的库或框架,它不允许出现这种弱点,或者提供使这种弱点更容易避免的构造。

例如,考虑使用ESAPI编码控件或类似的工具、库或框架。这些将帮助程序员以一种不易出错的方式对输出进行编码。

如果您需要使用动态生成的查询字符串或命令(尽管存在风险),请正确引用参数并转义这些参数中的任何特殊字符。最保守的方法是转义或过滤所有没有通过极其严格的白名单的字符(例如所有不是字母数字或空格的字符)。如果仍然需要一些特殊字符,如空格,请在转义/筛选步骤后用引号将每个参数括起来。小心论点注入。

如果要执行的程序允许在输入文件中或从标准输入中指定参数,那么可以考虑使用该模式来传递参数,而不是命令行。

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

有些语言提供了可用于调用命令的多个函数。在可能的情况下,识别使用单个字符串调用命令shell的任何函数,并将其替换为需要单独参数的函数。这些函数通常对参数执行适当的引用和筛选。例如,在C中,system()函数接受一个包含要执行的整个命令的字符串,而execl()、execve()和其他函数则需要一个字符串数组,每个参数一个。在Windows中,CreateProcess()一次只接受一个命令。在Perl中,如果system()提供了一个参数数组,那么它将引用每个参数。

假设所有输入都是恶意的。使用"接受已知良好"输入验证策略,即使用严格符合规范的可接受输入白名单。拒绝任何不严格符合规范的输入,或者将其转换为符合规范的内容。不要只依赖于查找恶意或格式错误的输入(即,不要依赖黑名单)。然而,黑名单可以用于检测潜在的攻击,或者确定哪些输入格式错误,应该直接拒绝。

执行输入验证时,请考虑所有潜在的相关属性,包括长度、输入类型、可接受值的全部范围、丢失或额外的输入、语法、相关字段的一致性以及对业务规则的一致性。作为业务规则逻辑的一个例子,"boat"可能在语法上是有效的,因为它只包含字母数字字符,但如果您希望使用"红色"或"蓝色"等颜色,则它是无效的

构造操作系统命令字符串时,请使用严格的白名单,根据请求中参数的预期值限制字符集。这将间接限制攻击的范围,但这种技术不如正确的输出编码和转义重要。

请注意,正确的输出编码、转义和引用是防止操作系统命令注入的最有效解决方案,尽管输入验证可能会提供一些深度防御。这是因为它有效地限制了输出中出现的内容。输入验证并不总是阻止操作系统命令注入,尤其是当您需要支持可能包含任意字符的自由格式文本字段时。例如,在调用邮件程序时,您可能需要允许主题字段包含其他危险的输入,如";"one_answers">"字符,这些字符需要转义或以其他方式处理。在这种情况下,剥离字符可能会降低操作系统命令注入的风险,但这会产生不正确的行为,因为主题字段不会按照用户的意愿记录。这似乎是一个小的不便,但当程序依赖于结构良好的主题行来将消息传递给其他组件时,这可能更重要。

即使您在验证中犯了错误(例如忘记了100个输入字段中的一个),适当的编码仍然可能保护您免受基于注入的攻击。只要不是孤立地进行,输入验证仍然是一种有用的技术,因为它可以显著减少攻击面,允许您检测一些攻击,并提供正确编码无法解决的其他安全优势。

参考

http://cwe.mitre.org/data/definitions/78.html

https://www.owasp.org/index.php/Command_Injection

CWE Id

78

WASC Id

31

最新更新