Zum Inhalt springen

Anwendungen

Jede Anwendung läuft als 4 lastverteilte Docker-Container hinter nginx-Upstream-Pools und ist über den nginx-Reverse-Proxy auf der VM erreichbar. Sticky Sessions stellen sicher, dass zustandsbehaftete Anwendungen (Juice Shop, DVWA, VAmPI, CSD Demo) konsistent weitergeleitet werden. Alle Anwendungen sind absichtlich verwundbar und für Sicherheitstests konzipiert.

Ersetzen Sie <ORIGIN> in allen nachfolgenden Beispielen durch http://<PUBLIC_IP>. Nach dem Deployment über Terraform erhalten Sie die IP mit terraform output -raw public_ip.

PfadAnwendungHTTP-MethodeErwartete Antwort
/StartseiteGET200 HTML mit Links zu allen Apps
/healthGesundheitsprüfungGET200 JSON {"status":"healthy","component":"origin-server",...}
/juice-shop/Juice ShopGET200 HTML (Angular SPA, ~75 KB)
/juice-shop/rest/products/search?q=Juice Shop APIGET200 JSON {"status":"success","data":[...]} (36 Produkte)
/dvwa/DVWAGET302 Weiterleitung zu /dvwa/login.php
/dvwa/login.phpDVWA LoginGET200 HTML Login-Formular
/dvwa/setup.phpDVWA SetupGET200 HTML (erstmalige Datenbank-Initialisierung)
/vampi/VAmPIGET200 HTML (API-Dokumentation)
/vampi/users/v1VAmPI APIGET200 JSON {"users":[...]}
/vampi/users/v1/registerVAmPI APIPOST200 JSON {"status":"success",...}
/vampi/users/v1/loginVAmPI APIPOST200 JSON {"auth_token":"...","status":"success"}
/httpbin/gethttpbinGET200 JSON mit Anfrage-Details
/httpbin/posthttpbinPOST200 JSON mit gesendeten Daten
/httpbin/headershttpbinGET200 JSON {"headers":{...}}
/httpbin/status/:codehttpbinGETGibt den angegebenen HTTP-Statuscode zurück
/whoami/whoamiGET200 Klartext mit Hostname, IP, allen Headern
/csd-demo/CSD DemoGET200 HTML Checkout-Formular mit Angriffs-Panel
/csd-demo/dashboardCSD Angreifer-AnsichtGET200 HTML mit exfiltrierten Daten
/csd-demo/healthCSD GesundheitsprüfungGET200 JSON {"status":"healthy","component":"csd-demo",...}
/csd-demo/exfil/logCSD Exfil-ProtokollGET200 JSON-Array der erfassten Daten
/dvga/DVGA GraphiQLGET200 HTML (GraphiQL IDE)
/dvga/graphqlDVGA GraphQL APIPOST200 JSON GraphQL-Antwort
/restaurant/RESTaurantGET200 (Weiterleitung zur Dokumentation)
/restaurant/docsRESTaurant SwaggerGET200 HTML (FastAPI Swagger UI)
/restaurant/openapi.jsonRESTaurant OpenAPIGET200 JSON OpenAPI-Spezifikation
http://<PUBLIC_IP>:8888crAPIGET200 HTML (SPA)
http://<PUBLIC_IP>:8888/identity/api/auth/signupcrAPI RegistrierungPOST200 JSON
http://<PUBLIC_IP>:8888/identity/api/auth/logincrAPI LoginPOST200 JSON {"token":"..."}
Pfad/juice-shop/
Imagebkimminich/juice-shop:latest
Instanzen4 (Ports 3001-3004), Sticky via hash $cookie_token, Proxy-Cache (60 s TTL)
Ressourcen2 CPU / 1 GiB RAM pro Instanz
FrameworkNode.js / Angular
Projektowasp.org/www-project-juice-shop

OWASP Juice Shop ist die modernste und am aktivsten gepflegte verwundbare Webanwendung. Sie deckt die gesamten OWASP Top 10 mit über 100 Herausforderungen in einer realistischen E-Commerce-Anwendung ab.

