
웹 애플리케이션, API, AI/LLM 보안 테스트, 보안 코드 리뷰, DevSecOps 통합을 실제와 유사한 실습 랩을 통해 연습할 수 있도록 의도적으로 취약하게 설계된 은행 플랫폼입니다.
웹, API 및 LLM의 애플리케이션 보안 테스트, 안전한 코드 리뷰, CI/CD 파이프라인에 보안 구현을 연습하기 위한 의도적으로 취약하게 만든 웹 애플리케이션입니다.
⚠️ 경고: 이 애플리케이션은 의도적으로 취약하게 제작되었으며, 격리된 환경에서 교육 목적으로만 사용해야 합니다.

이 프로젝트는 여러 보안 취약점이 내장된 간단한 은행 애플리케이션입니다. 보안 엔지니어, 개발자, 인턴, QA 분석가 및 DevSecOps 실무자가 다음 사항을 학습할 수 있도록 설계되었습니다:
USD, GBP, NGN, JPY, EUR, QAR, BTC, ETH)을 통한 가상 카드 충전
인증 및 권한 부여
데이터 보안
거래 취약점
파일 작업
세션 관리
클라이언트 및 서버측 결함
가상 카드 취약점
공과금 납부 취약점
가맹점 결제 API 취약점
/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는 상태 확인(health check)을 노출하며, 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" 오류가 발생하는 경우:
python 대신 py를 사용해 봅니다.업로드 폴더 권한 문제:
디렉터리 생성 시 권한 거부 오류:
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 사용
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에 대해 스키마 인트로스펙션 실행accountNumber와 같은 GraphQL 리졸버 입력을 통한 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 카드로 결제를 청구합니다:
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"
}'
http://localhost:5000/merchant/dashboard에서 가맹점 대시보드를 확인하거나, API 키 또는 취약한 가맹점 JWT로 결제 정보를 검색합니다:
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와 /api/v1/payments/merchant_id/<merchant_id> 비교AI 채팅 접근: 대시보드 오른쪽 하단의 파란색 채팅 버블을 찾으세요.
참고: 채팅 위젯에는 두 가지 모드가 있습니다:
AI 기술: 실제 LLM 취약점을 위해 DeepSeek API를 사용하며, API 키가 구성되지 않은 경우 모의(Mock) 폴백을 사용합니다.
프롬프트 인젝션 공격
AI를 통한 정보 노출
AI를 통한 권한 부여 우회
AI 시스템 악용
컨텍스트 인젝션 및 모드 테스트
실전 프롬프트 인젝션 기법
기여는 언제나 환영합니다! 자유롭게 다음을 할 수 있습니다:
이 랩과 제가 발견한 내용에 대한 상세 워크스루입니다:
👇 DghostNinja의 블로그 읽기
(https://dghostninja.github.io/posts/Vulnerable-Bank-API/)
👇 CyberPreacher의 상세 워크스루
(https://medium.com/@cyberpreacher_/hacking-vulnerable-bank-api-extensive-d2a0d3bb209e)
윤리적 해킹만. 범위 준수. 커피 소비됨. ☕
이 애플리케이션에는 교육 목적의 의도적인 보안 취약점이 포함되어 있습니다. 다음을 하지 마십시오:
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다 - 자세한 내용은 LICENSE 파일을 참조하세요.
보안 교육을 위해 ❤️로 제작됨
AI 고객 지원 취약점