Détecter une attaque web dans les logs d'un serveur
11 min · Intermédiaire · 7 août 2026
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
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é.