我目前正在测试我自己的 XSS 过滤器,不知道我是否考虑过所有事情,所以我需要一些建议。
假设我的代码如下所示:
<script>
var test = {src: "test", layer: {"input": "USER INPUT", "event": "ready"}};
</script>
在这种特定情况下,如果我替换为\和\\是否可以欺骗我的过滤器?当然,用户输入将是 USER INPUT 在我的代码中的位置。"\"
我目前正在测试我自己的 XSS 过滤器,不知道我是否考虑过所有事情,所以我需要一些建议。
假设我的代码如下所示:
<script>
var test = {src: "test", layer: {"input": "USER INPUT", "event": "ready"}};
</script>
在这种特定情况下,如果我替换为\和\\是否可以欺骗我的过滤器?当然,用户输入将是 USER INPUT 在我的代码中的位置。"\"
在这种特定情况下,如果我替换为
\和\\是否可以欺骗我的过滤器?"\"
这还不够,您的过滤器不安全。
例如,一个有效的 XSS 攻击向量将是</script><svg onload=alert(1)>,最后是:
<script>
var test = {src: "test", layer: {"input": "</script><svg onload=alert(1)>", "event": "ready"}};
</script>
由于在评估任何 JS 之前解析 XML (HTML) 树,因此结束脚本标记 ( </script>) 将终止脚本,尽管它位于 JS 字符串中。
过滤器的另一个问题是换行符。如果攻击者可以插入一个0x0a字节,他们可以通过导致语法错误来破坏您的脚本(因为双引号字符串不能跨越多行):
<script>
var test = {src: "test", layer: {"input": "
", "event": "ready"}};
</script>
如果您使用的是 PHP,一个方便的过滤器函数可以安全地处理 JS 中的用户输入是json_encode(). 从这个答案:
使用普通 PHP 的一种常见且安全的方法是 按照此处
json_encode()的说明使用。例如:var foo = <?php echo json_encode($foo, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>
json_encode()返回一个值的 JSON 表示,因此它可以保证在你的 JS 代码中评估为一个有效的对象,你可以将它分配给一个变量,如图所示。但不要省略附加标志。根据上下文,攻击者可能会使用有效负载</script>来突破整个脚本标签。