SzenarioKategorieAngriffsvektor
SQL-Injection Login-BypassWAF' OR 1=1-- im Login-E-Mail-Feld
Reflektiertes XSSWAF, CSDScript-Injection über Suchparameter
DOM-basiertes XSSCSDPayload im URL-Fragment
Fehlerhafte AuthentifizierungWAFBrute-Force-Login, JWT-Manipulation
API-MissbrauchAPI-SicherheitUnautorisierter Zugriff auf /api/-Endpunkte
Offenlegung sensibler DatenAPI-SicherheitZugriff auf Benutzerdaten ohne Autorisierung
CSRFWAFCross-Site Request Forgery bei Profiländerungen
Terminal-Fenster
curl -s "http://<PUBLIC_IP>/juice-shop/" -o /dev/null -w "%{http_code}"
Pfad/dvwa/
ImageBenutzerdefiniertes dvwa-fpm:latest (php-fpm + nginx, erstellt aus ghcr.io/digininja/dvwa:latest)
Instanzen4 (Ports 8101-8104), Sticky via hash $cookie_PHPSESSID
Ressourcen0,5 CPU / 256 MiB RAM pro Instanz
DatenbankGemeinsame MariaDB 10.11 (dvwa-db-Container, 1 CPU / 768 MiB)
FrameworkPHP 8 / php-fpm / MariaDB
Anmeldedatenadmin / password

DVWA ist der Industriestandard für WAF-Tests. Es verfügt über einstellbare Sicherheitsstufen (Low, Medium, High, Impossible), die schrittweise Eingabevalidierung und Ausgabekodierung hinzufügen.

SzenarioKategorieSicherheitsstufe
SQL-InjectionWAFLow: triviales ' OR 1=1#, High: Blind SQLi
Command InjectionWAFLow: ; ls, High: gefilterte Zeichen
File InclusionWAFLow: direkter Path Traversal, High: bereinigt
XSS (Reflektiert)WAF, CSDLow: einfaches <script>, High: kodierter Bypass
XSS (Gespeichert)WAF, CSDLow: persistentes Script im Gästebuch
Datei-UploadWAFLow: PHP-Shell-Upload, High: Erweiterungsfilterung
Brute ForceBot-SchutzAutomatisierte Login-Versuche

Setzen Sie die Sicherheitsstufe unter /dvwa/security.php nach dem Login:

  • Low — Keine Eingabevalidierung. Jeder Angriff funktioniert. Gut für WAF-Signatur-Demonstrationen.
  • Medium — Grundlegende Filterung. Einige Angriffe erfordern Kodierung oder Bypass-Techniken.
  • High — Starke Filterung. Nur fortgeschrittene Techniken sind erfolgreich. Gut um WAF-Einschränkungen aufzuzeigen.
  • Impossible — Vollständig sichere Implementierung. Demonstriert korrekte defensive Programmierung.

DVWA erfordert eine einmalige Datenbankeinrichtung nach dem ersten Deployment:

  1. Navigieren Sie zu http://<PUBLIC_IP>/dvwa/setup.php
  2. Klicken Sie auf Create / Reset Database
  3. Melden Sie sich mit admin / password an
Pfad/vampi/
Imageerev0s/vampi:latest mit gunicorn-Einstiegspunkt (4 Worker)
Instanzen4 (Ports 5101-5104), Sticky via ip_hash (SQLite pro Instanz)
Ressourcen0,5 CPU / 512 MiB RAM pro Instanz
FrameworkPython / Flask / gunicorn
Projektgithub.com/erev0s/VAmPI

VAmPI wurde speziell zum Testen der OWASP API Security Top 10 entwickelt. Es bietet eine realistische REST-API mit absichtlichen Schwachstellen. Jede Instanz führt gunicorn mit 4 Workern und einer eigenen SQLite-Datenbank aus. Die ip_hash-Sticky-Session stellt sicher, dass Registrierung und Login von derselben Client-IP immer dieselbe Instanz erreichen.

