Aller au contenu
Cybersécurité

Test d'intrusion d'une application web

Écran affichant du code source et un navigateur dans une pièce sombre

Contexte

Test d'intrusion en boîte noire d'une application web volontairement vulnérable, WeakApp, pour un commanditaire fictif appelé ACME Corp. Le but était de recenser les vulnérabilités par des tests manuels et automatisés, en prenant l'OWASP Top 10 et le WSTG comme référence, puis de tout rendre dans un rapport directement exploitable.

Une seule cible, http://185.222.145.82 en HTTP, testée sur une plage horaire donnée depuis une adresse IP déclarée.

Méthodologie

J'ai suivi trois axes, calqués sur le WSTG.

Le premier porte sur l'authentification et les sessions : transport des identifiants, verrouillage de compte et protection contre le brute-force, entropie du PHPSESSID, expiration côté serveur, attributs des cookies (HttpOnly, SameSite, Secure) et contournement d'authentification.

Le deuxième porte sur la sécurité applicative : injections SQL (union, error, boolean), inclusion de fichiers locaux ou distants, XSS, CSRF, SSRF, IDOR et pollution de paramètres.

Le troisième porte sur la configuration et la surface d'attaque : fichiers oubliés comme admin.php ou phpinfo, fuzzing de répertoires (/uploads/, /includes/), en-têtes HTTP (CSP, HSTS, X-Frame-Options), fuites d'informations techniques, méthodes HTTP autorisées et clickjacking.

Côté outils, Burp Suite (proxy, Repeater, Intruder) sous Kali Linux.

Au total, 15 vulnérabilités : 2 critiques, 2 hautes, 6 moyennes et 5 faibles. Le niveau de sécurité global est faible, la couche applicative laisse compromettre entièrement les données de façon directe et reproductible.

Injection SQL, contournement d'authentification

Critique, CVSS 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H).

Le formulaire /login.php ne filtre pas les caractères spéciaux. En mettant admin comme identifiant et une charge d'injection dans le champ mot de passe, la clause WHERE de la requête devient toujours vraie. Le serveur renvoie la ligne de l'utilisateur admin, le script PHP considère que la connexion a réussi et redirige vers /admin.php.

Impact : accès à l'administration sans identifiants valides, contrôle des fonctions d'admin, lecture, modification ou exfiltration des données.

XSS, vol de session

Haute, CVSS 7.5.

Le champ Content du formulaire « Add New Blog Post », dans le panneau d'admin atteint via l'injection SQL, n'encode pas ce qu'on y saisit. Une charge <script> y est enregistrée puis exécutée par le navigateur de chaque visiteur de blog.php.

Comme les cookies de session n'ont ni HttpOnly ni SameSite, la faille permet de voler des sessions actives et donc d'usurper un utilisateur ou un administrateur, de rediriger la victime vers un site malveillant ou de défigurer la page.

Autres faiblesses

  • Surface d'attaque : admin.php et les répertoires /uploads/ et /includes/ trouvés par énumération, plus un IDOR sur les ressources de /uploads/.
  • Sessions : pas de verrouillage de compte ni de limite sur les tentatives de connexion.
  • En-têtes HTTP : CSP, HSTS et X-Frame-Options absents, ce qui rend le clickjacking possible sur les formulaires ; bannières et erreurs PHP trop bavardes ; bibliothèques JavaScript périmées.

Recommandations

  • Passer aux requêtes préparées à paramètres liés pour toute interaction avec la base, et valider les entrées côté serveur.
  • Encoder les sorties selon le contexte (HTML, JS, CSS) et poser une CSP pour bloquer le XSS ; mettre les cookies en HttpOnly, SameSite et Secure.
  • Limiter les tentatives de connexion et restreindre l'accès à l'admin par IP ou VPN.
  • Compléter les en-têtes de sécurité, retirer les fichiers oubliés, mettre à jour les composants tiers.

Bilan

Un audit complet, de la reconnaissance jusqu'aux correctifs : méthodologie WSTG, exploitation manuelle sous Burp Suite, notation CVSS v3.1 et un rapport structuré avec synthèse pour la direction, chemins d'exploitation, preuves de concept et recommandations classées par priorité.