【问题标题】:Is URL encoding sufficient for href attribute for protection against XSS?URL 编码是否足以用于 href 属性以防止 XSS?
【发布时间】:2018-10-26 19:05:22
【问题描述】:

根据OWASP,用户对href属性的输入应该“......除了字母数字字符,使用%HH转义格式转义所有ASCII值小于256的字符。”

我不明白这背后的原因。为什么 URL 编码不能完成这项工作?我花了几个小时尝试为动态生成并呈现给用户的 URL 字符串创建攻击向量,对我来说,这似乎是针对 XSS 攻击的非常可靠的保护。

我也一直在研究这个问题,大多数人都建议将 URL 编码与 HTML 编码一起使用。我完全明白为什么 HTML 编码不足,因为仍然可以使用其他向量,例如 onclick=alert()

有人可以向我展示一个攻击向量的示例,该攻击向量用于操纵使用 URL 编码且没有 HTML 编码或 owasp.org 在规则 #5 中建议的编码呈现的 href?

【问题讨论】:

    标签: javascript security xss


    【解决方案1】:

    不,如果有人注入 javascript:alert(0),那么它会起作用。没有任何编码方法可以阻止这种情况,您应该尝试阻止 javascript URI 方案以及所有其他允许 XSS 的 URI 方案,例如 data:blob:

    建议的操作是不要将用户输入直接反映到链接中。

    此外,重要的是要记住不要简单地使用 preg_replace 之类的东西精确地阻止这些方案,因为换行会绕过这个并产生 XSS 有效负载。例如:java%0a%0dscript:alert(0);。如您所见,在有效负载中间放置了一个 CRLF 字符,以防止 PHP(或其他服务器端语言)将其识别为您已阻止的 javascript:。但 HTML 仍会将其呈现为 javascript:alert(0);,因为 CRLF 字符是空格并且被 HTML 忽略(在元素属性的值内),但由 PHP 和其他语言解释。

    【讨论】:

    • 你有换行绕过的例子吗?您的意思是包含<a href="java%0a%0dscript:alert(0);">Link</a> 的页面在单击链接时会执行JavaScript?当我尝试时,它只是被视为相对 http 链接。
    • @cillian collins 我似乎无法重现这个我有以下内容:javascript:alert(document.cookie) %3 中和 XSS 有效负载。我错过了什么?
    • ':' 被百分比编码的事实阻止了有效负载工作。如果您使用的是典型浏览器并通过 GET 请求发送有效负载,它有时会用百分比编码替换这类字符,也许这就是问题所在。
    • 至于 fgb,您会收到完全相同的问题。您从字面上获取我的有效负载,您没有将百分比编码字符粘贴到链接中,而是将它们粘贴到 URL 中,然后它们将在 HTML 中显示为回车符。如果您想重新创建它而不必创建易受攻击的 PHP 应用程序,只需创建一个链接并在有效负载中间放置一个返回值。您也可以使用 %09 等字符,这些字符应该适用于所有浏览器,甚至只是选项卡。
    【解决方案2】:

    编码取决于上下文。如果 HTML 文档中有 URL,则需要 URL 编码和 HTML 编码,但时间不同。

    ...除了字母数字字符,所有字符都用 小于 256 的 ASCII 值,采用 %HH 转义格式。

    这里推荐使用 URL 编码。但不适用于整个 URL。上下文是在将 URL 参数插入 URL 时,它们需要进行 URL 编码,以便在值中允许例如 & 符号。

    不要使用 URL 编码对完整或相对 URL 进行编码!

    这是针对整个 URL 的单独规则 一旦 URL 被编码,然后在插入 html 属性时,然后应用 html 编码。

    您不能将 URL 编码应用于完整的 URL,因为它已经进行了 URL 编码,再次对其进行编码会导致双重编码,从而损坏 URL。例如,原始 URL 中的任何% 符号都是错误的。

    HTML 编码是必需的,因为像和号这样的字符是 URL 中的有效字符,但由于字符实体而在 HTML 中具有不同的含义。 URL 可能包含看起来像 HTML 实体但在插入 HTML 文档时不需要编码的字符串。

    【讨论】:

    • 因此,如果我理解正确,出于安全原因,不需要在 URL 编码之上的 HTML 编码,而是为了正确呈现,我是否正确理解这一点
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2011-01-08
    • 2012-11-21
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多