Exploitation externe - aka Web#
XSS#
Késako: Injection de code HTML et/ou JavaScript malveillant dans une page web
Ce que l’on vise avec ce genre d’attaque:
Vol de cookies / session
Usurpation d’identité
Actions à la place de l’utilisateur
Comment trouver une XSS:
Tester toutes les entrées, en particulier celles reprises dans la réponse
Injecter des caractères spéciaux (et leurs versions encodées) et vérifier s’ils sont repris / sous quel format
<script>alert("hello")</script>%3Cscript%3Ealert%28%22hello%22%29%3C%2Fscript%3E
Tenter d’injecter “dans le flot” de la page (en javascript si dans du code javascript, dans une balise, etc.)
Exemple: si le code source est
<img src="*notre input*">, essayez d’injectertruc" href="http://mechant.com/"pour former<img src="truc" href="http://mechant.com/">
Ce qui pourrait vous bloquer et comment remédier à ces attaques:
Valider les entrées côté serveur : contrôler les entiers, les caractères autorisés dans une chaîne, etc.
Échapper les données utilisateur :
<deviennent<Mettre en place une Content Security Policy (CSP)
Cependant il existe des bypass !
Éviter les fonctions dangereuses : innerHTML, eval(), document.write()
Injection SQL aka “SQLi”#
3 types principaux :
In-band SQLi (extraction directe des données)
SELECT * FROM users;
Blind SQLi (pas de retour direct, inférence via comportements)
Time-based SQLi (utilisation de délais pour extraire l’info)
SLEEP(10)
Error-based SQLi (utilisation des erreurs pour extraire l’info)
Retrouvez une liste complète d’exemples d’injections SQL à sur Payload All the Things
Ce que l’on vise avec ce genre d’attaque:
Vol de données
Possibilité de rebond sur le serveur si les droits du compte sont trop élevés
Comment trouver une SQLi:
Tester toutes les entrées et en particulier ceux qui peuvent être utilisées dans une requête
des requêtes à des
/get-users?id=truc,/api/add_to_cart?item=truc,/profile?user=truc, etc
Comprendre comment pourrait être utilisée l’entrée : int, char, etc.
Chercher des erreurs, des comportements identiques malgré l’injection de code, etc.
Tenter d’injecter du code en respectant le format de la requête suspectée
Comment palier à ces attaques:
Utiliser des requêtes paramétrées (prepared statements)
Validation stricte des entrées utilisateur
Éviter la concaténation de chaînes SQL
Utiliser des droits minimaux sur la base de données (least privilege)
Masquer les erreurs SQL
Local File Inclusion, aka LFI#
Vulnérabilité permettant d’inclure des fichiers locaux du serveur.
Elle apparaît quand une application utilise une entrée utilisateur pour charger un fichier sans contrôle.
Ce que l’on vise :
Lecture des fichiers sensibles sur le serveur
Accès au code source
Comment trouver une LFI:
Identifier toutes les entrées laissant penser à l’utilisation directe de fichiers :
file=,page=,view=,include=Tenter d’utiliser des caractères spéciaux utilisés dans les arboresences :
./,../, etc.Essayer de parcourir l’arborescence vers des fichiers standards :
/.git/.gitignore,/etc/passwd,.env, etc.
Correction / Remédiation - Ne jamais inclure directement une entrée utilisateur dans un chemin de fichier - Mapper les choix utilisateur à des fichiers internes : ex : 1 → home.php, 2 → about.php - Désactiver les wrappers dangereux (PHP) : allow_url_include = Off - Normaliser et valider les chemins (realpath) et les noms des fichiers (basename)
Insecure Direct Object Reference, aka IDOR#
L’application expose des références à des objets (ID) manipulables par l’utilisateur et aucun contrôle ne vérifie si l’utilisateur à le droit d’accès à cet objet.
Exemple: Un utilisateur A ayant accès à l’objet id=123, qui aurait aussi accès à l’objet 122, 124, etc.
Ce que l’on vise avec une IDOR:
Fuite de données
Modification/Suppression des données d’autres personnes
Comment trouver une IDOR:
Identifier les références vers les objets dans les entrées
Tester la modification des ces IDs :
Incrémenter / décrémenter
Changer vers ceux d’un autre utilisateur
Contrôler la propriété des objets
Ce qui pourrait nous bloquer:
Utilisation des identifiants non prédictibles (UUID, exemple: 67ac387b-d211-4527-9ce5-c50172704c4b)
Contrôle d’accès centralisé (RBAC / ABAC)
Server-Side Request Forgery, aka SSRF#
Vulnérabilité où le serveur est forcé de faire des requêtes (souvent HTTP) par l’attaquant.
Ce que l’on vise avec une SSRF:
Accès à des services internes non exposés
Vol de données techniques senisbles
Comment trouver une SSRF:
Chercher des URL que l’on contrôle ou une ressource appelée par le serveur qui est manipulable dans une entrée
Identifier les fonctions et les entrées permettant de récupérer des ressources distantes (internes ou externes)
Tester des IP internes : 127.0.0.1, 10.0.0.0/8, 169.254.169.254, etc. (autres bypass possible ::1)
Bypass Auth / JWT#
Ensemble de vulnérabilités liées à une authentification mal conçue ou insuffisante.
Problèmes fréquents :
Absence de vérification de la session (cookie) / moyen d’authentification (jwt) sur les pages / fonctions
Sessions / moyens d’authentification forgeables ou prévisibles
Sessions / moyens d’authentification non protégés ou réutilisables
Ce que l’on vise :
Usurpation de comptes
Elévations des privilèges
Comment trouver un bypass:
Trouver les éléments permettant de maintenir l’authentification
Vérifier les accès aux pages / fonctions sans les moyens d’authentification / session
Observer les requêtes entre 2 authentifications / 2 utilisateurs
Contrôler les éléments : prédictibilités, signature vérifiée, clé non triviale
Ne pas oublier qu’un JWT est juste des données au format base64url accompagné d’une signature.
XXE#
Hell nah.
Server Side Template Injection, aka SSTI#
Injection dans un moteur de template de rendu côté serveur
Ce que l’on vise:
Fuite d’informations
RCE dans certains moteurs
Comment trouver une SSTI:
Tester toutes les entrées avec des balises correspondants à leur moteur:
{{7*7}}/${7*7}/<%= 7*7 %>- Observer si le contenu est évalué - Identifier le moteur de template utilisé - Tester accès à objets système via templates
Correction / Remédiation:
Ne jamais injecter directement des variables utilisateur dans les templates
Utiliser les modes « safe rendering »
Désactiver les fonctions dangereuses du moteur
Séparer données et logique (no code execution in templates)
File Upload#
Téléversement de fichiers sans validation suffisante
Ce que l’on vise:
Envoi de fichiers dangereux : - Scripts (PHP, JSP, ASP, etc.) - EXE, BAT, etc. - Fichiers mal nommés écrasant le nom d’un autre fichier
XSS stockés
RCE si possibilité de faire exécuter le fichier par le serveur
stockage de malware / fichiers illicites / etc.
Ce qui pourrait vous bloquer:
Validation stricte côté serveur : type MIME + extension + contenu réel
Renommage des fichiers côté serveur
Stockage des uploads hors web root
Limite de taille et de type
Comment arriver à ses fins:
Extensions interdites contournées (.php.jpg)
Modification MIME type
Payloads dans metadata
Path Traversal dans le nom du fichier
../
Remote Code Execution#
Vulnérabilité permettant d’exécuter des commandes sur le serveur distant.
Peut provenir de multiples sources :
Failles présentées ci-dessus
Désérialisation
Utilisation d’entrée utilisateur dans un lancement de programme non sécurisé
Impact :
Accès à des fichiers sensibles
Compromission du serveur
Rebond sur le réseau interne
Comment trouver une possible RCE via lancement d’un programme non sécurisé:
Identifier les entrées qui pourraient être utilisées dans un programme, commande système, etc.
Tester les caractères spéciaux utilisées pour séparer les commandes : &, |, etc.
Vérifier les erreurs, les temps d’attente, les retours