XSS漏洞尽管编码
XSS vulnerability despite encoding
我对我工作过的网站进行了安全审核。审核显示我的参数之一,称为 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 漏洞都会产生一个新的漏洞。
有人可以帮我解决这个问题吗?了解正在发生的事情以及至少要查看的位置。
非常感谢。
正如@Pointy 所说,这里的问题更为根本。接受不受信任的输入并将其呈现为 link 逐字(或作为文本), 是一个安全问题 ,即使您逃避了它。例如,如果您允许 login?msg=Password+incorrect
并且这就是您处理中继消息的方式 - 您就有问题了。我可以创建一个网站:<a href="https://sutterlin.com/login?msg=Give+rzwitserloot+some+cash+to+unlock+admin+privileges">Click for cute kittens!</a>
,你就会明白为什么这是个问题。
真正的解决方案是不接受可能被污染的信息,period(不要介意转义!),如果该信息最终在没有被污染的周围环境的情况下呈现。以推特为例。用户名和推文可能受到污染。这没什么大不了的,因为 twitter 的用户会因为您正在 寻找 一些 rando 写的内容的网站设计而被告知。如果有人发推文“如果你将 5 美元转账到 Jack Dorsey 的 12345678 账户,他会给你一个 twitter 蓝色标志!”,有一个合理的期望,即网站的用户不是白痴并相信它。
你们网站的“点击这里跳转到上一页”不是这样的。您不能合理地期望您网站的用户停留在那个按钮上,检查他们浏览器的状态栏,然后弄清楚。
因此,整个原理都是错误的。你根本不能这样做,期间。
您有三个选择:
不要让 'previous link' 属性 成为 URL 参数,它需要在会话中。通常,网站与会话一起工作。您可以在服务器端存储任何您想要的内容(HTTP 处理程序代码要么手动获取 cookie 并使用它通过查找来查找该用户的服务器信息,或者在仅提供 HttpSession 的框架上运行-样式对象,以这种方式工作)。
如果你真的想向后弯腰,你可以把它作为一个签名的 blob 包含进来。这很有创意,但我真的不会去那里。
快速破解:如果您只是将 <a href="javascript:history.back()">Click to go back</a>
作为静态 link 添加到您的网页中会怎样?
我对我工作过的网站进行了安全审核。审核显示我的参数之一,称为 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 漏洞都会产生一个新的漏洞。
有人可以帮我解决这个问题吗?了解正在发生的事情以及至少要查看的位置。
非常感谢。
正如@Pointy 所说,这里的问题更为根本。接受不受信任的输入并将其呈现为 link 逐字(或作为文本), 是一个安全问题 ,即使您逃避了它。例如,如果您允许 login?msg=Password+incorrect
并且这就是您处理中继消息的方式 - 您就有问题了。我可以创建一个网站:<a href="https://sutterlin.com/login?msg=Give+rzwitserloot+some+cash+to+unlock+admin+privileges">Click for cute kittens!</a>
,你就会明白为什么这是个问题。
真正的解决方案是不接受可能被污染的信息,period(不要介意转义!),如果该信息最终在没有被污染的周围环境的情况下呈现。以推特为例。用户名和推文可能受到污染。这没什么大不了的,因为 twitter 的用户会因为您正在 寻找 一些 rando 写的内容的网站设计而被告知。如果有人发推文“如果你将 5 美元转账到 Jack Dorsey 的 12345678 账户,他会给你一个 twitter 蓝色标志!”,有一个合理的期望,即网站的用户不是白痴并相信它。
你们网站的“点击这里跳转到上一页”不是这样的。您不能合理地期望您网站的用户停留在那个按钮上,检查他们浏览器的状态栏,然后弄清楚。
因此,整个原理都是错误的。你根本不能这样做,期间。
您有三个选择:
不要让 'previous link' 属性 成为 URL 参数,它需要在会话中。通常,网站与会话一起工作。您可以在服务器端存储任何您想要的内容(HTTP 处理程序代码要么手动获取 cookie 并使用它通过查找来查找该用户的服务器信息,或者在仅提供 HttpSession 的框架上运行-样式对象,以这种方式工作)。
如果你真的想向后弯腰,你可以把它作为一个签名的 blob 包含进来。这很有创意,但我真的不会去那里。
快速破解:如果您只是将
<a href="javascript:history.back()">Click to go back</a>
作为静态 link 添加到您的网页中会怎样?