cybercursus

Détecter une attaque web dans les logs d'un serveur

11 min · Intermédiaire · 7 août 2026

Sommaire
  1. Les charges des cours précédents, vues côté défense
  2. Repérer les charges dans un flux de logs
  3. Les limites d’une détection par motif seul

Les charges des cours précédents, vues côté défense

Les cours sur les injections SQL et sur la XSS ont construit des charges précises : UNION SELECT, ' OR '1'='1, <script>, onerror=. Côté défense, ces mêmes charges deviennent des motifs à reconnaître, puisqu’elles transitent par le chemin et les paramètres d’une requête HTTP, journalisés tels quels.

Repérer les charges dans un flux de logs

python
import re

lignes_de_log = [
  '203.0.113.7 - - [14:22:01] "GET /produits?id=1 HTTP/1.1" 200 5423',
  '198.51.100.23 - - [14:23:15] "GET /produits?id=1 UNION SELECT identifiant,mot_de_passe FROM utilisateurs-- HTTP/1.1" 200 8120',
  '203.0.113.7 - - [14:24:02] "GET /recherche?q=chaussures HTTP/1.1" 200 4200',
  '198.51.100.23 - - [14:24:47] "GET /recherche?q=<script>document.location=\'https://attaquant.test/vol\'</script> HTTP/1.1" 200 3900',
  '203.0.113.7 - - [14:25:10] "GET /a-propos HTTP/1.1" 200 2100',
]

motifs_suspects = {
  "Injection SQL": re.compile(r"UNION\s+SELECT|--|'\s*OR\s*'", re.IGNORECASE),
  "XSS": re.compile(r"<script|onerror\s*=", re.IGNORECASE),
}

for ligne in lignes_de_log:
  alertes = [nom for nom, motif in motifs_suspects.items() if motif.search(ligne)]
  if alertes:
      print(f"SUSPECT ({', '.join(alertes)}) : {ligne[:75]}")
  else:
      print(f"normal              : {ligne[:75]}")

Deux requêtes malveillantes ressortent immédiatement, mêlées à du trafic normal provenant de la même plage d’adresses IP. Remarque que les deux charges suspectes viennent de la même IP (198.51.100.23), un détail qui devient exploitable dès le chapitre suivant sur la corrélation.

Les limites d’une détection par motif seul

Attention

Un attaquant averti peut reformuler sa charge pour échapper à un motif trop rigide : encodage d’URL, variations de casse, syntaxe SQL équivalente mais différente. Une détection par motif reste une première ligne de défense utile, jamais une garantie absolue.

C’est pour cette raison que la détection sérieuse combine plusieurs signaux (le motif, mais aussi le code de statut retourné, la fréquence des requêtes, leur origine) plutôt que de se reposer sur un seul indicateur isolé.

Pourquoi une charge d'injection SQL comme UNION SELECT laisse-t-elle une trace reconnaissable dans un log d'accès ?
Pourquoi une détection basée uniquement sur des motifs de texte reste-t-elle contournable ?

Pour aller plus loin

Commentaires

Recherche