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

时间:2016-02-08 07:34:16

标签: php zap

我正在使用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&"

2 个答案:

答案 0 :(得分:2)

好的,这是一次定时攻击。 如果服务器负载不足,则容易出现误报。

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

在这种情况下,打开浏览器中引用的网址 - 加载大约需要5秒钟吗?然后改变' 5'关于更大的东西的URL,例如' 30' - 现在需要30秒吗?

如果花费大约相同的时间,那么这可能是误报。

答案 1 :(得分:-1)

提醒明细

高(中)远程操作系统命令注入 描述

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

URL

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

视频/视图"& timeout / T 5&"

URL

https://example.com/index.php?id=1535&source=home&storyId=468&r=video%2Fview&mode=current%22%7Ctimeout+%2FT+5

Parameter

模式

Attack

当前" |超时/ T 5

URL

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

Parameter

userTimeZone

Attack

& sleep 5s&

URL

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

Parameter

版本

Attack

1405493567& sleep {0} s&

URL

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

Parameter

版本

Attack

1454508637"& sleep 5s&"

实例

5

解决方案

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

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

操作系统级示例包括Unix chroot jail,AppArmor和SELinux。通常,托管代码可以提供一些保护。例如,Java SecurityManager中的java.io.FilePermission允许您指定对文件操作的限制。

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

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

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

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

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

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

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

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

假设所有输入都是恶意的。使用"接受已知商品"输入验证策略,即使用严格符合规范的可接受输入的白名单。拒绝任何不严格符合规范的输入,或将其转换为具有相应规格的输入。不要完全依赖于查找恶意或格式错误的输入(即,不要依赖黑名单)。但是,黑名单可用于检测潜在的攻击或确定哪些输入格式错误以至于应该被彻底拒绝。

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

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

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

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

参考

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

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

CWE Id

78

WASC Id

31