绕过 XSS 过滤器

信息安全 xss
2021-08-16 12:56:51
<script>
Something.execute("injectionpoint");  }, true);
</script>

我试图绕过 XSS 过滤器,但它不起作用,因为它"被过滤为 \";\"取决于"放置的位置。/被过滤为\/。任何//存在于有效载荷中的东西都被剥离了

其他字符,如( ), <, >,--不被过滤

这是一个带有+alert(1)<!--有效负载的示例

Something.execute("+alert(1)<!--"); }, true);

2个回答

绕过转义的双引号

根据您的描述,这应该有效:

\");alert("xss

"将被转义为\",由此导致\\",其逸出\,但不是"

为了防止这种情况,你会在最起码也必须逃脱\\\

绕过转义的双引号和双反斜杠到单反斜杠

根据您的评论,我假设过滤的实际相关部分如下所示:

  1. " ->\"
  2. \\->\

这也不安全。注入可能如下所示:

\\\");alert(1

"\"在步骤 1 中被转义,这导致我们进入\\\\",然后\\"在步骤 2 中转换为。您不能在注入的字符串中使用双引号,但这不是问题,因为带有单引号或完全不带引号的 XSS 完全有可能.

为了确保这一点,需要对双反斜杠进行转义,而不是将其转换为单个反斜杠,这将为我们\\\\\\\\\"提供上述注入,这是安全的。

听起来像是修改后的PHP magic_quotes_gpc“打开magic_quotes 时,所有'(单引号)、”(双引号)、\(反斜杠)和NUL 都会自动用反斜杠转义。”

这并不总是有效,但这里有一些绕过:

  1. 使用方法“String.fromCharCode()”。例如 alert('Ogglas'); 将是:String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 79, 103, 103, 108, 97, 115, 39, 41, 59)。您可以使用插件Firefox Hackbar来生成这些字符串。注意:我没有对插件进行代码审查,因此使用风险自负。

  2. 尝试传入 URL 编码的 HEX 值。您也可以尝试使用双重编码的 URL。根据实现的不同,第一个解码过程由 HTTP 协议执行,生成的编码 URL 将绕过 XSS 过滤器,因为它没有改进检测的机制。例子:

    • 字符 -> ' -> 十六进制编码值 -> %27

    • 十六进制编码 % -> %25

    • 双编码 -> %2527