
Plataforma bancária intencionalmente vulnerável para praticar testes de segurança em aplicações web, APIs e IA/LLM, revisão de código seguro e integração DevSecOps por meio de laboratórios práticos realistas.
Uma aplicação web deliberadamente vulnerável para praticar testes de segurança de aplicações Web, APIs e LLMs, revisão de código seguro e implementação de segurança em pipelines de CI/CD.
⚠️ AVISO: Esta aplicação é intencionalmente vulnerável e deve ser usada apenas para fins educacionais em ambientes isolados.

Este projeto é uma aplicação bancária simples com múltiplas vulnerabilidades de segurança incorporadas. Ele foi projetado para ajudar engenheiros de segurança, desenvolvedores, estagiários, analistas de QA e profissionais de DevSecOps a aprender sobre:
USD, GBP, NGN, JPY, EUR, QAR, BTC, ETH)
Autenticação e Autorização
Segurança de Dados
Vulnerabilidades de Transação
Operações de Arquivo
Gerenciamento de Sessão
Falhas no Lado do Cliente e do Servidor
Vulnerabilidades de Cartão Virtual
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
docker-compose up -d --build
A aplicação estará disponível em http://localhost:5000
A configuração Docker inclui algumas salvaguardas operacionais para que a aplicação possa se recuperar sem intervenção manual por SSH:
web e db usam restart: unless-stopped, então o Docker os reinicia automaticamente se o processo sair.db expõe um health check, e web aguarda o Postgres estar pronto antes de iniciar.web executa o servidor de desenvolvimento Flask com debug=True (intencional — preserva os cenários de treinamento que têm como alvo o depurador Werkzeug).web expõe GET /healthz para que o contêiner possa informar se a aplicação e o banco de dados estão realmente utilizáveis.Isso mantém o comportamento intencionalmente vulnerável da aplicação intacto, tornando o ciclo de vida do contêiner mais resiliente.
Você pode validar a integração do runtime local sem iniciar contêineres reais:
python3 -m unittest discover -s tests -v
Isso verifica o comportamento do endpoint /healthz e confirma que start.sh aguarda o banco de dados e depois inicia a aplicação Flask.
Se as dependências da aplicação Flask não estiverem instaladas no seu ambiente Python atual, o teste da rota /healthz é ignorado e o teste de fumaça do script de inicialização ainda é executado.
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
docker build -t vuln-bank .
docker run -p 5000:5000 vuln-bank
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
# On Windows
python -m venv venv
venv\Scripts\activate
# On Linux/Mac
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# On Windows
mkdir static\uploads
# On Linux/Mac
mkdir -p static/uploads
Modifique o arquivo .env:
Execute a aplicação:
# On Windows
python app.py
# On Linux/Mac
python3 app.py
O arquivo .env está intencionalmente incluído neste repositório para facilitar a configuração para fins educacionais. Em uma aplicação do mundo real, você nunca deve enviar arquivos .env para o controle de versão.
Variáveis de ambiente atuais:
DB_NAME=vulnerable_bank
DB_USER=postgres
DB_PASSWORD=postgres
DB_HOST=db # Change to 'localhost' for local installation
DB_PORT=5432
A aplicação usa PostgreSQL. O banco de dados será inicializado automaticamente quando você executar a aplicação pela primeira vez, criando:
http://localhost:5000http://localhost:5000/api/docshttp://localhost:5000/graphqlSe você receber "python not found":
py em vez de pythonProblemas de permissão com a pasta uploads:
Permissão negada ao criar diretórios:
sudo mkdir -p static/uploads
sudo chown -R $USER:$USER static/uploads
Porta 5000 já em uso:
# Kill process using port 5000
sudo lsof -i:5000
sudo kill <PID>
Conexão recusada:
.envFalha na autenticação:
Certifique-se de que DB_PASSWORD no .env corresponde à senha do seu usuário Postgres.
Ou redefina o usuário postgres com:
ALTER ROLE postgres WITH PASSWORD 'your_password';
Erros de instalação:
Se você encontrar erros no PostgreSQL, instale via Chocolatey e defina a senha como postgres:
choco install postgresql --version=17.4.0 -y
# Use the generated password, or immediately reset it:
& 'C:\Program Files\PostgreSQL\17\bin\psql.exe' -U postgres -c "ALTER ROLE postgres WITH PASSWORD 'postgres';"
O banco de dados não existe:
Crie-o manualmente com:
CREATE DATABASE vulnerable_bank;
/upload_profile_picture_url com uma URL interna ou controlada
http://127.0.0.1:5000/internal/secrethttp://127.0.0.1:5000/internal/config.jsonhttp://127.0.0.1:5000/latest/meta-data/ (e subcaminhos como .../iam/security-credentials/)https://webhook.site/<your-id> e observe a requisição recebidacurl -s -X POST http://localhost:5000/upload_profile_picture_url \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{"image_url":"http://127.0.0.1:5000/internal/secret"}'
# -> Copy the returned file_path and GET http://localhost:5000/<file_path>
/graphqlaccountNumberexchange_rate em /api/virtual-cards/<card_id>/fund para creditar excessivamente um cartão durante a conversão de USDA API pública de comerciantes permite que aplicativos demo intencionalmente vulneráveis, como laboratórios de ecommerce, aceitem pagamentos de cartões virtuais Vulnbank.
Registre-se ou faça login como um usuário Vulnbank normal.
Crie um cartão virtual e recarregue-o a partir do saldo principal do usuário.
Registre uma integração de comerciante em http://localhost:5000/merchant/register ou pela API:
curl -s -X POST http://localhost:5000/api/v1/merchants/register \
-H "Content-Type: application/json" \
-d '{"name":"Demo Ecommerce","email":"[email protected]","password":"password123"}'
Cobre o cartão Vulnbank do usuário a partir do aplicativo de ecommerce usando a chave de API do comerciante:
curl -s -X POST http://localhost:5000/api/v1/payments/charge \
-H "X-Merchant-Api-Key: <MERCHANT_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"amount": 49.99,
"currency": "USD",
"card_number": "4111111111111111",
"cvv": "123",
"expiry_date": "12/28",
"merchant_order_id": "ORDER-1001",
"description": "Demo ecommerce checkout"
}'
Visualize o painel do comerciante em http://localhost:5000/merchant/dashboard ou recupere os detalhes do pagamento com a chave de API ou o JWT fraco do comerciante:
curl -s http://localhost:5000/api/v1/payments/<payment_id> \
-H "Authorization: Bearer <MERCHANT_JWT>"
/api/v1/payments/merchant_id/<merchant_id>/api/v1/payments com /api/v1/payments/merchant_id/<merchant_id>Acesse o Chat de IA: Procure pelo balão de chat azul no canto inferior direito do painel
Observação: O widget de chat tem dois modos:
Tecnologia de IA: Usa a API DeepSeek para vulnerabilidades reais de LLM, com fallback mock se nenhuma chave de API estiver configurada.
Ataques de Prompt Injection
Divulgação de Informações via IA
Bypass de Autorização por meio de IA
Exploração do Sistema de IA
Injeção de Contexto e Testes de Modo
Técnicas Reais de Prompt Injection
Contribuições são bem-vindas! Sinta-se à vontade para:
Um passo a passo detalhado sobre este laboratório e minhas descobertas aqui:
👇 Leia o Blog de DghostNinja
(https://dghostninja.github.io/posts/Vulnerable-Bank-API/)
👇 Passo a passo detalhado por CyberPreacher
(https://medium.com/@cyberpreacher_/hacking-vulnerable-bank-api-extensive-d2a0d3bb209e)
Apenas hacking ético. Escopo respeitado. Café consumido. ☕
Esta aplicação contém vulnerabilidades de segurança intencionais para fins educacionais. NÃO:
Este projeto é licenciado sob a Licença MIT - consulte o arquivo LICENSE para obter detalhes.
Feito com ❤️ para Educação em Segurança
Vulnerabilidades de Pagamento de Contas
Vulnerabilidades da API de Pagamentos para Comerciantes
Vulnerabilidades do Suporte ao Cliente com IA
Vulnerabilidades GraphQL
/graphqlOu execute:
createdb -U postgres -h localhost vulnerable_bank