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

이 프로젝트는 여러 보안 취약점이 내장된 간단한 은행 애플리케이션입니다. 보안 엔지니어, 개발자, 인턴, QA 분석가 및 DevSecOps 실무자가 다음 사항을 학습할 수 있도록 설계되었습니다:
USD, GBP, NGN, JPY, EUR, QAR, BTC, ETH)을 통한 가상 카드 충전
인증 및 권한 부여
데이터 보안
거래 취약점
파일 작업
세션 관리
클라이언트 및 서버측 결함
가상 카드 취약점
공과금 납부 취약점
가맹점 결제 API 취약점
AI 고객 지원 취약점
/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>로 지정하고 들어오는 요청을 관찰합니다.