diff --git a/VERSION b/VERSION index a930824..672b322 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.17 \ No newline at end of file +1.3.18 \ No newline at end of file diff --git a/internal/waf/spoe.go b/internal/waf/spoe.go index 2f9ffc0..785516b 100644 --- a/internal/waf/spoe.go +++ b/internal/waf/spoe.go @@ -131,14 +131,22 @@ func (a *SPOEAgent) handle(ctx context.Context, w *encoding.ActionWriter, m *enc // liefert den Body via `option http-buffer-request` (bis tune.bufsize) — // größere Bodies werden zur Prüfung gekappt. Content-Type kam bereits // über die Header, sodass Coraza urlencoded/multipart/json korrekt parst. - if interruption == nil && len(body) > 0 { - if it, _, err := tx.WriteRequestBody(body); err != nil { - slog.Warn("waf: WriteRequestBody", "error", err) - } else if it != nil { - interruption = it - } else { - it, err := tx.ProcessRequestBody() - if err != nil { + if interruption == nil { + if len(body) > 0 { + if it, _, err := tx.WriteRequestBody(body); err != nil { + slog.Warn("waf: WriteRequestBody", "error", err) + } else if it != nil { + interruption = it + } + } + // ProcessRequestBody MUSS immer laufen — auch ohne Body. In Coraza wird + // die GESAMTE Phase 2 (SQLi 942xxx, XSS 941xxx, die den Query-String/ARGS + // prüfen) erst hier ausgewertet. Wurde das an len(body)>0 gekoppelt, + // blieben GET-Requests ohne Body von allen Phase-2-Regeln ungeprüft → + // Query-String-Angriffe (?id=1' OR 1=1, ?x=