如何在XSS中绕过客户端编码

时间:2012-02-11 10:31:08

标签: encoding xss client-side-validation client-side-scripting

我听到大家都说输出编码必须在客户端而不是服务器端完成。我的问题是:它是否因环境而异?

  1. 是否存在客户端输出编码足够好的情况 不能被绕过?
  2. 如果我使用像encodeURIComponent这样的客户端js函数来编码导致XSS的url,攻击者如何绕过这个并仍然导致XSS?
  3. 由于XSS,也可能发生网络钓鱼。如果我至少做输出编码可以防止网络钓鱼?

2 个答案:

答案 0 :(得分:2)

简短的回答是XSS编码需要在将数据放入html或javascript(服务器端和/或客户端)的情况下进行。我可以很容易地想象在服务器端放入脚本标记的数据开始正确编码,但是客户端的javascript正以不安全的方式使用该值,从而产生了XSS漏洞。

因此,当将不受信任的数据放入网页(无论是在html标签中,在-tags内,在css中等等 - 请参阅OWASP XSS预防备忘单)时,我们需要进行编码。然后,当我们来到客户端时,我们还需要确保我们的javascript不会引入XSS问题。例如,这可以是基于DOM的XSS,或上面提到的例子。

所以我的答案是,你需要在服务器和客户端进行编码。

我不明白第三个问题是如何相关的。网络钓鱼可能以多种不同的方式发生。在一个完全不同的域上,只是模仿原始页面等。

编辑:还有一件事。如果在没有编码的情况下将不受信任的数据放入页面服务器端,则客户端可以做很少的事情来解决这个问题。它很可能已经很晚了。

答案 1 :(得分:1)

Erlend的答案很美。我想分享一下有关输出编码的发现。

在服务器端完成的输出编码比在客户端更好。

您可以从OWASP Xss Prevention

获得有关输出编码的更多知识

你也可以做这个客户端。如果您要在html上下文中使用不受信任(用户给定的输入)数据,请使用javascript的原生api innerText IE Docs(moz的textContent)或编码字符(<,>,',“,/ ,)进入html实体