
API REST vulnerabile con le vulnerabilità OWASP top 10 per test di sicurezza
L'API vulnerabile (Basata su OpenAPI 3)

VAmPI è un'API vulnerabile realizzata con Flask e include vulnerabilità dalla top 10 OWASP per le API. È stata creata perché volevo un'API vulnerabile per valutare l'efficienza degli strumenti utilizzati per rilevare problemi di sicurezza nelle API. Include un interruttore on/off per rendere l'API vulnerabile o meno durante il test. Ciò consente di coprire meglio i casi di falsi positivi/negativi. VAmPI può anche essere utilizzata per scopi di apprendimento/insegnamento. Puoi trovare maggiori dettagli sulle vulnerabilità su erev0s.com.
Il flusso di azioni di VAmPI è il seguente: un utente non registrato può vedere informazioni minime sugli utenti fittizi inclusi nell'API. Un utente può registrarsi e poi accedere per poter utilizzare il token ricevuto durante il login per pubblicare un libro. Per un libro pubblicato, i dati accettati sono il titolo e un segreto relativo a quel libro. Ogni libro è unico per ogni utente e solo il proprietario del libro dovrebbe essere autorizzato a visualizzare il segreto.
Una rapida panoramica delle azioni incluse può essere vista nella tabella seguente:
| Azione | Percorso | Dettagli |
|---|---|---|
| GET | /createdb | Crea e popola il database con dati fittizi |
| GET | / | Home di VAmPI |
| GET | /me | Mostra l'utente che ha effettuato l'accesso |
| GET | /users/v1 | Mostra tutti gli utenti con informazioni di base |
| GET | /users/v1/_debug | Mostra tutti i dettagli per tutti gli utenti |
| POST | /users/v1/register | Registra un nuovo utente |
| POST | /users/v1/login | Accedi a VAmPI |
| GET | /users/v1/{username} | Mostra l'utente per nome utente |
| DELETE | /users/v1/{username} | Elimina l'utente per nome utente (Solo Admin) |
| PUT | /users/v1/{username}/email | Aggiorna l'email di un singolo utente |
| PUT | /users/v1/{username}/password | Aggiorna la password dell'utente |
| GET | /books/v1 | Recupera tutti i libri |
| POST | /books/v1 | Aggiungi un nuovo libro |
| GET | /books/v1/{book} | Recupera il libro per titolo insieme al segreto |
Per maggiori dettagli puoi eseguire VAmPI e visitare http://127.0.0.1:5000/ui/ oppure utilizzare un servizio come swagger editor fornendo la specifica OpenAPI che si trova nella directory openapi_specs.
È un'applicazione Flask, quindi per eseguirla è possibile installare tutti i requisiti e poi eseguire app.py.
Per installare tutti i requisiti basta eseguire pip3 install -r requirements.txt e poi python3 app.py.
Oppure, se preferisci, puoi eseguirlo tramite Docker o Docker Compose.
docker run -p 5000:5000 erev0s/vampi:latest
[Nota: se esegui Docker su versioni più recenti di MacOS, usa -p 5001:5000 per evitare conflitti con il servizio AirPlay Receiver. In alternativa, puoi disabilitare il servizio AirPlay Receiver in Impostazioni di Sistema -> Condivisione.]
docker-compose contiene due istanze, una con la configurazione sicura sulla porta 5001 e un'altra con configurazione insicura sulla porta 5002:
docker-compose up -d
Visita il percorso /ui dove è in esecuzione l'API e sarà disponibile una Swagger UI per aiutarti a iniziare!
http://127.0.0.1:5000/ui/
Se desideri modificare il timeout del token creato dopo il login o se vuoi impostare l'ambiente in modo che non sia vulnerabile, puoi utilizzare alcuni modi a seconda di come esegui l'applicazione.
python3 app.py, tutto ciò che devi fare è modificare le variabili alive e vuln definite in app.py. La variabile alive è misurata in secondi, quindi se imposti 100, il token scade dopo 100 secondi. La variabile vuln è booleana: se la imposti a 1 l'applicazione è vulnerabile, se la imposti a 0 non lo è.docker run o modificare il Dockerfile e ricostruire.
Esempio di esecuzione Docker: docker run -d -e vulnerable=0 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest
vulnerable=1 su una porta diversa e passare facilmente dall'uno all'altro.Nel Dockerfile troverai due variabili d'ambiente impostate: ENV vulnerable=1 e ENV tokentimetolive=60. Sentiti libero di modificarle prima di eseguire il comando docker build.
/createdb per popolare il database.