
API REST vulnerável com as vulnerabilidades do OWASP Top 10 para testes de segurança.
A API Vulnerável (Baseada em OpenAPI 3)

VAmPI é uma API vulnerável feita com Flask que inclui vulnerabilidades do OWASP top 10 para APIs. Foi criada porque eu queria uma API vulnerável para avaliar a eficiência de ferramentas usadas para detetar problemas de segurança em APIs. Inclui um interruptor liga/desliga para permitir que a API seja vulnerável ou não durante os testes. Isto permite cobrir melhor os casos de falsos positivos/negativos. VAmPI também pode ser usado para fins de aprendizagem/ensino. Pode encontrar mais detalhes sobre as vulnerabilidades em erev0s.com.
O fluxo de ações do VAmPI é o seguinte: um utilizador não registado pode ver informações mínimas sobre os utilizadores fictícios incluídos na API. Um utilizador pode registar-se e depois fazer login para poder usar o token recebido durante o login para publicar um livro. Para um livro publicado, os dados aceites são o título e um segredo sobre esse livro. Cada livro é único para cada utilizador e apenas o proprietário do livro deve poder ver o segredo.
Uma visão rápida das ações incluídas pode ser vista na tabela seguinte:
Para mais detalhes, pode executar o VAmPI e visitar http://127.0.0.1:5000/ui/ ou usar um serviço como o swagger editor fornecendo a especificação OpenAPI que se encontra no diretório openapi_specs.
É uma aplicação Flask, por isso, para a executar, pode instalar todos os requisitos e depois executar o app.py.
Para instalar todos os requisitos, basta executar pip3 install -r requirements.txt e depois python3 app.py.
Ou, se preferir, pode também executá-la através do Docker ou do Docker Compose.
docker run -p 5000:5000 erev0s/vampi:latest
[Nota: se executar o Docker em versões mais recentes do MacOS, use -p 5001:5000 para evitar conflitos com o serviço AirPlay Receiver. Alternativamente, pode desativar o serviço AirPlay Receiver nas Preferências do Sistema -> definições de Partilha.]
docker-compose contém duas instâncias, uma com a configuração segura na porta 5001 e outra com configuração insegura na porta 5002:
docker-compose up -d
Visite o caminho /ui onde está a executar a API e um Swagger UI estará disponível para ajudar a começar!
http://127.0.0.1:5000/ui/
Se desejar alterar o tempo limite do token criado após o login ou se quiser mudar o ambiente para não ser vulnerável, pode usar algumas formas dependendo de como executa a aplicação.
python3 app.py, tudo o que precisa fazer é editar as variáveis alive e vuln definidas no próprio app.py. A variável alive é medida em segundos, por isso se colocar 100, o token expira após 100 segundos. A variável vuln é como booleano, se a definir como 1 a aplicação é vulnerável, e se a definir como 0 a aplicação não é vulnerável.docker run ou editar o Dockerfile e reconstruir.
Exemplo de Docker run: docker run -d -e vulnerable=0 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest
/createdb para preencher a base de dados.| Ação | Caminho | Detalhes |
|---|
| GET | /createdb | Cria e preenche a base de dados com dados fictícios |
| GET | / | Página inicial do VAmPI |
| GET | /me | Mostra o utilizador que está autenticado |
| GET | /users/v1 | Mostra todos os utilizadores com informações básicas |
| GET | /users/v1/_debug | Mostra todos os detalhes de todos os utilizadores |
| POST | /users/v1/register | Registar novo utilizador |
| POST | /users/v1/login | Login no VAmPI |
| GET | /users/v1/{username} | Mostra utilizador pelo nome de utilizador |
| DELETE | /users/v1/{username} | Elimina utilizador pelo nome de utilizador (Apenas Administradores) |
| PUT | /users/v1/{username}/email | Atualizar o email de um utilizador |
| PUT | /users/v1/{username}/password | Atualizar a palavra-passe do utilizador |
| GET | /books/v1 | Obtém todos os livros |
| POST | /books/v1 | Adicionar novo livro |
| GET | /books/v1/{book} | Obtém livro por título juntamente com o segredo |
vulnerable=1No Dockerfile encontrará duas variáveis de ambiente definidas: ENV vulnerable=1 e ENV tokentimetolive=60. Sinta-se à vontade para alterá-las antes de executar o comando docker build.