ModSecurity (NGINX) – Erkennung von Command Injection in Formularfeldern

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

ModSecurity (NGINX) – Erkennung von Command Injection in Formularfeldern

Ziel der Übung

  • Demonstration der Layer-7-Inspektion durch eine Web Application Firewall
  • Erkennung von Command Injection in einem HTML-Formular
  • Blockierung von Angriffen vor Weiterleitung an das Backend
  • Analyse von POST-Parametern (ARGS_POST) nach TLS-Terminierung

Voraussetzung

  • NGINX mit ModSecurity v3 aktiv
  • OWASP Core Rule Set (CRS) eingebunden
  • TLS-Terminierung erfolgt auf der WAF
  • Webanwendung mit HTML-Formular (POST)

Architektur

  • Client sendet HTTPS-Anfrage an WAF
  • TLS-Verbindung endet an der WAF
  • HTTP-POST-Body liegt entschlüsselt vor
  • ModSecurity analysiert Formularinhalte
  • Nur geprüfte Anfragen werden an Backend weitergeleitet

CRS-Einbindung prüfen

  • cat /etc/nginx/modsec/modsecurity.conf

Folgende Includes müssen vorhanden sein:

Include /etc/nginx/modsec/coreruleset/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf
Include /etc/nginx/modsec/custom-rules/security-policy.conf

Lokale Detection-Regel erstellen

  • vi /etc/nginx/modsec/custom-rules/local-detection.conf

Inhalt:

SecRule ARGS_POST "@rx (?i)\b(pwd|ls|id|whoami|cat|uname)\b" \
"id:1001,\
phase:2,\
t:urlDecodeUni,\
t:compressWhitespace,\
deny,\
log,\
msg:'POST Command Injection Detected'"

Erklärung der lokalen Detection-Regel

  • SecRule
Definiert eine Prüfregel innerhalb der ModSecurity-Engine
  • ARGS_POST
Prüft ausschließlich POST-Parameter aus HTML-Formularen (application/x-www-form-urlencoded)
  • @rx
Verwendet einen regulären Ausdruck zur Mustererkennung
  • (?i)
Aktiviert eine case-insensitive Prüfung (z. B. PWD, PwD, pwd)
  • \b(pwd|ls|id|whoami|cat|uname)\b
Sucht nach typischen Shell-Kommandos als vollständige Wörter im POST-Body
  • id:1001
Eindeutige Identifikationsnummer der Regel im lokalen Regelbereich
  • phase:2
Ausführung nach vollständigem Einlesen des Request-Body
  • t:urlDecodeUni
Dekodiert URL-kodierte Inhalte (z. B. %3B → ;)
  • t:compressWhitespace
Normalisiert Leerzeichen zur besseren Erkennung von Payloads
  • deny
Blockiert die Anfrage bei Regelmatch
  • log
Erstellt einen Eintrag im Audit-Log
  • msg:'POST Command Injection Detected'
Log-Nachricht bei erfolgreichem Treffer

Konfiguration neu laden

  • nginx -t
  • systemctl reload nginx

Testangriff über Webformular

Formularfeld
xinux.de ; pwd

Erwartetes Verhalten

  • HTTP-Statuscode 403
  • Anfrage wird von WAF blockiert
  • Backend erhält keine Anfrage

Audit-Log prüfen

  • grep pwd /var/log/nginx/modsec_audit.log

Ergebnis

  • Command Injection im POST-Body erkannt
  • Anfrage auf Layer 7 analysiert
  • Angriff vor Applikationsverarbeitung blockiert