减轻来自提交数据的 XSS 攻击 - < 字符是所有攻击的核心吗?
Mitigating XSS attacks from submitted data - is the < character the heart of all attacks?
我一直在细读 OWASP Xss Filter Evasion cheat sheet,似乎大多数(所有?)基于用户输入的 XSS 攻击向量都依赖于成功提交 < 字符或其编码版本的能力。
根据 OWASP 文档,我找不到任何可以绕过以某种方式注入 < 字符的攻击向量。因此,如果输入过滤器从用户提交的数据中检查并删除或替换 < 的所有实例,是否会降低 XSS 风险?
具体来说,我想问的是是否还有其他不依赖于 < 字符的针对用户提交数据的 XSS 攻击向量。
显然这不会减轻 SQL 注入等问题,但这是一个单独的问题。
感谢任何意见!
我不打算深入探讨这个 会阻止什么,但我会解决它允许通过的一些问题。
假设您的过滤器接受一个字符串,returns 一个所有 <
都替换为空字符串的字符串。忽略如果你不小心的话你可能会搞砸这个实现。例如,如果您将不受信任的数据注入 html attributes 或 javascript strings,您什么也没做缓解 XSS。
这是一个 XSS 攻击向量的示例,我们可以使用它来绕过 FilterLeftBrackets()
:
<div id="content" data-query="~injection-point~"></div>
有效载荷可以是:q" onmouseover=alert('xss'); data-x="
导致:
<div id="content" data-query="q" onmouseover=alert('xss'); data-x=""></div>
这是 JavaScript:
var queryMsg = "you searched for: " + "~injection-point~";
有效载荷可以是:q"; alert('xss'); var x="
导致:
var queryMsg = "you searched for: " + "q"; alert('xss'); var x="";
在这两种情况下,您都需要转义 "
,但很容易 '
。注入的问题在于它完全取决于上下文。请仔细考虑您将用户输入的位置,并检查哪些内容可能已用于 "break out" 您假设已设置的约束。
简而言之,使用库...不要想出你自己的方案,要考虑上下文。
请注意逃避作弊sheet:
This cheat sheet is for people who already understand the basics of XSS attacks but want a deep understanding of the nuances regarding filter evasion.
您可能会发现这更有帮助:
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
我也是 google 教程的忠实粉丝:https://www.google.com/about/appsecurity/learning/xss/
我一直在细读 OWASP Xss Filter Evasion cheat sheet,似乎大多数(所有?)基于用户输入的 XSS 攻击向量都依赖于成功提交 < 字符或其编码版本的能力。 根据 OWASP 文档,我找不到任何可以绕过以某种方式注入 < 字符的攻击向量。因此,如果输入过滤器从用户提交的数据中检查并删除或替换 < 的所有实例,是否会降低 XSS 风险?
具体来说,我想问的是是否还有其他不依赖于 < 字符的针对用户提交数据的 XSS 攻击向量。
显然这不会减轻 SQL 注入等问题,但这是一个单独的问题。
感谢任何意见!
我不打算深入探讨这个 会阻止什么,但我会解决它允许通过的一些问题。
假设您的过滤器接受一个字符串,returns 一个所有 <
都替换为空字符串的字符串。忽略如果你不小心的话你可能会搞砸这个实现。例如,如果您将不受信任的数据注入 html attributes 或 javascript strings,您什么也没做缓解 XSS。
这是一个 XSS 攻击向量的示例,我们可以使用它来绕过 FilterLeftBrackets()
:
<div id="content" data-query="~injection-point~"></div>
有效载荷可以是:q" onmouseover=alert('xss'); data-x="
导致:
<div id="content" data-query="q" onmouseover=alert('xss'); data-x=""></div>
这是 JavaScript:
var queryMsg = "you searched for: " + "~injection-point~";
有效载荷可以是:q"; alert('xss'); var x="
导致:
var queryMsg = "you searched for: " + "q"; alert('xss'); var x="";
在这两种情况下,您都需要转义 "
,但很容易 '
。注入的问题在于它完全取决于上下文。请仔细考虑您将用户输入的位置,并检查哪些内容可能已用于 "break out" 您假设已设置的约束。
简而言之,使用库...不要想出你自己的方案,要考虑上下文。
请注意逃避作弊sheet:
This cheat sheet is for people who already understand the basics of XSS attacks but want a deep understanding of the nuances regarding filter evasion.
您可能会发现这更有帮助: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
我也是 google 教程的忠实粉丝:https://www.google.com/about/appsecurity/learning/xss/