【问题标题】:XSS vulnerability despite encodingXSS 漏洞尽管编码
【发布时间】:2021-12-16 13:46:20
【问题描述】:

我对我一直在工作的网站进行了安全审核。审计表明,我的一个名为 backurl 的参数在我的 jsp 文件中没有得到足够的保护。这个url放在一个按钮的href里面,这个按钮可以让用户回到上一页。

所以我所做的是使用 owasp 库和函数“forHTMLAttribute”来保护它。它给出了这样的东西:

<a class="float_left button" href="${e:forHtmlAttribute(param.backUrl)}">Retour</a>

但是,第二次审核表明,通过将参数的值替换为:

javascript:eval(document%5b%27location%27%5d%5b%27hash%27%5d.substring(1))#alert(1234)

将执行 javascript 代码并显示警报,仅在单击按钮时。

他们说我可以做的是硬编码 url 前面的主机名值,但我真的不明白这将如何帮助解决问题。我觉得无论我做什么,解决一个 XSS 漏洞只会创建一个新漏洞。

有人可以帮我解决这个问题吗?至少要了解正在发生的事情以及在哪里查看。

非常感谢。

【问题讨论】:

  • 如果您使用参数作为 URL,问题不在于 encoding URL,而在于它是第一个外部提供的 URL地方。它可以是某种关键字,而不是原始 URL,您可以在自己的服务器上将其转换为 URL 并将该值提供给 JSP 页面。

标签: javascript java html jsp xss


【解决方案1】:

正如@Pointy 所说,这里的问题更为根本。接受不受信任的输入并将其呈现为逐字链接(或文本),是一个安全问题,即使您逃脱了它。例如,如果您允许 login?msg=Password+incorrect 并且这就是您处理中继消息的方式 - 您就有问题了。我可以使用:&lt;a href="https://sutterlin.com/login?msg=Give+rzwitserloot+some+cash+to+unlock+admin+privileges"&gt;Click for cute kittens!&lt;/a&gt; 创建一个网站,您就会明白这是为什么。

真正的解决方案是不接受可能被污染的信息,句号(没关系逃避!),如果该信息最终在没有被污染的周围上下文的情况下呈现。以推特为例。用户名和推文可能受到污染。这没什么大不了的,因为您正在查看一些 Rando 所写的网站的设计,因此 twitter 的用户会得到线索。如果有人发推文说“如果你在 12345678 向 Jack Dorsey 的账户转账 5 美元,他会给你一个 twitter 的蓝色标志!”,有一个合理的期望是,该网站的用户不要成为白痴并相信它。

您网站的“点击此处转到上一页”不是这样的。您不能合理地期望您网站的用户停留在该按钮上,检查他们浏览器的状态栏,然后找出答案。

因此,整个原则是错误的。你根本不能这样做,句号。

你的选择有三个:

  1. 不要让“上一个链接”属性成为 URL 参数,而是需要在会话中。通常,网站与会话一起工作。您可以在服务器端存储您想要的任何内容(HTTP 处理程序代码可以手动获取例如 cookie 并使用它通过查找来为该用户查找服务器上的信息,或者在仅提供 HttpSession 的框架上运行 - style 对象,以这种方式工作)。

  2. 如果您真的想向后弯腰,可以将其包含为已签名的 blob。这很有创意,但我真的不会去那里。

  3. 小窍门:如果您只在网页中包含 &lt;a href="javascript:history.back()"&gt;Click to go back&lt;/a&gt; 作为静态链接会怎样?

【讨论】:

  • 这是一个很好的答案;完整,有助于理解问题并帮助解决问题。非常感谢。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2012-03-10
  • 2011-12-03
  • 2012-06-21
  • 2022-01-12
  • 2021-05-01
  • 2013-09-16
  • 2018-10-12
相关资源
最近更新 更多