SzenarioOWASP API Top 10Methode
Broken Object Level Authorization (BOLA)API1Zugriff auf Daten anderer Benutzer durch Manipulation von IDs
Fehlerhafte AuthentifizierungAPI2Schwache Token-Verwaltung, kein Rate Limiting
Übermäßige DatenoffenlegungAPI3API gibt mehr Daten zurück als der Client benötigt
Mass AssignmentAPI6Admin-Felder über unerwartete Parameter ändern
SQL-InjectionAPI8Injection über API-Parameter
Unsachgemäße Asset-VerwaltungAPI9Undokumentierte API-Endpunkte
Terminal-Fenster
# Neuen Benutzer registrieren
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/register" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123","email":"test@test.com"}'
# Anmelden
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/login" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123"}'
# Benutzer auflisten (übermäßige Datenoffenlegung)
curl "http://<PUBLIC_IP>/vampi/users/v1"
Pfad/httpbin/
Imagekennethreitz/httpbin:latest mit gunicorn CMD-Überschreibung (-w 4 -k gevent --timeout 30)
Instanzen4 (Ports 8201-8204), Round-Robin (zustandslos)
Ressourcen0,5 CPU / 256 MiB RAM pro Instanz
FrameworkPython / Flask / gunicorn + gevent
Projekthttpbin.org

httpbin ist ein einfacher HTTP-Anfrage-/Antwortdienst, der für grundlegende API-Demos, das Testen von Anfrage-Headern und die Überprüfung des Proxy-Verhaltens nützlich ist.

EndpunktZweck
/httpbin/getGibt GET-Anfragedaten zurück (Header, Argumente, Herkunft)
/httpbin/postGibt POST-Anfragedaten zurück (Body, Formular, JSON)
/httpbin/headersGibt Anfrage-Header zurück
/httpbin/ipGibt Herkunfts-IP zurück
/httpbin/user-agentGibt User-Agent-Header zurück
/httpbin/status/:codeGibt den angegebenen HTTP-Statuscode zurück
/httpbin/delay/:secondsVerzögert die Antwort um N Sekunden
/httpbin/anythingGibt alles zurück, was in der Anfrage übergeben wurde
Terminal-Fenster
# Prüfen, welche Header der Origin sieht (nützlich zur Überprüfung der F5 XC Header-Injection)
curl -s "http://<PUBLIC_IP>/httpbin/headers" | jq .
# Einen bestimmten HTTP-Statuscode testen
curl -s -o /dev/null -w "%{http_code}" "http://<PUBLIC_IP>/httpbin/status/403"
Pfad/whoami/
Imagetraefik/whoami:latest
Instanzen4 (Ports 8082-8085), Round-Robin (zustandslos)
Ressourcen0,25 CPU / 64 MiB RAM pro Instanz
FrameworkGo
Projektgithub.com/traefik/whoami

whoami ist Traefiks leichtgewichtiger Request-Echo-Server. Er zeigt jedes Detail der eingehenden HTTP-Anfrage an, wie es der Origin sieht — Hostname, IP-Adressen, alle Header, Methode und URL. Dies ist das wichtigste Diagnosetool bei der Überprüfung, ob F5 XC die korrekten Header injiziert.

AnwendungsfallWorauf zu achten ist
F5 XC Header-Injection überprüfenX-Forwarded-For, True-Client-IP, X-Volterra-* Header
Client-IP-Sichtbarkeit bestätigenX-Real-IP vs RemoteAddr
WAF-False-Positives debuggenAnfrage-Header vor/nach F5 XC vergleichen
Bot-Defense-Tagging validierenX-Volterra-Bot-Type, X-Volterra-Bot-Verified Header
TLS-Terminierung prüfenX-Forwarded-Proto zeigt https wenn TLS bei F5 XC terminiert wird
Terminal-Fenster
# Einfache Anfrage -- sehen was der Origin empfängt
curl "http://<PUBLIC_IP>/whoami/"
# Anfrage durch F5 XC simulieren (mit injizierten Headern)
curl "http://<PUBLIC_IP>/whoami/" \
-H "X-Forwarded-For: 203.0.113.50" \
-H "True-Client-IP: 203.0.113.50" \
-H "X-Forwarded-Proto: https"

Beispielausgabe:

