【问题标题】:When are dynamic scripts executed?什么时候执行动态脚本?
【发布时间】:2014-06-02 18:12:36
【问题描述】:

我正在玩 google XSS 游戏 (https://xss-game.appspot.com/level2),但我无法完全弄清楚为什么 2 级没有按我预期的方式运行。即使提示说脚本标签不起作用,我也不知道为什么。我的问题基本上是什么时候执行动态脚本标签,这是否因浏览器而异?

我尝试了一些简单的方法:

<script>alert();</script>

虽然它将元素添加到页面中,但它并没有达到我的预期。

我发现这个帖子有同样的问题,但解决方案只是一个答案,而不是解释: Dynamically added script will not execute

【问题讨论】:

  • 我可以告诉你,通过.innerHTML 添加&lt;script&gt; 元素不会执行它们;)

标签: javascript xss


【解决方案1】:

如果一个站点只清理 SCRIPT 标签但允许其他 HTML - 它会向 XSS 开放自身。第 2 级中的提示是消息窗口中具有一些 HTML 格式(斜体、颜色等)的文本,因此这里的假设 - HTML 标记是允许的。

所以你可以输入类似的东西

<i>Hello Xss</i>

进入消息窗口以斜体显示文本。但是 DOM 元素可以附加一个事件处理程序 - 您可以将可执行的 JavaScript 包含到事件处理程序中,而无需任何 SCRIPT 标记。

尝试将其输入到消息窗口中:

<i onmouseover="alert(1)">Hello Xss</i>

提交消息后,将鼠标悬停在您的消息文本上。

【讨论】:

    【解决方案2】:

    您的问题的答案是通过 .innerHTML 添加的&lt;script&gt; 标签不会执行。

    来自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
    

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2016-01-07
      • 1970-01-01
      • 2013-05-01
      • 2019-06-16
      相关资源
      最近更新 更多