一个故意包含漏洞的银行平台,用于通过真实的实操实验室练习 Web 应用程序、API 和 AI/LLM 安全测试、安全代码审查以及 DevSecOps 集成。
一个故意包含漏洞的 Web 应用程序,用于练习 Web、API 和 LLM 的应用安全测试、安全代码审查以及在 CI/CD 管道中实施安全措施。
⚠️ 警告:此应用程序有意包含漏洞,仅应在隔离环境中用于教育目的。

本项目是一个内置多种安全漏洞的简单银行应用程序。它旨在帮助安全工程师、开发人员、实习生、QA 分析师和 DevSecOps 从业者了解:
USD、GBP、NGN、JPY、EUR、QAR、BTC、ETH)
身份验证与授权
数据安全
交易漏洞
文件操作
会话管理
客户端与服务端缺陷
虚拟卡漏洞
账单支付漏洞
商户支付 API 漏洞
AI 客户支持漏洞
GraphQL 漏洞
/graphql 继承了基于 JWT 的弱身份验证git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
docker-compose up -d --build
应用程序将在 http://localhost:5000 上可用。
Docker 部署包含一些运行保障机制,使应用程序无需手动 SSH 干预即可恢复:
web 和 db 使用 restart: unless-stopped,因此如果进程退出,Docker 会自动重启它们。db 提供健康检查,web 在启动前会等待 Postgres 就绪。web 以 debug=True 运行 Flask 开发服务器(有意为之——保留针对 Werkzeug 调试器的训练场景)。web 暴露 GET /healthz,以便容器可以报告应用和数据库是否实际可用。这既保持了故意易受攻击的应用程序行为不变,又使容器生命周期更具弹性。
无需启动真实容器即可验证本地运行时配置:
python3 -m unittest discover -s tests -v
这会检查 /healthz 端点的行为,并验证 start.sh 会等待数据库就绪后再启动 Flask 应用。
如果当前 Python 环境中未安装 Flask 应用依赖项,则会跳过 /healthz 路由测试,但启动脚本冒烟测试仍会运行。
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
修改 .env 文件:
运行应用程序:
# On Windows
python app.py
# On Linux/Mac
python3 app.py
出于教育目的,.env 文件被有意包含在此仓库中,以方便快速设置。在真实应用程序中,你绝不应将 .env 文件提交到版本控制。
当前环境变量:
DB_NAME=vulnerable_bank
DB_USER=postgres
DB_PASSWORD=postgres
DB_HOST=db # Change to 'localhost' for local installation
DB_PORT=5432
该应用程序使用 PostgreSQL。首次运行应用程序时,数据库将自动初始化,并创建:
http://localhost:5000http://localhost:5000/api/docshttp://localhost:5000/graphql如果出现 "python not found":
py 代替 pythonuploads 文件夹的权限问题:
创建目录时权限被拒绝:
sudo mkdir -p static/uploads
sudo chown -R $USER:$USER static/uploads
端口 5000 已被占用:
# Kill process using port 5000
sudo lsof -i:5000
sudo kill <PID>
连接被拒绝:
.env 文件中的凭据身份验证失败:
确保 .env 中的 DB_PASSWORD 与你的 Postgres 用户密码一致。
或者使用以下命令重置 postgres 用户:
ALTER ROLE postgres WITH PASSWORD 'your_password';
安装错误:
如果遇到任何 PostgreSQL 错误,可通过 Chocolatey 安装并将密码设置为 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';"
数据库不存在:
手动创建:
CREATE DATABASE vulnerable_bank;
或者运行:
createdb -U postgres -h localhost vulnerable_bank
/upload_profile_picture_url 并传入内部或可控的 URL
http://127.0.0.1:5000/internal/secrethttp://127.0.0.1:5000/internal/config.jsonhttp://127.0.0.1:5000/latest/meta-data/(以及 .../iam/security-credentials/ 等子路径)https://webhook.site/<your-id> 并观察传入的请求curl -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>
/graphql 运行模式自省(schema introspection)accountNumber)测试 SQL 注入/api/virtual-cards/<card_id>/fund 中的 exchange_rate,在 USD 转换期间超额充值卡片公共商户 API 允许故意易受攻击的演示应用(如电商实验室)接受来自 Vulnbank 虚拟卡的付款。
以普通 Vulnbank 用户身份注册或登录。
创建一张虚拟卡,并从用户的主余额充值。
通过 http://localhost:5000/merchant/register 或 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"}'
使用商户 API 密钥从电商应用向用户的 Vulnbank 卡发起扣款: