0

我正在使用 Fortify 静态代码分析来分析我们的软件。Fortify 报告说我们有一个跨站点脚本漏洞(反映),而我认为我们实际上并没有这样做。

我可以尝试与我的客户争论这一点,以说服他们这是安全的(没有人愿意做的事情,因为它需要审计)或者让 Fortify 高兴;

我从 ASP.NET 中的请求中获取了一个表单参数,然后“手动”(不使用 API)对其进行转义(转义任何换行符、\ 字符、引号并删除任何脚本标签)。然后我将它转储回浏览器

output.Write("var enteredText = \"" + htmlEscape( Form.Params["enteredText"] ) +"\"");

强化抱怨,除非我这样做

output.Write("var enteredText = \"" + htmlEscape( HttpUtility.HtmlEncode(Form.Params["enteredText"]) ) +"\"");

但这意味着要使用 Javascript var 'enteredText' 我必须使用 Javascript 对其进行 HTML 解码,这意味着我的应用程序上还有 10k 的代码(除非我错了)。在这种情况下,<> 和实体的整个编码和解码都是多余的,不是吗?

我怎样才能安抚Fortify?

4

2 回答 2

1

如果应用程序允许在输入文本字段中使用任意 JavaScript,并在浏览器中将其作为 JavaScript 执行,则确实存在反射的跨站点脚本漏洞,并且非常严重。任何可能导致用户针对您的应用程序发布帖子(例如,鱼叉式网络钓鱼攻击)的任何人都可能对用户造成各种混乱。这是一个非常直接的攻击。

因此,修复是以下之一

  • 在此输入文本字段中拒绝 JavaScript(以及 HTML 和 CSS)。或者,如果这破坏了您的应用程序:

  • 查看需要在输入文本字段中执行代码的用例并将可接受的值列入白名单。对于 JavaScript,拒绝任何可能导致页面重写的内容:OnLoad()、document.body.innerHTML(例如)的事件处理程序,或重定向用户的浏览器。
    还拒绝任何可能发布到远程服务器的内容(例如表单、img、css 标签)。正如您所暗示的,这可能是很多代码。

这只是一个简单的示例,您需要研究可用于跨站点脚本攻击的标签类型和事件处理程序。如果您不拒绝输入文本字段中的内容,您仍然会遇到漏洞。

希望这可以帮助。祝你好运。

于 2014-06-10T15:42:24.423 回答
0

对不起,我有一个 IE8/javascript 堆栈,我的 anwser 被截断了。我想说的是:

如果“清理输出”是指 htmlEscape() 函数,则转义通常不会解决跨站点脚本漏洞。您实际上只能通过白名单验证来防止跨站点脚本,而 Fortify 的发现是合理的。现在,如果 htmlEscape 确实解决了问题(例如,它不仅仅是转义输出),您可以确保 Fortify 可以找到该代码,或者在 Fortify 中编写一个“clense rule”,以便它忽略具有此调用的漏洞。

客户越来越多地使用 Fortify 和 MetaSploit 扫描关键软件。我感觉到你的痛苦。

于 2014-07-08T19:45:13.057 回答