Hostname: 534c5084e169
IP: 127.0.0.1
RemoteAddr: 172.17.0.1:55118
GET / HTTP/1.1
Host: 20.12.78.159
User-Agent: curl/8.5.0
Accept: */*
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Forwarded-Proto: https
X-Real-Ip: 104.219.105.84
Pfad/dvga/
Imagedolevf/dvga:latest
Instanzen4 (Ports 5201-5204), Sticky via ip_hash (SQLite pro Instanz)
Ressourcen0,5 CPU / 256 MiB RAM pro Instanz
FrameworkPython / Flask / GraphQL
Projektgithub.com/dolevf/Damn-Vulnerable-GraphQL-Application

DVGA wurde speziell zum Testen von GraphQL-spezifischen Schwachstellen entwickelt. Es bietet eine GraphiQL-IDE unter /dvga/ für interaktive Query-Exploration und einen GraphQL-API-Endpunkt unter /dvga/graphql. Jede Instanz verwendet ihre eigene SQLite-Datenbank, daher stellen ip_hash-Sticky-Sessions einen konsistenten Zustand sicher.

SzenarioKategorieAngriffsvektor
GraphQL-InjectionAPI-SicherheitBösartige Queries über String-Interpolation
Denial of ServiceAPI-SicherheitTief verschachtelte Queries, Batch-Queries, Ressourcenerschöpfung
Autorisierungs-BypassAPI-SicherheitZugriff auf unautorisierte Daten über GraphQL
InformationsoffenlegungAPI-SicherheitIntrospection-Queries, die Schema-Details offenlegen
Batching-AngriffAPI-SicherheitMehrere Operationen in einer einzelnen Anfrage
Terminal-Fenster
# GraphiQL UI (interaktive IDE)
curl -sf "http://<PUBLIC_IP>/dvga/" -o /dev/null -w "%{http_code}"
# Introspection-Query -- vollständiges Schema enumerieren
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ __schema { types { name fields { name } } } }"}'
# Pastes auflisten (Beispiel-Query)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ pastes { title content } }"}'
# Paste erstellen (Mutation)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"}'
Pfad/restaurant/
ImageBenutzerdefinierter Build aus theowni/Damn-Vulnerable-RESTaurant-API-Game
Instanzen4 (Ports 8301-8304), Round-Robin (gemeinsame PostgreSQL)
Ressourcen0,5 CPU / 256 MiB RAM pro Instanz
DatenbankGemeinsame PostgreSQL 15.4 (restaurant-db-Container, 0,5 CPU / 512 MiB)
FrameworkPython / FastAPI / PostgreSQL
Anmeldedatenadmin / password (PostgreSQL)
Projektgithub.com/theowni/Damn-Vulnerable-RESTaurant-API-Game

RESTaurant ist eine gamifizierte verwundbare REST-API, die die OWASP API Security Top 10 2023 abdeckt. Sie verwendet FastAPI mit automatischer Swagger-UI-Dokumentation unter /restaurant/docs. Alle 4 Instanzen teilen sich eine einzelne PostgreSQL-Datenbank, sodass Round-Robin-Lastverteilung ohne Sticky Sessions funktioniert.

SzenarioOWASP API Top 10 2023Methode
Broken Object Level Authorization (BOLA)API1Zugriff auf Bestellungen anderer Benutzer durch Manipulation von IDs
Fehlerhafte AuthentifizierungAPI2Schwache Token-Verwaltung, Credential Stuffing
Broken Object Property Level AuthorizationAPI3Mass Assignment bei Benutzerprofil-Feldern
Unbeschränkter RessourcenverbrauchAPI4Kein Rate Limiting bei Endpunkten
Broken Function Level Authorization (BFLA)API5Zugriff auf Admin-Endpunkte als normaler Benutzer
Server Side Request Forgery (SSRF)API7Manipulation serverseitiger URL-Anfragen
SicherheitsfehlkonfigurationAPI8Ausführliche Fehlermeldungen, Standard-Anmeldedaten
Terminal-Fenster
# Swagger UI
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
# OpenAPI-Spezifikation
curl -s "http://<PUBLIC_IP>/restaurant/openapi.json" | jq .info
# BOLA -- auf Bestellung eines anderen Benutzers zugreifen (nach Authentifizierung)
curl -s "http://<PUBLIC_IP>/restaurant/orders/1" \
-H "Authorization: Bearer <token>"
# BFLA -- Admin-Aktion als normaler Benutzer versuchen
curl -s -X POST "http://<PUBLIC_IP>/restaurant/admin/users" \
-H "Authorization: Bearer <user_token>" \
-H "Content-Type: application/json"
Port8888 (dediziert — nicht pfad-präfixiert)
Imagescrapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHog
Instanzen7 Microservices (jeweils eine Instanz)
Ressourcen~3,0 CPU / ~2,0 GiB RAM insgesamt
FrameworkReact SPA + Java/Go/Python Microservices
Projektgithub.com/OWASP/crAPI

crAPI ist das OWASP-Flaggschiffprojekt für API-Sicherheitstests. Es läuft als 7 Microservices auf einem dedizierten Port (8888), da die React-SPA ihre API-Pfade fest kodiert hat und nicht hinter einem Pfad-Präfix bereitgestellt werden kann. Die NSG erlaubt eingehenden Datenverkehr auf Port 8888.

MailHog erfasst alle von crAPI gesendeten E-Mails (Kontobestätigung, Passwort-Zurücksetzung). Zugriff auf MailHog über SSH-Tunnel auf Port 18025.

KategorieSchwachstellen
BOLA (Broken Object Level Authorization)Zugriff auf Fahrzeuge, Bestellungen und Berichte anderer Benutzer
BFLA (Broken Function Level Authorization)Eskalation zum Admin, Zugriff auf eingeschränkte Endpunkte
Mass AssignmentGeschützte Felder (Rolle, Guthaben) über API ändern
SSRF (Server Side Request Forgery)Manipulation des serverseitigen URL-Abrufs
JWT-ManipulationJWT-Token fälschen oder ändern zur Privilegieneskalation
NoSQL-InjectionQueries in MongoDB-gestützte Endpunkte injizieren
Übermäßige DatenoffenlegungAPI gibt sensible Benutzerdaten zurück
Terminal-Fenster
# Überprüfen ob crAPI läuft
curl -sf "http://<PUBLIC_IP>:8888" -o /dev/null -w "%{http_code}"
# Neuen Benutzer registrieren
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/signup" \
-H "Content-Type: application/json" \
-d '{"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"}'
# Anmelden
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Test1234!"}'
# Zugriff auf MailHog (über SSH-Tunnel für E-Mail-Verifizierung)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# Dann http://localhost:18025 im Browser öffnen
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, Benutzer-Auth, JWT)
-> crapi-community (Go, Foren, Beiträge)
-> crapi-workshop (Python, Fahrzeugservice)
-> crapi-postgres (PostgreSQL)
-> crapi-mongo (MongoDB)
-> crapi-mailhog (E-Mail-Erfassung, Port 18025)
Demo-AnwendungsfallPrimäre AppSekundäre App
WAF — SQL-InjectionDVWAJuice Shop
WAF — XSSDVWAJuice Shop
WAF — Command InjectionDVWA
API-Sicherheit — BOLAVAmPI
API-Sicherheit — Auth-BypassVAmPIJuice Shop
API-Sicherheit — DatenoffenlegungVAmPIhttpbin
Bot-Schutz — Brute ForceDVWAJuice Shop
Bot-Schutz — ScrapingJuice Shop
Client-Side Defense — DOM XSSJuice Shop
Client-Side Defense — Gespeichertes XSSDVWAJuice Shop
Client-Side Defense — Card SkimmerCSD Demo
Client-Side Defense — FormjackerCSD Demo
Client-Side Defense — KeyloggerCSD Demo
Client-Side Defense — CryptominerCSD Demo
Client-Side Defense — DOM HijackCSD Demo
API-Sicherheit — GraphQL-InjectionDVGA
API-Sicherheit — GraphQL DoSDVGA
API-Sicherheit — OWASP API Top 10 2023RESTaurantcrAPI
API-Sicherheit — BFLARESTaurantcrAPI
API-Sicherheit — Mass AssignmentcrAPIRESTaurant
API-Sicherheit — SSRFcrAPIRESTaurant
API-Sicherheit — JWT-ManipulationcrAPI
API-Sicherheit — NoSQL-InjectioncrAPI
Grundlegende Konnektivitätstestshttpbin
Anfrage-Diagnosewhoamihttpbin
Header-Injection-Überprüfungwhoami