Skenario 05 / 26FAIL
Broken Object Level Authorization - Users - User Detail API
Lingkungan lab — bukan sistem produksi
Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.
vuln-bank/Evidence/[FAIL] Broken Object Level Authorization - Users - User Detail API
01 — Catatan
Catatan pengujian
Kerentanan
[FAIL] Broken Object Level Authorization - Users - User Detail API
Deskripsi
Endpoint /api/v3/user/<user_id> mengembalikan profil pengguna berdasarkan user_id pada path tanpa memeriksa bahwa profil tersebut milik pemegang token atau bahwa pemanggil adalah administrator. user_id berupa bilangan berurutan.
Dampak
Confidentiality (High): pengguna terautentikasi mana pun dapat menghitung naik user_id untuk memanen profil seluruh nasabah, termasuk nomor rekening, saldo, bio, dan penanda administrator. Data ini menjadi bahan baku serangan lanjutan: nomor rekening yang diperoleh dipakai pada IDOR saldo dan transfer, sedangkan penanda is_admin mengidentifikasi target bernilai tinggi.
CWE
CWE-639: Authorization Bypass Through User-Controlled Key
OWASP
A01:2021 - Broken Access Control
Skenario
Normal: penyerang membaca profilnya sendiri (user_id 2). Eksploitasi: user_id diganti 3 -> profil korban terbaca. Dampak: user_id 1 dibaca -> profil administrator beserta nomor rekening, saldo, dan is_admin true terekspos ke pengguna biasa.
Endpoint
GET http://127.0.0.1:5001/api/v3/user/<user_id>
Fitur terdampak
API detail pengguna (dipakai panel admin untuk modal detail user)
Rekomendasi perbaikan
- Batasi endpoint agar hanya mengembalikan profil pemilik token, dan sediakan endpoint administratif terpisah yang memeriksa peran dari database.
- Gunakan UUID acak sebagai identifier pengguna.
- Kurangi field pada respons seminimal yang dibutuhkan antarmuka.
Bukti konsep
1) (Screenshot 1) NORMAL: penyerang membaca profilnya sendiri pada user_id 2.
2) (Screenshot 2) EKSPLOITASI: user_id 3 dibaca -> profil korban terekspos.
3) (Screenshot 3) DAMPAK CIA: user_id 1 dibaca -> profil administrator, nomor rekening ADMIN001, saldo, dan is_admin true terekspos ke pengguna biasa.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Broken Object Level Authorization - Users - User Detail API
Description:
Endpoint /api/v3/user/<user_id> mengembalikan profil pengguna berdasarkan user_id pada path tanpa memeriksa bahwa profil tersebut milik pemegang token atau bahwa pemanggil adalah administrator. user_id berupa bilangan berurutan.
Impact:
Confidentiality (High): pengguna terautentikasi mana pun dapat menghitung naik user_id untuk memanen profil seluruh nasabah, termasuk nomor rekening, saldo, bio, dan penanda administrator. Data ini menjadi bahan baku serangan lanjutan: nomor rekening yang diperoleh dipakai pada IDOR saldo dan transfer, sedangkan penanda is_admin mengidentifikasi target bernilai tinggi.
CWE:
CWE-639: Authorization Bypass Through User-Controlled Key
OWASP:
A01:2021 - Broken Access Control
Scenario:
Normal: penyerang membaca profilnya sendiri (user_id 2). Eksploitasi: user_id diganti 3 -> profil korban terbaca. Dampak: user_id 1 dibaca -> profil administrator beserta nomor rekening, saldo, dan is_admin true terekspos ke pengguna biasa.
Endpoint:
GET http://127.0.0.1:5001/api/v3/user/<user_id>
Affected Feature:
API detail pengguna (dipakai panel admin untuk modal detail user)
Remediation:
- Batasi endpoint agar hanya mengembalikan profil pemilik token, dan sediakan endpoint administratif terpisah yang memeriksa peran dari database.
- Gunakan UUID acak sebagai identifier pengguna.
- Kurangi field pada respons seminimal yang dibutuhkan antarmuka.
POC:
1) (Screenshot 1) NORMAL: penyerang membaca profilnya sendiri pada user_id 2.
2) (Screenshot 2) EKSPLOITASI: user_id 3 dibaca -> profil korban terekspos.
3) (Screenshot 3) DAMPAK CIA: user_id 1 dibaca -> profil administrator, nomor rekening ADMIN001, saldo, dan is_admin true terekspos ke pengguna biasa.
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 /api/v3/user/2 HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 197
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:15 GMT
{
"status": "success",
"user": {
"account_number": "0932191785",
"balance": -8100.0,
"bio": null,
"id": 2,
"is_admin": false,
"username": "pentest_attacker"
}
}REKAMAN 02 / 2
GET /api/v3/user/3 HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 195
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:16 GMT
{
"status": "success",
"user": {
"account_number": "9159912486",
"balance": 10100.0,
"bio": null,
"id": 3,
"is_admin": false,
"username": "pentest_victim"
}
}REKAMAN 03 / 3
GET /api/v3/user/1 HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 185
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:02:17 GMT
{
"status": "success",
"user": {
"account_number": "ADMIN001",
"balance": 1000000.0,
"bio": null,
"id": 1,
"is_admin": true,
"username": "admin"
}
}