javascript - 无法重现查询参数 html 注入
问题描述
我们有一个嵌入式脚本在我们的一个客户的页面上运行。我们收到他们的报告,我们发送到该页面的查询参数没有适当地防范 XSS 注入。
当我尝试这样的网址时:
https://www.clientsite.com?somekey=%3Csvg%20onload%3Dalert(document.cookie)%3E
在他们的网站上,我确实得到了显示 cookie 的警报面板。
但是当我在本地运行我们的脚本时,我无法重现这种注入。无论我在查询参数的值中输入什么,警报面板都不会出现。
该脚本的一个非常简化的版本是:
<html lang="en">
<head>
<meta charset="utf-8">
<title>XSS test</title>
</head>
<body>
<div id="content"></div>
<script>
(function() {
var url = window.location.href
var someKey = 'somekey'
var regexS = "[\\?&]"+someKey+"=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(url);
var parentElement = document.querySelector('#content');
var widget = document.createElement('div');
// var svgInjection = '<svg onload=alert("alert!!")>'
// var svgEncodedInjection = '%3Csvg%20onload%3Dalert("alert!!")%3E'
widget.innerHTML = '<div>' + results[1] + '</div>';
return parentElement.insertBefore(widget, parentElement.firstChild);
})()
</script>
</body>
</html>
我不明白接收相同查询参数的相同脚本如何在客户端站点上显示警报面板,而当我在本地运行它时什么也没有。有什么想法吗?
解决方案
推荐阅读
- angular - 为什么管道异步运算符会在浏览器控制台中导致 ExpressionChangedAfterItHasBeenCheckedError 消息?
- gradle - Gradle 构建存储库优先级
- typescript - TypeORM:创建 BaseRepository 类
- mysql - 使用 mySQL 中的联接删除和添加行
- javascript - 类型错误:radioButton[i] 未定义
- python - 如何将我的 800x480 5 英寸屏幕分成两部分
- python - 拆分字符串,没有具有限制字段名称和内容的分隔符
- postman - 如何在邮递员中断言两个动态值?
- node.js - Docker 没有这样的文件或目录,打开 '/app/package.json'
- arrays - 在列表中连接 numpy 数组