# Server Side Inclusion/Edge Side Inclusion Injection
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## Server Side Inclusion Basic Information
**(Introduction taken from [Apache docs](https://httpd.apache.org/docs/current/howto/ssi.html))**
SSI (Server Side Includes) - це директиви, які **розміщуються в HTML-сторінках і оцінюються на сервері** під час їх обслуговування. Вони дозволяють вам **додавати динамічно згенерований контент** до існуючої HTML-сторінки, не обслуговуючи всю сторінку через CGI-програму або іншу динамічну технологію.\
Наприклад, ви можете розмістити директиву в існуючій HTML-сторінці, таку як:
``
І, коли сторінка обслуговується, цей фрагмент буде оцінений і замінений на його значення:
`Tuesday, 15-Jan-2013 19:28:54 EST`
Рішення про те, коли використовувати SSI, а коли повністю генерувати вашу сторінку якоюсь програмою, зазвичай залежить від того, скільки з сторінки є статичним, а скільки потрібно перераховувати щоразу, коли сторінка обслуговується. SSI - це чудовий спосіб додати невеликі шматки інформації, такі як поточний час - показано вище. Але якщо більшість вашої сторінки генерується в момент її обслуговування, вам потрібно шукати інше рішення.
Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширеннями \*\* `.shtml`, `.shtm` або `.stm`\*\*, але це не є єдиним випадком.
Типовий вираз 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
```
## Edge Side Inclusion
Є проблема **кешування інформації або динамічних додатків**, оскільки частина контенту може **варіюватися** для наступного отримання контенту. Саме для цього використовується **ESI**, щоб вказати за допомогою тегів ESI **динамічний контент, який потрібно згенерувати** перед відправкою кешованої версії.\
Якщо **зловмисник** зможе **впровадити тег ESI** всередину кешованого контенту, тоді він зможе **впровадити довільний контент** у документ перед його відправкою користувачам.
### ESI Detection
Наступний **заголовок** у відповіді від сервера означає, що сервер використовує 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**: Документні куки доступні для ESI двигуна
* **Upstream Headers Required**: Сурогатні програми не оброблятимуть ESI інструкції, якщо upstream програма не надає заголовки
* **Host Allowlist**: У цьому випадку ESI включення можливі лише з дозволених серверних хостів, що робить SSRF, наприклад, можливим лише проти цих хостів
| **Програмне забезпечення** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :-----------------------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
| Squid3 | Так | Так | Так | Так | Ні |
| Varnish Cache | Так | Ні | Ні | Так | Так |
| Fastly | Так | Ні | Ні | Ні | Так |
| Akamai ESI Test Server (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
```
* Вкрасти cookie HTTP\_ONLY за допомогою XSS, відображаючи його у відповіді:
```bash
# This will reflect the cookies in the response
# Reflect XSS (you can put '">