XSS - innerText 字符串可以是 HTML 元素是否危险:脚本、div 等?

XSS - is it dangerous that innerText string can be HTML elements: script, div etc?

我在评论网站的客户端工作。

用户可以在评论描述中插入任何文本,包括 html 元素文本(如:<script> console.log('hello') </script>),并使用基本文本样式设置样式:斜体、粗体等...

我想测试跨站脚本。所以我玩了一下,当使用斜体时,元素被呈现为 html 元素的 innerText。

HTML 中的 innerText 如下所示:

不过我没有看到警报被执行。

用户可以编写在调用事件后变得有效的文本 HTML 吗? 如果可以,怎么做?

您在 elements/DOM 选项卡中看到的内容有点误导您。如果您通常使用 innerText (or more appropriately textContent 来设置元素的文本,则它 中没有 标签。它有字符。从显示的角度来看,这些字符可以形成标签,但它们不是标签,浏览器不会那样对待它们。

查看此内容的一种方法是查看他们的 HTML:

const target = document.getElementById("target");
target.textContent =
    `<script>alert("Hi!");<\/script>
    <div onclick='alert("Ho!");'>click me</div>
    <img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>

请注意,该元素不包含 script 标记,它包含字符 <script


相比之下,使用innerHTML会让你对 XSS 攻击敞开大门:

const target = document.getElementById("target");
target.innerHTML =
    `<script>alert("Hi!");<\/script>
    <div onclick='alert("Ho!");'>click me</div>
    <img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>

script 以这种方式插入的标签不会得到 运行,但属性定义的事件处理程序会,例如 img 上的 error 事件具有没有 srcthat 运行s 的代码可以添加一个将被执行的 script

const target = document.getElementById("target");
target.innerHTML =
    `<div onclick='alert("Ho!");'>click me</div>
    <img onerror='(function() {
        alert("Hi!");
        var s = document.createElement("script");
        s.textContent = &apos;alert("Hi from script");&apos;;
        document.body.appendChild(s);
    })()' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>