Stored XSS漏洞演示脚本未按预期执行的问题排查求助
问题原因
- 浏览器内置防护:现代浏览器会自动忽略通过
innerHTML插入的<script>标签,不会执行其中的代码——这是专门针对XSS的安全限制,避免恶意脚本通过HTML注入直接运行。你插入的<script>标签只会被当作普通文本节点渲染,不会触发执行。 - eval无效:你输入的是完整的HTML标签字符串,而
eval只能解析纯JavaScript代码,无法识别HTML结构,所以这条语句根本不会执行弹窗逻辑。
修复方案(有效演示Stored XSS)
Stored XSS的核心是未过滤的用户输入被渲染到页面时触发脚本,不用依赖<script>标签,换用带事件属性的HTML元素即可:
方式1:使用事件触发型注入(最贴近真实场景)
让用户输入以下内容提交:
<img src="x" onerror="alert('This is my malicious script!')">
当这段HTML通过innerHTML插入到页面后,浏览器加载不存在的图片时会触发onerror事件,自动执行弹窗代码,完美复现Stored XSS效果。
方式2:简化代码直接用eval(适合演示代码注入逻辑)
如果想通过eval演示,让用户输入纯JS代码而非HTML标签,比如:
alert('This is my malicious script!')
此时eval(comment)会直接执行这段代码,但这种场景更偏向代码注入,不是典型的Stored XSS。
优化后的完整演示代码
<!DOCTYPE html> <html> <head> <title>Stored XSS Vulnerability Example</title> </head> <body> <h1>Welcome to the Example Website!</h1> <form onsubmit="submitComment(event)"> <input type="text" id="comment-input" placeholder="试试输入: <img src=x onerror=alert('XSS')>"> <button type="submit">Submit</button> </form> <div id="comments"></div> <script> function submitComment(event) { event.preventDefault(); const comment = document.getElementById("comment-input").value; const commentElement = document.createElement("p"); // 直接插入未过滤的用户输入,模拟存储后渲染的场景 commentElement.innerHTML = comment; document.getElementById("comments").appendChild(commentElement); } </script> </body> </html>
这个版本去掉了无用的eval,专注于演示真实的Stored XSS流程:用户提交恶意内容→内容被“存储”(这里临时存在页面)→页面渲染时触发脚本执行。
其他可用的XSS测试 payload
除了img onerror,还可以用这些:
<svg onload="alert('XSS')"><div onclick="alert('XSS')">点击我</div><body onload="alert('XSS')">
内容的提问来源于stack exchange,提问作者RazzcoSolutions
相关产品推荐
相关产品推荐

