我正在进行谷歌XSS游戏(https://xss-game.appspot.com/level2),但我无法弄清楚为什么2级没有像我期望的那样工作。即使提示说脚本标签不起作用,我也不知道为什么。我的问题基本上是什么时候执行动态脚本标签,这是否因浏览器而异?
我尝试了一些简单的事情:
<script>alert();</script>
虽然它将元素添加到页面中,但它并没有达到我所希望的效果。
我发现这个帖子有同样的问题,但解决方案只是一个答案,但不是解释: Dynamically added script will not execute
答案 0 :(得分:1)
如果某个站点仅清理SCRIPT标记但允许其他HTML - 它会自行打开XSS。级别2中的提示是消息窗口中的文本,其中包含一些HTML格式(斜体,颜色等),因此这里假设 - 允许使用HTML标记。
所以你可以输入类似
的东西<i>Hello Xss</i>
进入消息窗口以斜体显示文本。但DOM元素可以附加一个事件处理程序 - 您可以将可执行JavaScript包含在事件处理程序中,而不需要任何SCRIPT标记。
尝试将此输入到消息窗口中:
<i onmouseover="alert(1)">Hello Xss</i>
并在邮件文本上提交消息波鼠标后。
答案 1 :(得分:0)
您的问题的答案是通过.innerHTML添加的<script>
标记不会执行。
来自https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML:
安全注意事项
看到用于在网页中插入文本的innerHTML并不罕见。这带来了安全风险。
var name = "John";
// assuming el is an HTML DOM element
el.innerHTML = name; // harmless in this case
// ...
name = "<script>alert('I am John in an annoying alert!')</script>";
el.innerHTML = name; // harmless in this case
虽然这可能看起来像是跨站点脚本攻击,但结果是无害的。 HTML5指定不应执行通过innerHTML插入的标记。
但是,有些方法可以在不使用元素的情况下执行JavaScript,因此每当您使用innerHTML设置无法控制的字符串时,仍然存在安全风险。例如:
var name = "<img src=x onerror=alert(1)>";
el.innerHTML = name; // shows the alert