CLASSIFICATION: INTERNAL — HOMELAB ONLY · Defensive security write-up for portfolio purposes

BLUE TEAM WRITE-UP // DEFENSIVE ARCHITECTURE

Defensive Architecture: WAF Implementation (ModSecurity)

Role: Blue Team Tech: Nginx, ModSecurity, OWASP CRS Target: DVWA Environment: Homelab
report-metadata.json

authorMaksymilian Frankowski

date2026-05-26

roleBlue Team — Defender

related_reportDVWA SQLi Red Team Write-up ↗

stackNginx · ModSecurity · OWASP CRS · Docker

scopeIsolated local network · No live systems


00 // EXECUTIVE SUMMARY

Overview

W odpowiedzi na zidentyfikowane podatności aplikacji (SQL Injection), zaprojektowano i wdrożono architekturę obronną opartą na Reverse Proxy. Wykorzystano Nginx z modułem ModSecurity w celu inspekcji i blokowania złośliwego ruchu na krawędzi sieci.

architecture · traffic flow
Attacker · sqlmap
──→
Nginx + ModSecurity WAF
──→
DVWA · :80
✗ 403 Forbidden ← SQLi payload blocked at WAF layer, never reaches app
01

PHASE-01 // DEPLOYMENT

Infrastructure as Code

Cały stos WAF wdrożono jako kontener Docker przy użyciu oficjalnego obrazu owasp/modsecurity-crs:nginx. Konfiguracja jest w pełni odtwarzalna i przenośna — jeden plik docker-compose.yml definiuje kompletną architekturę obronną.

docker-compose.yml
YAML · Infrastructure as Code
# WAF Reverse Proxy — ModSecurity + OWASP CRS
services:
  waf:
    image: owasp/modsecurity-crs:nginx
    container_name: waf-modsecurity
    ports:
      - "8088:8080"          # expose WAF on port 8088
    environment:
      - BACKEND=http://dvwa:80  # proxy target
      - MODSEC_RULE_ENGINE=On
      - PARANOIA=1             # OWASP CRS paranoia level
    networks:
      - waf-net

  dvwa:
    image: vulnerables/web-dvwa
    container_name: dvwa-target
    networks:
      - waf-net

networks:
  waf-net:
    driver: bridge
bash · deploy
$ docker compose up -d
[+] Running 2/2
 ✔ Container waf-modsecurity  Started
 ✔ Container dvwa-target      Started
02

PHASE-02 // DETECTION

Detekcja i Blokowanie

Reguły OWASP Core Rule Set (CRS) natychmiastowo zidentyfikowały i zablokowały ładunki SQLi — odpowiadając błędem 403 Forbidden. Złośliwe żądanie nie dotarło nigdy do aplikacji. Detekcja opiera się na sygnatach wzorców ataku takich jak UNION SELECT, OR 1=1 i metadanych HTTP.

/var/log/modsec_audit.log · tail -f
LIVE LOGS
--a1b2c3d4-A--
[26/May/2026:21:04:12 +0000] BLOCKED
Request: GET /vulnerabilities/sqli/?id=1%27+AND+1%3D1--

[ALERT] Matched phrase "and 1=1" at ARGS:id.
  Rule ID: 942100 · SQL Injection Attack Detected via libinjection
  Severity: CRITICAL · Paranoia Level: 1
  Action:   deny · status 403

[ALERT] Matched phrase "union select" at ARGS:id.
  Rule ID: 942200 · Detects UNION-based SQL Injection
  Action:   deny · status 403
WAF Detection Logs — ModSecurity blocking SQLi payloads
Fig. 1 — ModSecurity audit log potwierdzający detekcję i blokowanie ładunków SQL Injection (403 Forbidden)
03

PHASE-03 // MITIGATION PROOF

Dowód Skuteczności

Zmasowany atak wykonany przez sqlmap został zablokowany 147 razy — żaden ładunek nie przebił się do warstwy aplikacji. WAF pochłonął pełne skanowanie bez żadnej ekstrakcji danych, potwierdzając skuteczność architektury obronnej.

Requests Blocked

147

Data Leaked

0

HTTP Status

403

SQLMap Blocked — 147 requests denied by WAF
Fig. 2 — sqlmap output pokazujący 147 zablokowanych żądań; żadna enumeracja baz danych nie powiodła się
root@zwidek-core-01 ~ blue-team.conclusion

const result = "WAF na bazie ModSecurity + OWASP CRS skutecznie zneutralizował wszystkie wektory SQLi wykryte w trakcie Red Team Assessment.";

// Pełen cykl: Red Team odkrywa · Blue Team deployuje obronę · weryfikacja skuteczności.

// Related: DVWA SQLi Red Team Write-up →

$ echo "Defense holds. — Maksymilian Frankowski · zwidek.pl"

← Back to portfolio

© 2026 · Maksymilian Frankowski · All systems nominal