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

UNl*_*nel 2 html javascript xss

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

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

我想测试跨站点脚本。所以我玩了一下,当使用斜体时,元素被渲染为 html 元素的内部文本。

HTML 中的 insideText 如下所示:

带有脚本元素和 DOM js 的 html

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

用户能否编写通过事件调用而成为有效 HTML 的文本?如果是这样,怎么办?

T.J*_*der 5

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

\n

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

\n

\r\n
\r\n
const target = document.getElementById("target");\ntarget.textContent =\n    `<script>alert("Hi!");<\\/script>\n    <div onclick=\'alert("Ho!");\'>click me</div>\n    <img onerror=\'alert("Hum!");\' src=\'\'>`;\nconsole.log("textContent:", target.textContent);\nconsole.log("innerHTML:", target.innerHTML);
Run Code Online (Sandbox Code Playgroud)\r\n
<div id="target"></div>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

请注意,该元素不包含标签script,它包含字符<, s, c, r, i, p,t等。

\n
\n

相反,使用innerHTML会让你很容易受到 XSS 攻击:

\n

\r\n
\r\n
const target = document.getElementById("target");\ntarget.innerHTML =\n    `<script>alert("Hi!");<\\/script>\n    <div onclick=\'alert("Ho!");\'>click me</div>\n    <img onerror=\'alert("Hum!");\' src=\'\'>`;\nconsole.log("textContent:", target.textContent);\nconsole.log("innerHTML:", target.innerHTML);
Run Code Online (Sandbox Code Playgroud)\r\n
<div id="target"></div>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

script以这种方式插入的标签不会运行,但属性定义的事件处理程序会运行,例如没有\xc2\xa0\xe2\x80\x94error的事件,并且运行代码可以添加一个会得到执行:imgsrcscript

\n

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

\n