Javascript中可能的XSS攻击

时间:2014-07-22 08:44:39

标签: javascript dom xss fortify

Fortify on demand向我展示了这行代码可能是XSS问题

if (window.location.search != '') {
    window.location.href = window.location.href.substr(0,baseurl.length+1)+'currencyCode='+event.getCurrencyCode()+'&'+window.location.href.substr(baseurl.length+1);
} else {
    window.location.href = window.location.href.substr(0,baseurl.length)+'?currencyCode='+event.getCurrencyCode()+window.location.href.substr(baseurl.length);
} 

我远不是JavaScript专家,但我需要修复此代码。

你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

我认为Fortify发现event.getCurrencyCode()可能是任何长度的字符串,并且可能包含跨站点脚本攻击,可能会将毫无戒心的用户发送到恶意站点或导致浏览器加载执行错误操作的JavaScript用户。您可以通过查看Fortify的Audit Workbench工具中的查找的详细信息选项卡来说明这一点。

假设event.getCurrencyCode可能提供潜在的恶意数据,您需要在事件来源或此代码中对此值进行白名单验证。我打赌这个应用程序中货币代码的频谱值相对较小,每个都是有限长度的,因此应该可以直接使用Javascript的内置正则表达式功能将该值列入白名单。

现在,如果由事件提供,JavaScript将很乐意在该URL中添加几乎无限长度的字符串,并且使用UTF-8字符集,攻击者可以做很多事情(内联JavaScript等等)。 )

希望这会有所帮助。祝好运。

答案 1 :(得分:0)

不幸的是,现有的答案是不正确的,而且ivy_lynx的评论并没有真正解决这个问题。

Fortify On Demand正在报告数据流漏洞。这种情况下,某些数据源自程序员以外的任何地方 - 并且会反映给不知情的最终用户的浏览器。

潜在危险数据来自:

  • event.getCurrencyCode()

你还没有发布足够的消息来源让我们知道这是什么,但一个很好的猜测是该函数应该只返回ISO货币代码,或者更确切地说是三个大写字母。 (“EUR”或“JPY”等)注意我在这里做了一个很大的假设;我看不到代码。

潜在危险数据最终进入浏览器的位置。

问题是开发人员无法保证将发送什么事件,或者该货币代码中可能会出现意外数据。

最简单的解决方法是将返回值从“event.getCurrencyCode()”转换为有保证的三个大写字母。没有已知的攻击可以用三个这样的大写字母表示。所以你可以替换:

  • event.getCurrencyCode()

  • / ^ [A-Z] [A-Z] [A-Z] $ /。exec(event.getCurrencyCode())

(参考:http://www.w3schools.com/jsref/jsref_regexp_exec.asp

当且仅当event.getCurrencyCode()解析为三个大写字母(如“USD”)时,才会正确构建您的URL。否则,“null”将进入预期货币代码的URL。

显然,您需要与真正的JavaScript开发人员合作才能实现此类修复,以免引入其他问题。