Pengujian keamanan · Pengujian lab · Lingkungan simulasi

VulnBank Laporan pengujian keamanan

Laporan HTML ini menyajikan catatan pengujian lab dan materi pendukungnya, bukan salinan kata demi kata dari PDF asli. PDF yang tersedia ditampilkan di bawah.

26Skenario pengujian
21Skenario FAIL
05Skenario PASS
01 / RINGKASAN EKSEKUTIF

Ringkasan eksekutif

Pengujian lab VulnBank mencakup 26 skenario: 21 FAIL dan 5 PASS. Hasil ini berlaku untuk lingkungan lab, bukan sistem produksi. Angka tersebut menghitung skenario pengujian, bukan kontrol keamanan yang berbeda.

LingkunganVulnBankAplikasi lab · Pengujian penetrasi
Tangkapan layar81 Tangkapan layarDari skenario pengujian berstatus PASS dan FAIL
02 / METODOLOGI

Metodologi

Catatan pengujian menjelaskan fitur, langkah yang dilakukan, dan perilaku yang diamati. Jika tersedia, request normal dibandingkan dengan upaya penyalahgunaan untuk menunjukkan perbedaannya dan menjelaskan hasil pengujian.

  1. Ruang lingkup, endpoint, dan perilaku normal
  2. Langkah pengujian dan variasi request
  3. Response yang diamati dan dampak keamanan
  4. Hasil PASS atau FAIL, beserta referensi CWE/OWASP dan rekomendasi perbaikan jika relevan
03 / SKENARIO PENGUJIAN DAN BUKTI

Skenario pengujian dan bukti

Telusuri skenario berstatus PASS dan FAIL di bawah. Buka skenario untuk melihat tangkapan layar dan rekaman HTTP yang tersedia.

01 / 26FAIL

Account Takeover - Password Reset - Reset PIN Disclosure

4 tangkapan layar · 4 rekaman HTTP

Kerentanan

[FAIL] Account Takeover - Password Reset - Reset PIN Disclosure

Deskripsi

Endpoint /api/v1/forgot-password mengembalikan reset PIN korban langsung di dalam body respons HTTP pada field debug_info.pin. PIN ini seharusnya hanya dikirim ke kanal milik korban (email). Siapa pun yang mengetahui username dapat meminta PIN, lalu memakainya pada /api/v1/reset-password untuk menetapkan password baru.

Dampak

Confidentiality + Integrity (Critical): pengambilalihan akun penuh tanpa interaksi korban dan tanpa akses ke email korban. Penyerang cukup mengetahui username untuk mengganti password dan masuk sebagai korban, termasuk akun administrator. Rekening dan seluruh fungsi perbankan korban menjadi terkendali penyerang.

CWE

CWE-640: Weak Password Recovery Mechanism for Forgotten Password

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Normal: /api/v2/forgot-password menerima permintaan dan menyatakan PIN dikirim ke email, tanpa membocorkan PIN. Eksploitasi: endpoint versi lama /api/v1/forgot-password mengembalikan PIN pada respons. Chain: PIN dipakai pada /api/v1/reset-password untuk menetapkan password pilihan penyerang. Dampak: login sebagai korban berhasil.

Endpoint

POST http://127.0.0.1:5001/api/v1/forgot-password POST http://127.0.0.1:5001/api/v1/reset-password

Fitur terdampak

Pemulihan password / lupa password (API v1)

Rekomendasi perbaikan

- Jangan pernah mengembalikan reset PIN, OTP, atau token pemulihan pada respons HTTP; kirim hanya melalui kanal terverifikasi milik pengguna. - Hapus blok debug_info dari seluruh respons produksi. - Pensiunkan endpoint versi lama (v1) yang sudah digantikan v2/v3. - Gunakan token acak panjang dengan masa berlaku singkat dan sekali pakai, bukan PIN 3 digit. - Terapkan rate limiting dan invalidasi seluruh sesi aktif setelah reset password.

Bukti konsep

1) (Screenshot 1) NORMAL: /api/v2/forgot-password untuk pentest_victim -> respons tidak memuat PIN. 2) (Screenshot 2) EKSPLOITASI: /api/v1/forgot-password untuk pentest_victim -> respons membocorkan debug_info.pin. 3) (Screenshot 3) CHAIN: PIN hasil bocoran dikirim ke /api/v1/reset-password -> reset_success true, password korban diganti. 4) (Screenshot 4) DAMPAK CIA: login sebagai pentest_victim dengan password baru -> token terbit, akun korban diambil alih.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Account Takeover - Password Reset - Reset PIN Disclosure

Description:
Endpoint /api/v1/forgot-password mengembalikan reset PIN korban langsung di dalam body respons HTTP pada field debug_info.pin. PIN ini seharusnya hanya dikirim ke kanal milik korban (email). Siapa pun yang mengetahui username dapat meminta PIN, lalu memakainya pada /api/v1/reset-password untuk menetapkan password baru.

Impact:
Confidentiality + Integrity (Critical): pengambilalihan akun penuh tanpa interaksi korban dan tanpa akses ke email korban. Penyerang cukup mengetahui username untuk mengganti password dan masuk sebagai korban, termasuk akun administrator. Rekening dan seluruh fungsi perbankan korban menjadi terkendali penyerang.

CWE:
CWE-640: Weak Password Recovery Mechanism for Forgotten Password

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Normal: /api/v2/forgot-password menerima permintaan dan menyatakan PIN dikirim ke email, tanpa membocorkan PIN. Eksploitasi: endpoint versi lama /api/v1/forgot-password mengembalikan PIN pada respons. Chain: PIN dipakai pada /api/v1/reset-password untuk menetapkan password pilihan penyerang. Dampak: login sebagai korban berhasil.

Endpoint:
POST http://127.0.0.1:5001/api/v1/forgot-password
POST http://127.0.0.1:5001/api/v1/reset-password

Affected Feature:
Pemulihan password / lupa password (API v1)

Remediation:
- Jangan pernah mengembalikan reset PIN, OTP, atau token pemulihan pada respons HTTP; kirim hanya melalui kanal terverifikasi milik pengguna.
- Hapus blok debug_info dari seluruh respons produksi.
- Pensiunkan endpoint versi lama (v1) yang sudah digantikan v2/v3.
- Gunakan token acak panjang dengan masa berlaku singkat dan sekali pakai, bukan PIN 3 digit.
- Terapkan rate limiting dan invalidasi seluruh sesi aktif setelah reset password.

POC:
1) (Screenshot 1) NORMAL: /api/v2/forgot-password untuk pentest_victim -> respons tidak memuat PIN.
2) (Screenshot 2) EKSPLOITASI: /api/v1/forgot-password untuk pentest_victim -> respons membocorkan debug_info.pin.
3) (Screenshot 3) CHAIN: PIN hasil bocoran dikirim ke /api/v1/reset-password -> reset_success true, password korban diganti.
4) (Screenshot 4) DAMPAK CIA: login sebagai pentest_victim dengan password baru -> token terbit, akun korban diambil alih.

02 / 26FAIL

Active Debug Code - Application Server - Werkzeug Debugger

2 tangkapan layar · 2 rekaman HTTP

Kerentanan

[FAIL] Active Debug Code - Application Server - Werkzeug Debugger

Deskripsi

Aplikasi dijalankan dengan server pengembangan Flask dalam mode debug (app.run(debug=True)), sehingga konsol interaktif Werkzeug tersaji tanpa autentikasi pada /console. Halaman tersebut juga memuat nilai SECRET milik debugger. Header respons membocorkan versi Werkzeug dan Python secara persis.

Dampak

Medium: konsol debugger Werkzeug dirancang untuk mengeksekusi kode Python arbitrer pada server. Endpoint-nya terjangkau tanpa autentikasi dan nilai SECRET-nya terbaca, sehingga hanya PIN debugger yang menghalangi eksekusi perintah. PIN tersebut diturunkan dari atribut host dan dapat dihitung bila penyerang memperoleh primitif baca berkas, menjadikan temuan ini jalur menuju remote code execution. Selain itu, server pengembangan tidak dirancang untuk produksi dan banner versi yang presisi mempermudah pencocokan eksploit publik. Catatan pengujian yang jujur: eksekusi kode TIDAK berhasil dicapai. PIN debugger aktif dan pada pengujian ini hanya terbaca melalui log kontainer, yang bukan merupakan jalur yang dapat dijangkau penyerang eksternal. Upaya menurunkan PIN melalui SSRF juga gagal karena pustaka requests tidak mendukung skema file://. Temuan ini karena itu dilaporkan sebagai eksposur debugger, bukan sebagai RCE yang terbukti.

CWE

CWE-489: Active Debug Code

OWASP

A05:2021 - Security Misconfiguration

Skenario

Eksploitasi: permintaan GET tanpa autentikasi ke /console -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger. Pendukung: header respons pada rute mana pun membocorkan Werkzeug/2.0.1 dan Python/3.9.25 secara persis.

Endpoint

GET http://127.0.0.1:5001/console

Fitur terdampak

Konfigurasi server aplikasi (Flask development server, mode debug)

Rekomendasi perbaikan

- Matikan mode debug pada seluruh lingkungan selain workstation pengembang; pastikan debug=False di produksi. - Jalankan aplikasi di belakang WSGI server produksi (gunicorn/uWSGI) dan jangan gunakan server pengembangan Flask. - Blokir /console pada reverse proxy sebagai pertahanan berlapis. - Sembunyikan atau samarkan header Server agar tidak membocorkan versi persis.

Bukti konsep

1) (Screenshot 1) EKSPLOITASI: GET /console tanpa autentikasi -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger. 2) (Screenshot 2) PENDUKUNG: header respons membocorkan Server: Werkzeug/2.0.1 Python/3.9.25, mengonfirmasi server pengembangan berjalan di mode debug.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Active Debug Code - Application Server - Werkzeug Debugger

Description:
Aplikasi dijalankan dengan server pengembangan Flask dalam mode debug (app.run(debug=True)), sehingga konsol interaktif Werkzeug tersaji tanpa autentikasi pada /console. Halaman tersebut juga memuat nilai SECRET milik debugger. Header respons membocorkan versi Werkzeug dan Python secara persis.

Impact:
Medium: konsol debugger Werkzeug dirancang untuk mengeksekusi kode Python arbitrer pada server. Endpoint-nya terjangkau tanpa autentikasi dan nilai SECRET-nya terbaca, sehingga hanya PIN debugger yang menghalangi eksekusi perintah. PIN tersebut diturunkan dari atribut host dan dapat dihitung bila penyerang memperoleh primitif baca berkas, menjadikan temuan ini jalur menuju remote code execution. Selain itu, server pengembangan tidak dirancang untuk produksi dan banner versi yang presisi mempermudah pencocokan eksploit publik.

Catatan pengujian yang jujur: eksekusi kode TIDAK berhasil dicapai. PIN debugger aktif dan pada pengujian ini hanya terbaca melalui log kontainer, yang bukan merupakan jalur yang dapat dijangkau penyerang eksternal. Upaya menurunkan PIN melalui SSRF juga gagal karena pustaka requests tidak mendukung skema file://. Temuan ini karena itu dilaporkan sebagai eksposur debugger, bukan sebagai RCE yang terbukti.

CWE:
CWE-489: Active Debug Code

OWASP:
A05:2021 - Security Misconfiguration

Scenario:
Eksploitasi: permintaan GET tanpa autentikasi ke /console -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger. Pendukung: header respons pada rute mana pun membocorkan Werkzeug/2.0.1 dan Python/3.9.25 secara persis.

Endpoint:
GET http://127.0.0.1:5001/console

Affected Feature:
Konfigurasi server aplikasi (Flask development server, mode debug)

Remediation:
- Matikan mode debug pada seluruh lingkungan selain workstation pengembang; pastikan debug=False di produksi.
- Jalankan aplikasi di belakang WSGI server produksi (gunicorn/uWSGI) dan jangan gunakan server pengembangan Flask.
- Blokir /console pada reverse proxy sebagai pertahanan berlapis.
- Sembunyikan atau samarkan header Server agar tidak membocorkan versi persis.

POC:
1) (Screenshot 1) EKSPLOITASI: GET /console tanpa autentikasi -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger.
2) (Screenshot 2) PENDUKUNG: header respons membocorkan Server: Werkzeug/2.0.1 Python/3.9.25, mengonfirmasi server pengembangan berjalan di mode debug.

03 / 26FAIL

Broken Object Level Authorization - Accounts - Balance Lookup

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] Broken Object Level Authorization - Accounts - Balance Lookup

Deskripsi

Endpoint /check_balance/<account_number> mengembalikan saldo rekening berdasarkan nomor rekening pada path tanpa memeriksa bahwa rekening tersebut milik pemegang token. Token yang valid sudah cukup untuk membaca rekening mana pun.

Dampak

Confidentiality (High): nasabah mana pun dapat membaca nama pemilik dan saldo rekening nasabah lain, termasuk rekening administrator. Nomor rekening juga terekspos pada endpoint lain di aplikasi ini, sehingga pemetaan saldo seluruh nasabah dapat dilakukan secara sistematis.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

A01:2021 - Broken Access Control

Skenario

Normal: penyerang memeriksa saldo rekeningnya sendiri -> wajar. Eksploitasi: nomor rekening diganti dengan milik korban -> HTTP 200, nama dan saldo korban terbaca. Dampak: rekening administrator ADMIN001 juga terbaca dengan cara yang sama.

Endpoint

GET http://127.0.0.1:5001/check_balance/<account_number>

Fitur terdampak

Pengecekan saldo rekening

Rekomendasi perbaikan

- Turunkan nomor rekening dari token pemanggil, bukan dari path. - Jika parameter dipertahankan, verifikasi kepemilikan rekening sebelum mengembalikan data. - Hindari nomor rekening yang dapat ditebak dan jangan tampilkan nomor rekening pengguna lain di respons endpoint mana pun.

Bukti konsep

1) (Screenshot 1) NORMAL: penyerang memeriksa saldo rekening miliknya sendiri. 2) (Screenshot 2) EKSPLOITASI: nomor rekening diganti milik korban -> HTTP 200, nama dan saldo korban terekspos. 3) (Screenshot 3) DAMPAK CIA: rekening administrator ADMIN001 dibaca dengan token pengguna biasa.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Broken Object Level Authorization - Accounts - Balance Lookup

Description:
Endpoint /check_balance/<account_number> mengembalikan saldo rekening berdasarkan nomor rekening pada path tanpa memeriksa bahwa rekening tersebut milik pemegang token. Token yang valid sudah cukup untuk membaca rekening mana pun.

Impact:
Confidentiality (High): nasabah mana pun dapat membaca nama pemilik dan saldo rekening nasabah lain, termasuk rekening administrator. Nomor rekening juga terekspos pada endpoint lain di aplikasi ini, sehingga pemetaan saldo seluruh nasabah dapat dilakukan secara sistematis.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
A01:2021 - Broken Access Control

Scenario:
Normal: penyerang memeriksa saldo rekeningnya sendiri -> wajar. Eksploitasi: nomor rekening diganti dengan milik korban -> HTTP 200, nama dan saldo korban terbaca. Dampak: rekening administrator ADMIN001 juga terbaca dengan cara yang sama.

Endpoint:
GET http://127.0.0.1:5001/check_balance/<account_number>

Affected Feature:
Pengecekan saldo rekening

Remediation:
- Turunkan nomor rekening dari token pemanggil, bukan dari path.
- Jika parameter dipertahankan, verifikasi kepemilikan rekening sebelum mengembalikan data.
- Hindari nomor rekening yang dapat ditebak dan jangan tampilkan nomor rekening pengguna lain di respons endpoint mana pun.

POC:
1) (Screenshot 1) NORMAL: penyerang memeriksa saldo rekening miliknya sendiri.
2) (Screenshot 2) EKSPLOITASI: nomor rekening diganti milik korban -> HTTP 200, nama dan saldo korban terekspos.
3) (Screenshot 3) DAMPAK CIA: rekening administrator ADMIN001 dibaca dengan token pengguna biasa.

04 / 26FAIL

Broken Object Level Authorization - Merchant Payments - Payments By Merchant

2 tangkapan layar · 2 rekaman HTTP

Kerentanan

[FAIL] Broken Object Level Authorization - Merchant Payments - Payments By Merchant

Deskripsi

Endpoint /api/v1/payments/merchant_id/<merchant_id> mengembalikan daftar pembayaran berdasarkan merchant_id pada path tanpa memeriksa bahwa API key pemanggil memang milik merchant tersebut. Pemeriksaan hanya memastikan API key valid, bukan bahwa pemanggil berhak atas objek yang diminta.

Dampak

Confidentiality (High): pelanggaran isolasi antar tenant. Merchant mana pun yang terdaftar dapat membaca transaksi merchant lain hanya dengan mengubah merchant_id, yang mengekspos data penjualan dan nilai transaksi pesaing. merchant_id berupa bilangan berurutan sehingga seluruh tenant dapat dipanen secara sistematis.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

A01:2021 - Broken Access Control

Skenario

Normal: VictimShop membaca daftar pembayarannya sendiri memakai API key miliknya. Eksploitasi: EvilShop memanggil endpoint yang sama dengan merchant_id milik VictimShop menggunakan API key EvilShop -> HTTP 200 dan transaksi VictimShop senilai 77.0 terbaca.

Endpoint

GET http://127.0.0.1:5001/api/v1/payments/merchant_id/<merchant_id>

Fitur terdampak

Pembayaran merchant (rekap transaksi per merchant)

Rekomendasi perbaikan

- Abaikan merchant_id dari path; turunkan merchant dari API key yang mengautentikasi permintaan. - Jika parameter tetap diperlukan, tolak permintaan saat merchant_id tidak sama dengan merchant pemilik API key. - Gunakan identifier acak untuk merchant. - Hapus blok debug_info yang memantulkan API key pemanggil pada respons.

Bukti konsep

1) (Screenshot 1) NORMAL: VictimShop membaca pembayarannya sendiri dengan API key miliknya -> berhasil. 2) (Screenshot 2) DAMPAK CIA: EvilShop memakai API key-nya sendiri untuk membaca merchant_id milik VictimShop -> HTTP 200, transaksi senilai 77.0 milik merchant lain terekspos.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Broken Object Level Authorization - Merchant Payments - Payments By Merchant

Description:
Endpoint /api/v1/payments/merchant_id/<merchant_id> mengembalikan daftar pembayaran berdasarkan merchant_id pada path tanpa memeriksa bahwa API key pemanggil memang milik merchant tersebut. Pemeriksaan hanya memastikan API key valid, bukan bahwa pemanggil berhak atas objek yang diminta.

Impact:
Confidentiality (High): pelanggaran isolasi antar tenant. Merchant mana pun yang terdaftar dapat membaca transaksi merchant lain hanya dengan mengubah merchant_id, yang mengekspos data penjualan dan nilai transaksi pesaing. merchant_id berupa bilangan berurutan sehingga seluruh tenant dapat dipanen secara sistematis.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
A01:2021 - Broken Access Control

Scenario:
Normal: VictimShop membaca daftar pembayarannya sendiri memakai API key miliknya. Eksploitasi: EvilShop memanggil endpoint yang sama dengan merchant_id milik VictimShop menggunakan API key EvilShop -> HTTP 200 dan transaksi VictimShop senilai 77.0 terbaca.

Endpoint:
GET http://127.0.0.1:5001/api/v1/payments/merchant_id/<merchant_id>

Affected Feature:
Pembayaran merchant (rekap transaksi per merchant)

Remediation:
- Abaikan merchant_id dari path; turunkan merchant dari API key yang mengautentikasi permintaan.
- Jika parameter tetap diperlukan, tolak permintaan saat merchant_id tidak sama dengan merchant pemilik API key.
- Gunakan identifier acak untuk merchant.
- Hapus blok debug_info yang memantulkan API key pemanggil pada respons.

POC:
1) (Screenshot 1) NORMAL: VictimShop membaca pembayarannya sendiri dengan API key miliknya -> berhasil.
2) (Screenshot 2) DAMPAK CIA: EvilShop memakai API key-nya sendiri untuk membaca merchant_id milik VictimShop -> HTTP 200, transaksi senilai 77.0 milik merchant lain terekspos.

05 / 26FAIL

Broken Object Level Authorization - Users - User Detail API

3 tangkapan layar · 3 rekaman HTTP

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.

06 / 26FAIL

Broken Object Level Authorization - Virtual Cards - Card Operations

4 tangkapan layar · 4 rekaman HTTP

Kerentanan

[FAIL] Broken Object Level Authorization - Virtual Cards - Card Operations

Deskripsi

Endpoint kartu virtual menerima card_id dari path URL dan mengoperasikannya tanpa memverifikasi bahwa kartu tersebut milik pemegang token. Identifier kartu berupa bilangan bulat berurutan sehingga mudah dienumerasi.

Dampak

Confidentiality + Integrity (High): pengguna terautentikasi mana pun dapat membaca riwayat transaksi kartu virtual milik nasabah lain dan mengubah statusnya. Pada pengujian, penyerang membekukan kartu milik korban, yang merupakan penolakan layanan terhadap instrumen pembayaran korban. Endpoint sejenis pada modul yang sama juga mengizinkan perubahan limit dan pengisian dana.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

A01:2021 - Broken Access Control

Skenario

Normal: penyerang mengakses riwayat transaksi kartunya sendiri -> berhasil. Eksploitasi: penyerang mengganti card_id menjadi milik korban -> HTTP 200, riwayat kartu korban terbaca. Dampak: penyerang memanggil toggle-freeze pada kartu korban -> kartu korban berhasil dibekukan dan status is_frozen true terlihat dari sesi korban.

Endpoint

GET http://127.0.0.1:5001/api/virtual-cards/<card_id>/transactions POST http://127.0.0.1:5001/api/virtual-cards/<card_id>/toggle-freeze

Fitur terdampak

Kartu virtual (riwayat transaksi, pembekuan kartu, limit, top-up)

Rekomendasi perbaikan

- Verifikasi kepemilikan objek pada setiap permintaan: cocokkan card_id dengan user_id dari token sebelum membaca atau mengubah. - Terapkan pemeriksaan otorisasi terpusat pada seluruh endpoint kartu, bukan per handler. - Gunakan UUID acak sebagai identifier kartu agar tidak dapat dienumerasi. - Catat dan pantau percobaan akses lintas objek.

Bukti konsep

1) (Screenshot 1) NORMAL: penyerang membaca riwayat kartu miliknya sendiri -> berhasil. 2) (Screenshot 2) EKSPLOITASI: penyerang membaca riwayat kartu milik korban -> HTTP 200, data korban terekspos. 3) (Screenshot 3) EKSPLOITASI: penyerang membekukan kartu korban -> Card frozen successfully. 4) (Screenshot 4) DAMPAK CIA: dari sesi korban, kartu miliknya tampak is_frozen true akibat aksi penyerang.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Broken Object Level Authorization - Virtual Cards - Card Operations

Description:
Endpoint kartu virtual menerima card_id dari path URL dan mengoperasikannya tanpa memverifikasi bahwa kartu tersebut milik pemegang token. Identifier kartu berupa bilangan bulat berurutan sehingga mudah dienumerasi.

Impact:
Confidentiality + Integrity (High): pengguna terautentikasi mana pun dapat membaca riwayat transaksi kartu virtual milik nasabah lain dan mengubah statusnya. Pada pengujian, penyerang membekukan kartu milik korban, yang merupakan penolakan layanan terhadap instrumen pembayaran korban. Endpoint sejenis pada modul yang sama juga mengizinkan perubahan limit dan pengisian dana.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
A01:2021 - Broken Access Control

Scenario:
Normal: penyerang mengakses riwayat transaksi kartunya sendiri -> berhasil. Eksploitasi: penyerang mengganti card_id menjadi milik korban -> HTTP 200, riwayat kartu korban terbaca. Dampak: penyerang memanggil toggle-freeze pada kartu korban -> kartu korban berhasil dibekukan dan status is_frozen true terlihat dari sesi korban.

Endpoint:
GET  http://127.0.0.1:5001/api/virtual-cards/<card_id>/transactions
POST http://127.0.0.1:5001/api/virtual-cards/<card_id>/toggle-freeze

Affected Feature:
Kartu virtual (riwayat transaksi, pembekuan kartu, limit, top-up)

Remediation:
- Verifikasi kepemilikan objek pada setiap permintaan: cocokkan card_id dengan user_id dari token sebelum membaca atau mengubah.
- Terapkan pemeriksaan otorisasi terpusat pada seluruh endpoint kartu, bukan per handler.
- Gunakan UUID acak sebagai identifier kartu agar tidak dapat dienumerasi.
- Catat dan pantau percobaan akses lintas objek.

POC:
1) (Screenshot 1) NORMAL: penyerang membaca riwayat kartu miliknya sendiri -> berhasil.
2) (Screenshot 2) EKSPLOITASI: penyerang membaca riwayat kartu milik korban -> HTTP 200, data korban terekspos.
3) (Screenshot 3) EKSPLOITASI: penyerang membekukan kartu korban -> Card frozen successfully.
4) (Screenshot 4) DAMPAK CIA: dari sesi korban, kartu miliknya tampak is_frozen true akibat aksi penyerang.

07 / 26FAIL

Excessive Data Exposure - GraphQL - Schema Introspection

1 tangkapan layar · 1 rekaman HTTP

Kerentanan

[FAIL] Excessive Data Exposure - GraphQL - Schema Introspection

Deskripsi

Endpoint /graphql melayani query introspeksi __schema bagi pengguna terautentikasi biasa. Seluruh tipe, field, dan argumen skema dapat diunduh, termasuk field yang tidak dipakai antarmuka resmi.

Dampak

Low: introspeksi memberi penyerang peta lengkap permukaan serangan GraphQL tanpa perlu menebak nama field. Informasi ini mempercepat penemuan kerentanan lain pada lapisan yang sama; pada pengujian ini, argumen accountNumber yang terungkap dari skema menjadi titik masuk temuan SQL Injection pada resolver transactionSummary. Introspeksi sendiri tidak membocorkan data nasabah.

CWE

CWE-200: Exposure of Sensitive Information to an Unauthorized Actor

OWASP

A05:2021 - Security Misconfiguration

Skenario

Eksploitasi: query __schema dikirim memakai token pengguna biasa -> seluruh definisi tipe dan field dikembalikan, termasuk resolver transactionSummary beserta argumennya.

Endpoint

POST http://127.0.0.1:5001/graphql

Fitur terdampak

Endpoint GraphQL

Rekomendasi perbaikan

- Matikan introspeksi pada lingkungan produksi. - Terapkan allow-list query (persisted queries) agar hanya operasi yang dikenal dapat dijalankan. - Batasi kedalaman dan kompleksitas query serta terapkan rate limiting. - Pastikan setiap resolver menjalankan pemeriksaan otorisasinya sendiri.

Bukti konsep

1) (Screenshot 1) EKSPLOITASI: query introspeksi __schema dikirim dengan token pengguna biasa -> seluruh tipe dan field skema dikembalikan, termasuk resolver transactionSummary beserta argumennya.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Excessive Data Exposure - GraphQL - Schema Introspection

Description:
Endpoint /graphql melayani query introspeksi __schema bagi pengguna terautentikasi biasa. Seluruh tipe, field, dan argumen skema dapat diunduh, termasuk field yang tidak dipakai antarmuka resmi.

Impact:
Low: introspeksi memberi penyerang peta lengkap permukaan serangan GraphQL tanpa perlu menebak nama field. Informasi ini mempercepat penemuan kerentanan lain pada lapisan yang sama; pada pengujian ini, argumen accountNumber yang terungkap dari skema menjadi titik masuk temuan SQL Injection pada resolver transactionSummary. Introspeksi sendiri tidak membocorkan data nasabah.

CWE:
CWE-200: Exposure of Sensitive Information to an Unauthorized Actor

OWASP:
A05:2021 - Security Misconfiguration

Scenario:
Eksploitasi: query __schema dikirim memakai token pengguna biasa -> seluruh definisi tipe dan field dikembalikan, termasuk resolver transactionSummary beserta argumennya.

Endpoint:
POST http://127.0.0.1:5001/graphql

Affected Feature:
Endpoint GraphQL

Remediation:
- Matikan introspeksi pada lingkungan produksi.
- Terapkan allow-list query (persisted queries) agar hanya operasi yang dikenal dapat dijalankan.
- Batasi kedalaman dan kompleksitas query serta terapkan rate limiting.
- Pastikan setiap resolver menjalankan pemeriksaan otorisasinya sendiri.

POC:
1) (Screenshot 1) EKSPLOITASI: query introspeksi __schema dikirim dengan token pengguna biasa -> seluruh tipe dan field skema dikembalikan, termasuk resolver transactionSummary beserta argumennya.

08 / 26FAIL

Insufficient Session Expiration - Authentication - JWT Lifetime

3 tangkapan layar · 2 rekaman HTTP · 1 catatan proses

Kerentanan

[FAIL] Insufficient Session Expiration - Authentication - JWT Lifetime

Deskripsi

Token JWT yang diterbitkan tidak memuat klaim exp sehingga tidak pernah kedaluwarsa, dan tidak tersedia mekanisme pencabutan token. Selain itu token diterima dari beberapa lokasi sekaligus, termasuk parameter query URL, dan pada antarmuka web disimpan di localStorage sehingga terbaca oleh JavaScript.

Dampak

Medium: token yang pernah bocor berlaku selamanya. Tidak ada rotasi maupun pencabutan, sehingga satu kali kebocoran memberi akses permanen ke akun korban. Penerimaan token melalui parameter query memperbesar peluang kebocoran karena URL tercatat di riwayat peramban, log server, dan header Referer. Penyimpanan di localStorage membuat token dapat dicuri oleh XSS, dan hal ini telah dibuktikan pada temuan Stored Cross-Site Scripting di mana JWT administrator berhasil diambil.

CWE

CWE-613: Insufficient Session Expiration

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Analisis token: token yang diterbitkan didekode dan hanya memuat klaim user_id, username, is_admin, dan iat; klaim exp tidak ada sama sekali. Verifikasi: token yang sama tetap diterima pada endpoint terproteksi. Pendukung: token juga diterima ketika dikirim sebagai parameter query pada URL, bukan hanya pada header Authorization.

Endpoint

POST http://127.0.0.1:5001/login (penerbitan token) GET http://127.0.0.1:5001/dashboard (penerimaan token)

Fitur terdampak

Manajemen sesi berbasis JWT

Rekomendasi perbaikan

- Tambahkan klaim exp dengan masa berlaku singkat dan terapkan refresh token yang dapat dicabut. - Simpan daftar pencabutan (denylist) atau gunakan token identifier agar sesi dapat dimatikan saat terjadi insiden. - Terima token hanya dari header Authorization; hentikan pembacaan dari parameter query dan form. - Pindahkan token sesi ke cookie HttpOnly, Secure, dan SameSite agar tidak terjangkau JavaScript.

Bukti konsep

1) (Screenshot 1) ANALISIS: token hasil login didekode -> hanya memuat user_id, username, is_admin, dan iat; klaim exp tidak ada. 2) (Screenshot 2) VERIFIKASI: token yang sama diterima pada endpoint terproteksi -> HTTP 200. 3) (Screenshot 3) DAMPAK: token yang sama juga diterima ketika dikirim sebagai parameter query pada URL -> HTTP 200, memperbesar peluang kebocoran melalui log dan Referer.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Insufficient Session Expiration - Authentication - JWT Lifetime

Description:
Token JWT yang diterbitkan tidak memuat klaim exp sehingga tidak pernah kedaluwarsa, dan tidak tersedia mekanisme pencabutan token. Selain itu token diterima dari beberapa lokasi sekaligus, termasuk parameter query URL, dan pada antarmuka web disimpan di localStorage sehingga terbaca oleh JavaScript.

Impact:
Medium: token yang pernah bocor berlaku selamanya. Tidak ada rotasi maupun pencabutan, sehingga satu kali kebocoran memberi akses permanen ke akun korban. Penerimaan token melalui parameter query memperbesar peluang kebocoran karena URL tercatat di riwayat peramban, log server, dan header Referer. Penyimpanan di localStorage membuat token dapat dicuri oleh XSS, dan hal ini telah dibuktikan pada temuan Stored Cross-Site Scripting di mana JWT administrator berhasil diambil.

CWE:
CWE-613: Insufficient Session Expiration

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Analisis token: token yang diterbitkan didekode dan hanya memuat klaim user_id, username, is_admin, dan iat; klaim exp tidak ada sama sekali. Verifikasi: token yang sama tetap diterima pada endpoint terproteksi. Pendukung: token juga diterima ketika dikirim sebagai parameter query pada URL, bukan hanya pada header Authorization.

Endpoint:
POST http://127.0.0.1:5001/login (penerbitan token)
GET  http://127.0.0.1:5001/dashboard (penerimaan token)

Affected Feature:
Manajemen sesi berbasis JWT

Remediation:
- Tambahkan klaim exp dengan masa berlaku singkat dan terapkan refresh token yang dapat dicabut.
- Simpan daftar pencabutan (denylist) atau gunakan token identifier agar sesi dapat dimatikan saat terjadi insiden.
- Terima token hanya dari header Authorization; hentikan pembacaan dari parameter query dan form.
- Pindahkan token sesi ke cookie HttpOnly, Secure, dan SameSite agar tidak terjangkau JavaScript.

POC:
1) (Screenshot 1) ANALISIS: token hasil login didekode -> hanya memuat user_id, username, is_admin, dan iat; klaim exp tidak ada.
2) (Screenshot 2) VERIFIKASI: token yang sama diterima pada endpoint terproteksi -> HTTP 200.
3) (Screenshot 3) DAMPAK: token yang sama juga diterima ketika dikirim sebagai parameter query pada URL -> HTTP 200, memperbesar peluang kebocoran melalui log dan Referer.

09 / 26FAIL

JWT Signature Not Verified - Authentication - Token Validation

4 tangkapan layar · 3 rekaman HTTP · 1 catatan proses

Kerentanan

[FAIL] JWT Signature Not Verified - Authentication - Token Validation

Deskripsi

Fungsi verify_token pada auth.py menangkap InvalidSignatureError lalu mencoba ulang decode dengan options={'verify_signature': False} dan mengembalikan payload-nya. Akibatnya token dengan tanda tangan yang salah tetap diterima. Klaim is_admin dibaca langsung dari payload token sehingga penyerang cukup mengubah klaim tersebut.

Dampak

Confidentiality + Integrity (Critical): eskalasi hak akses vertikal dari pengguna biasa menjadi administrator tanpa mengetahui kunci penanda tangan. Token yang ditempa membuka panel admin dan seluruh endpoint administratif, termasuk membaca data pengguna lain dan mengelola akun.

CWE

CWE-347: Improper Verification of Cryptographic Signature

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Normal: token sah milik pentest_attacker ditolak panel admin dengan 403 Access Denied. Eksploitasi: payload token diubah menjadi user_id 1 dan is_admin true, lalu ditandatangani ulang memakai kunci yang salah (totally-wrong-key). Dampak: token palsu diterima, panel admin terbuka dan data administrator terbaca.

Endpoint

GET http://127.0.0.1:5001/sup3r_s3cr3t_admin GET http://127.0.0.1:5001/api/v3/user/1

Fitur terdampak

Validasi JWT pada seluruh endpoint terproteksi (decorator token_required)

Rekomendasi perbaikan

- Hapus jalur fallback yang melakukan decode dengan verify_signature False; kegagalan verifikasi tanda tangan harus selalu menolak permintaan. - Kunci algoritma ke satu nilai yang diharapkan (HS256) dan tolak nilai lain. - Jangan mengambil keputusan otorisasi dari klaim di dalam token; ambil peran dari database berdasarkan subject token. - Gunakan secret yang kuat dan acak, serta tambahkan klaim exp.

Bukti konsep

1) (Screenshot 1) NORMAL: token sah pentest_attacker ke /sup3r_s3cr3t_admin -> HTTP 403 Access Denied. 2) (Screenshot 2) PROSES: token didekode, klaim user_id diubah ke 1 dan is_admin ke true, lalu ditandatangani ulang dengan kunci salah. 3) (Screenshot 3) EKSPLOITASI: token palsu ke /sup3r_s3cr3t_admin -> HTTP 200, panel admin terbuka. 4) (Screenshot 4) DAMPAK CIA: token palsu membaca /api/v3/user/1 -> data administrator (ADMIN001, is_admin true) terekspos.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] JWT Signature Not Verified - Authentication - Token Validation

Description:
Fungsi verify_token pada auth.py menangkap InvalidSignatureError lalu mencoba ulang decode dengan options={'verify_signature': False} dan mengembalikan payload-nya. Akibatnya token dengan tanda tangan yang salah tetap diterima. Klaim is_admin dibaca langsung dari payload token sehingga penyerang cukup mengubah klaim tersebut.

Impact:
Confidentiality + Integrity (Critical): eskalasi hak akses vertikal dari pengguna biasa menjadi administrator tanpa mengetahui kunci penanda tangan. Token yang ditempa membuka panel admin dan seluruh endpoint administratif, termasuk membaca data pengguna lain dan mengelola akun.

CWE:
CWE-347: Improper Verification of Cryptographic Signature

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Normal: token sah milik pentest_attacker ditolak panel admin dengan 403 Access Denied. Eksploitasi: payload token diubah menjadi user_id 1 dan is_admin true, lalu ditandatangani ulang memakai kunci yang salah (totally-wrong-key). Dampak: token palsu diterima, panel admin terbuka dan data administrator terbaca.

Endpoint:
GET http://127.0.0.1:5001/sup3r_s3cr3t_admin
GET http://127.0.0.1:5001/api/v3/user/1

Affected Feature:
Validasi JWT pada seluruh endpoint terproteksi (decorator token_required)

Remediation:
- Hapus jalur fallback yang melakukan decode dengan verify_signature False; kegagalan verifikasi tanda tangan harus selalu menolak permintaan.
- Kunci algoritma ke satu nilai yang diharapkan (HS256) dan tolak nilai lain.
- Jangan mengambil keputusan otorisasi dari klaim di dalam token; ambil peran dari database berdasarkan subject token.
- Gunakan secret yang kuat dan acak, serta tambahkan klaim exp.

POC:
1) (Screenshot 1) NORMAL: token sah pentest_attacker ke /sup3r_s3cr3t_admin -> HTTP 403 Access Denied.
2) (Screenshot 2) PROSES: token didekode, klaim user_id diubah ke 1 dan is_admin ke true, lalu ditandatangani ulang dengan kunci salah.
3) (Screenshot 3) EKSPLOITASI: token palsu ke /sup3r_s3cr3t_admin -> HTTP 200, panel admin terbuka.
4) (Screenshot 4) DAMPAK CIA: token palsu membaca /api/v3/user/1 -> data administrator (ADMIN001, is_admin true) terekspos.

10 / 26FAIL

Mass Assignment - Registration - Privilege Fields

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] Mass Assignment - Registration - Privilege Fields

Deskripsi

Endpoint /register menyalin seluruh key pada JSON permintaan ke dalam statement INSERT tanpa allow-list kolom. Field sensitif seperti is_admin dan balance yang seharusnya ditentukan server dapat dikirim klien dan langsung tersimpan.

Dampak

Integrity (Critical): siapa pun yang dapat mengakses halaman pendaftaran dapat membuat akun administrator untuk dirinya sendiri sekaligus menetapkan saldo rekening sesuka hati. Ini melewati seluruh kontrol persetujuan pembuatan admin dan menciptakan saldo fiktif pada sistem perbankan.

CWE

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes

OWASP

A04:2021 - Insecure Design

Skenario

Normal: pendaftaran hanya dengan username dan password menghasilkan akun biasa (is_admin false, saldo default 1000). Eksploitasi: permintaan yang sama ditambah field is_admin true dan balance 999999 -> akun langsung dibuat sebagai administrator dengan saldo yang ditentukan penyerang. Dampak: login akun tersebut membuka panel admin.

Endpoint

POST http://127.0.0.1:5001/register

Fitur terdampak

Pendaftaran pengguna baru

Rekomendasi perbaikan

- Terapkan allow-list kolom yang boleh diisi klien (username, password saja); abaikan field lain secara eksplisit. - Tetapkan is_admin dan balance di sisi server dengan nilai default, tidak pernah dari input. - Pisahkan pembuatan administrator ke alur khusus yang memerlukan otorisasi admin. - Hapus blok debug_data yang memantulkan input mentah pada respons.

Bukti konsep

1) (Screenshot 1) NORMAL: pendaftaran ma_normal_user dengan username dan password saja -> is_admin false, balance 1000. 2) (Screenshot 2) EKSPLOITASI: pendaftaran ma_evil_admin dengan tambahan is_admin true dan balance 999999 -> tersimpan sebagai administrator bersaldo 999999. 3) (Screenshot 3) DAMPAK CIA: login ma_evil_admin lalu akses /sup3r_s3cr3t_admin -> HTTP 200, panel administrasi terbuka.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Mass Assignment - Registration - Privilege Fields

Description:
Endpoint /register menyalin seluruh key pada JSON permintaan ke dalam statement INSERT tanpa allow-list kolom. Field sensitif seperti is_admin dan balance yang seharusnya ditentukan server dapat dikirim klien dan langsung tersimpan.

Impact:
Integrity (Critical): siapa pun yang dapat mengakses halaman pendaftaran dapat membuat akun administrator untuk dirinya sendiri sekaligus menetapkan saldo rekening sesuka hati. Ini melewati seluruh kontrol persetujuan pembuatan admin dan menciptakan saldo fiktif pada sistem perbankan.

CWE:
CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes

OWASP:
A04:2021 - Insecure Design

Scenario:
Normal: pendaftaran hanya dengan username dan password menghasilkan akun biasa (is_admin false, saldo default 1000). Eksploitasi: permintaan yang sama ditambah field is_admin true dan balance 999999 -> akun langsung dibuat sebagai administrator dengan saldo yang ditentukan penyerang. Dampak: login akun tersebut membuka panel admin.

Endpoint:
POST http://127.0.0.1:5001/register

Affected Feature:
Pendaftaran pengguna baru

Remediation:
- Terapkan allow-list kolom yang boleh diisi klien (username, password saja); abaikan field lain secara eksplisit.
- Tetapkan is_admin dan balance di sisi server dengan nilai default, tidak pernah dari input.
- Pisahkan pembuatan administrator ke alur khusus yang memerlukan otorisasi admin.
- Hapus blok debug_data yang memantulkan input mentah pada respons.

POC:
1) (Screenshot 1) NORMAL: pendaftaran ma_normal_user dengan username dan password saja -> is_admin false, balance 1000.
2) (Screenshot 2) EKSPLOITASI: pendaftaran ma_evil_admin dengan tambahan is_admin true dan balance 999999 -> tersimpan sebagai administrator bersaldo 999999.
3) (Screenshot 3) DAMPAK CIA: login ma_evil_admin lalu akses /sup3r_s3cr3t_admin -> HTTP 200, panel administrasi terbuka.

11 / 26FAIL

Race Condition - Transfer - Balance Check

5 tangkapan layar · 5 rekaman HTTP

Kerentanan

[FAIL] Race Condition - Transfer - Balance Check

Deskripsi

Endpoint /transfer membaca saldo pengirim, memeriksa kecukupan dana, lalu menulis saldo baru sebagai operasi terpisah tanpa transaksi database atomik maupun penguncian baris. Sepuluh permintaan transfer yang dikirim bersamaan semuanya lolos pemeriksaan saldo menggunakan nilai lama yang sama sebelum satu pun penulisan selesai (TOCTOU).

Dampak

Integrity (Critical): penyerang dapat mengirim dana jauh melebihi saldo yang dimiliki. Pada pengujian, saldo pengirim jatuh menjadi negatif sementara saldo penerima bertambah penuh, sehingga uang tercipta dari ketiadaan. Pada sistem perbankan ini berarti kerugian finansial langsung dan pembukuan yang tidak konsisten.

CWE

CWE-362: Concurrent Execution using Shared Resource with Improper Synchronization

OWASP

A04:2021 - Insecure Design

Skenario

Normal: satu transfer dalam batas saldo berhasil, dan satu transfer melebihi saldo ditolak dengan pesan dana tidak cukup, membuktikan kontrol bekerja saat serial. Eksploitasi: sepuluh transfer senilai 900 dikirim paralel dari saldo yang jauh lebih kecil. Dampak: saldo pengirim menjadi negatif, total dana yang berpindah melampaui saldo yang pernah dimiliki.

Endpoint

POST http://127.0.0.1:5001/transfer

Fitur terdampak

Transfer dana antar rekening

Rekomendasi perbaikan

- Jalankan pemeriksaan saldo dan pendebetan dalam satu transaksi database atomik. - Kunci baris rekening pengirim (SELECT ... FOR UPDATE) atau gunakan pembaruan kondisional UPDATE ... SET balance = balance - x WHERE balance >= x. - Tambahkan constraint CHECK (balance >= 0) pada kolom saldo sebagai jaring pengaman. - Terapkan idempotency key dan rate limiting pada endpoint transfer.

Bukti konsep

1) (Screenshot 1) NORMAL: transfer 100 dalam batas saldo -> berhasil. 2) (Screenshot 2) NORMAL: transfer 5000 melebihi saldo -> ditolak, kontrol saldo bekerja secara serial. 3) (Screenshot 3) BASELINE: saldo penyerang sebelum serangan = 900.0. 4) (Screenshot 4) EKSPLOITASI: sepuluh transfer senilai 900 dikirim bersamaan -> seluruhnya dilaporkan sukses. 5) (Screenshot 5) DAMPAK CIA: saldo penyerang menjadi -8100.0, bernilai negatif dan melampaui dana yang pernah dimiliki.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Race Condition - Transfer - Balance Check

Description:
Endpoint /transfer membaca saldo pengirim, memeriksa kecukupan dana, lalu menulis saldo baru sebagai operasi terpisah tanpa transaksi database atomik maupun penguncian baris. Sepuluh permintaan transfer yang dikirim bersamaan semuanya lolos pemeriksaan saldo menggunakan nilai lama yang sama sebelum satu pun penulisan selesai (TOCTOU).

Impact:
Integrity (Critical): penyerang dapat mengirim dana jauh melebihi saldo yang dimiliki. Pada pengujian, saldo pengirim jatuh menjadi negatif sementara saldo penerima bertambah penuh, sehingga uang tercipta dari ketiadaan. Pada sistem perbankan ini berarti kerugian finansial langsung dan pembukuan yang tidak konsisten.

CWE:
CWE-362: Concurrent Execution using Shared Resource with Improper Synchronization

OWASP:
A04:2021 - Insecure Design

Scenario:
Normal: satu transfer dalam batas saldo berhasil, dan satu transfer melebihi saldo ditolak dengan pesan dana tidak cukup, membuktikan kontrol bekerja saat serial. Eksploitasi: sepuluh transfer senilai 900 dikirim paralel dari saldo yang jauh lebih kecil. Dampak: saldo pengirim menjadi negatif, total dana yang berpindah melampaui saldo yang pernah dimiliki.

Endpoint:
POST http://127.0.0.1:5001/transfer

Affected Feature:
Transfer dana antar rekening

Remediation:
- Jalankan pemeriksaan saldo dan pendebetan dalam satu transaksi database atomik.
- Kunci baris rekening pengirim (SELECT ... FOR UPDATE) atau gunakan pembaruan kondisional UPDATE ... SET balance = balance - x WHERE balance >= x.
- Tambahkan constraint CHECK (balance >= 0) pada kolom saldo sebagai jaring pengaman.
- Terapkan idempotency key dan rate limiting pada endpoint transfer.

POC:
1) (Screenshot 1) NORMAL: transfer 100 dalam batas saldo -> berhasil.
2) (Screenshot 2) NORMAL: transfer 5000 melebihi saldo -> ditolak, kontrol saldo bekerja secara serial.
3) (Screenshot 3) BASELINE: saldo penyerang sebelum serangan = 900.0.
4) (Screenshot 4) EKSPLOITASI: sepuluh transfer senilai 900 dikirim bersamaan -> seluruhnya dilaporkan sukses.
5) (Screenshot 5) DAMPAK CIA: saldo penyerang menjadi -8100.0, bernilai negatif dan melampaui dana yang pernah dimiliki.

12 / 26FAIL

Security Misconfiguration - CORS - Wildcard Origin

1 tangkapan layar · 1 rekaman HTTP

Kerentanan

[FAIL] Security Misconfiguration - CORS - Wildcard Origin

Deskripsi

Aplikasi mengirim header Access-Control-Allow-Origin dengan nilai wildcard (*) pada seluruh respons, termasuk respons endpoint yang mengembalikan data sensitif. Kebijakan ini menghapus perlindungan same-origin untuk pembacaan respons oleh skrip lintas origin.

Dampak

Low: situs mana pun dapat membaca respons endpoint yang tidak memerlukan autentikasi langsung dari browser pengunjung, termasuk /debug/users yang memuat kredensial. Dampaknya dibatasi oleh fakta bahwa nilai wildcard tidak dapat dikombinasikan dengan kredensial, sehingga cookie sesi tidak ikut terkirim pada permintaan lintas origin. Catatan pengujian yang jujur: pembacaan lintas origin terhadap data milik pengguna yang sedang login TIDAK berhasil dibuktikan, karena aplikasi mengirim token melalui header Authorization yang tidak dapat diakses situs penyerang. Temuan ini dilaporkan sebagai kelemahan konfigurasi yang memperlemah pertahanan berlapis, bukan sebagai pencurian data terautentikasi.

CWE

CWE-942: Permissive Cross-domain Policy with Untrusted Domains

OWASP

A05:2021 - Security Misconfiguration

Skenario

Eksploitasi: permintaan dikirim dengan header Origin milik domain penyerang (https://evil.example.com) -> respons mengembalikan Access-Control-Allow-Origin: * sehingga skrip pada origin mana pun diizinkan membaca isi respons.

Endpoint

Seluruh endpoint http://127.0.0.1:5001/ (header dikirim secara global)

Fitur terdampak

Kebijakan CORS tingkat aplikasi

Rekomendasi perbaikan

- Ganti wildcard dengan allow-list origin yang memang dipercaya. - Jangan kirim header CORS pada endpoint yang tidak dimaksudkan untuk diakses lintas origin. - Tetapkan Vary: Origin dan jangan pernah memantulkan header Origin secara buta. - Tinjau ulang endpoint yang mengembalikan data sensitif tanpa autentikasi.

Bukti konsep

1) (Screenshot 1) EKSPLOITASI: permintaan dengan Origin https://evil.example.com ke /debug/users -> respons mengembalikan Access-Control-Allow-Origin: * , mengizinkan origin mana pun membaca isi respons.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Security Misconfiguration - CORS - Wildcard Origin

Description:
Aplikasi mengirim header Access-Control-Allow-Origin dengan nilai wildcard (*) pada seluruh respons, termasuk respons endpoint yang mengembalikan data sensitif. Kebijakan ini menghapus perlindungan same-origin untuk pembacaan respons oleh skrip lintas origin.

Impact:
Low: situs mana pun dapat membaca respons endpoint yang tidak memerlukan autentikasi langsung dari browser pengunjung, termasuk /debug/users yang memuat kredensial. Dampaknya dibatasi oleh fakta bahwa nilai wildcard tidak dapat dikombinasikan dengan kredensial, sehingga cookie sesi tidak ikut terkirim pada permintaan lintas origin.

Catatan pengujian yang jujur: pembacaan lintas origin terhadap data milik pengguna yang sedang login TIDAK berhasil dibuktikan, karena aplikasi mengirim token melalui header Authorization yang tidak dapat diakses situs penyerang. Temuan ini dilaporkan sebagai kelemahan konfigurasi yang memperlemah pertahanan berlapis, bukan sebagai pencurian data terautentikasi.

CWE:
CWE-942: Permissive Cross-domain Policy with Untrusted Domains

OWASP:
A05:2021 - Security Misconfiguration

Scenario:
Eksploitasi: permintaan dikirim dengan header Origin milik domain penyerang (https://evil.example.com) -> respons mengembalikan Access-Control-Allow-Origin: * sehingga skrip pada origin mana pun diizinkan membaca isi respons.

Endpoint:
Seluruh endpoint http://127.0.0.1:5001/ (header dikirim secara global)

Affected Feature:
Kebijakan CORS tingkat aplikasi

Remediation:
- Ganti wildcard dengan allow-list origin yang memang dipercaya.
- Jangan kirim header CORS pada endpoint yang tidak dimaksudkan untuk diakses lintas origin.
- Tetapkan Vary: Origin dan jangan pernah memantulkan header Origin secara buta.
- Tinjau ulang endpoint yang mengembalikan data sensitif tanpa autentikasi.

POC:
1) (Screenshot 1) EKSPLOITASI: permintaan dengan Origin https://evil.example.com ke /debug/users -> respons mengembalikan Access-Control-Allow-Origin: * , mengizinkan origin mana pun membaca isi respons.

13 / 26FAIL

Sensitive Data Exposure - Debug Endpoint - User Credentials

3 tangkapan layar · 3 rekaman HTTP

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.

14 / 26FAIL

Sensitive Data Exposure - Web Root - Environment Files

2 tangkapan layar · 2 rekaman HTTP

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

1) (Screenshot 1) EKSPLOITASI: GET /.env tanpa autentikasi -> HTTP 200, SECRET_KEY, JWT_SECRET, dan kredensial database terekspos. 2) (Screenshot 2) DAMPAK CIA: GET /.env.bak -> HTTP 200, salinan cadangan konfigurasi juga dapat diunduh publik.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Sensitive Data Exposure - Web Root - Environment Files

Description:
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.

Impact:
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

Scenario:
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

Affected Feature:
Penyajian berkas statis dari web root

Remediation:
- 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.

POC:
1) (Screenshot 1) EKSPLOITASI: GET /.env tanpa autentikasi -> HTTP 200, SECRET_KEY, JWT_SECRET, dan kredensial database terekspos.
2) (Screenshot 2) DAMPAK CIA: GET /.env.bak -> HTTP 200, salinan cadangan konfigurasi juga dapat diunduh publik.

15 / 26FAIL

Server-Side Request Forgery - Profile Picture - Import By URL

6 tangkapan layar · 6 rekaman HTTP

Kerentanan

[FAIL] Server-Side Request Forgery - Profile Picture - Import By URL

Deskripsi

Endpoint /upload_profile_picture_url menerima URL penuh dari klien dan melakukan requests.get server-side tanpa allow-list skema maupun host, mengikuti redirect, dan tanpa validasi content-type. Isi respons upstream disimpan apa adanya ke static/uploads/ yang dapat diakses publik, sehingga hasil permintaan internal dapat diunduh kembali oleh penyerang.

Dampak

Confidentiality (High): penyerang terautentikasi dapat memaksa server membaca endpoint internal yang menolak akses langsung, lalu mengeksfiltrasinya melalui direktori upload publik. Pada pengujian hal ini membocorkan jwt_secret dan app_secret_key aplikasi, kredensial database, serta kredensial sementara IAM cloud (AccessKeyId, SecretAccessKey, session token). Bocornya jwt_secret memungkinkan pemalsuan token administrator yang bertanda tangan sah, sehingga berujung pada kompromi penuh.

CWE

CWE-918: Server-Side Request Forgery (SSRF)

OWASP

A10:2021 - Server-Side Request Forgery (SSRF)

Skenario

Normal: image_url menunjuk gambar profil yang wajar dan diimpor server. Kontrol: /internal/secret diakses langsung dari luar -> HTTP 403 Forbidden. Eksploitasi: image_url diarahkan ke http://127.0.0.1:5000/internal/secret -> server mengambilnya dengan HTTP 200 dan menyimpannya di static/uploads. Eksfiltrasi: berkas hasil unduhan diambil lewat HTTP biasa, membocorkan rahasia aplikasi. Chain: teknik yang sama diarahkan ke endpoint metadata IAM untuk memanen kredensial cloud.

Endpoint

POST http://127.0.0.1:5001/upload_profile_picture_url

Fitur terdampak

Impor foto profil melalui URL

Rekomendasi perbaikan

- Terapkan allow-list host dan skema; tolak URL ke loopback, RFC1918, link-local (169.254.0.0/16) dan nama service internal. - Resolusikan DNS lalu validasi IP hasil resolusi sebelum melakukan permintaan, dan ulangi validasi pada setiap redirect (atau matikan redirect). - Validasi content-type dan ukuran; hanya terima gambar. - Simpan hasil unduhan di luar web root, beri nama acak, dan sajikan melalui handler terotorisasi, bukan sebagai berkas statis publik. - Jangan pantulkan status dan metadata permintaan upstream ke klien.

Bukti konsep

1) (Screenshot 1) NORMAL: image_url menunjuk gambar profil sah -> impor berhasil. 2) (Screenshot 2) KONTROL: akses langsung ke /internal/secret dari luar -> HTTP 403 Forbidden. 3) (Screenshot 3) EKSPLOITASI: image_url diarahkan ke /internal/secret -> server mengambilnya, http_status 200, berkas tersimpan di static/uploads. 4) (Screenshot 4) EKSFILTRASI: berkas hasil SSRF diunduh -> jwt_secret, app_secret_key, dan kredensial database terekspos. 5) (Screenshot 5) CHAIN: image_url diarahkan ke endpoint metadata IAM -> diambil server dengan http_status 200. 6) (Screenshot 6) DAMPAK CIA: berkas kredensial IAM diunduh -> AccessKeyId, SecretAccessKey, dan session token terekspos.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Server-Side Request Forgery - Profile Picture - Import By URL

Description:
Endpoint /upload_profile_picture_url menerima URL penuh dari klien dan melakukan requests.get server-side tanpa allow-list skema maupun host, mengikuti redirect, dan tanpa validasi content-type. Isi respons upstream disimpan apa adanya ke static/uploads/ yang dapat diakses publik, sehingga hasil permintaan internal dapat diunduh kembali oleh penyerang.

Impact:
Confidentiality (High): penyerang terautentikasi dapat memaksa server membaca endpoint internal yang menolak akses langsung, lalu mengeksfiltrasinya melalui direktori upload publik. Pada pengujian hal ini membocorkan jwt_secret dan app_secret_key aplikasi, kredensial database, serta kredensial sementara IAM cloud (AccessKeyId, SecretAccessKey, session token). Bocornya jwt_secret memungkinkan pemalsuan token administrator yang bertanda tangan sah, sehingga berujung pada kompromi penuh.

CWE:
CWE-918: Server-Side Request Forgery (SSRF)

OWASP:
A10:2021 - Server-Side Request Forgery (SSRF)

Scenario:
Normal: image_url menunjuk gambar profil yang wajar dan diimpor server. Kontrol: /internal/secret diakses langsung dari luar -> HTTP 403 Forbidden. Eksploitasi: image_url diarahkan ke http://127.0.0.1:5000/internal/secret -> server mengambilnya dengan HTTP 200 dan menyimpannya di static/uploads. Eksfiltrasi: berkas hasil unduhan diambil lewat HTTP biasa, membocorkan rahasia aplikasi. Chain: teknik yang sama diarahkan ke endpoint metadata IAM untuk memanen kredensial cloud.

Endpoint:
POST http://127.0.0.1:5001/upload_profile_picture_url

Affected Feature:
Impor foto profil melalui URL

Remediation:
- Terapkan allow-list host dan skema; tolak URL ke loopback, RFC1918, link-local (169.254.0.0/16) dan nama service internal.
- Resolusikan DNS lalu validasi IP hasil resolusi sebelum melakukan permintaan, dan ulangi validasi pada setiap redirect (atau matikan redirect).
- Validasi content-type dan ukuran; hanya terima gambar.
- Simpan hasil unduhan di luar web root, beri nama acak, dan sajikan melalui handler terotorisasi, bukan sebagai berkas statis publik.
- Jangan pantulkan status dan metadata permintaan upstream ke klien.

POC:
1) (Screenshot 1) NORMAL: image_url menunjuk gambar profil sah -> impor berhasil.
2) (Screenshot 2) KONTROL: akses langsung ke /internal/secret dari luar -> HTTP 403 Forbidden.
3) (Screenshot 3) EKSPLOITASI: image_url diarahkan ke /internal/secret -> server mengambilnya, http_status 200, berkas tersimpan di static/uploads.
4) (Screenshot 4) EKSFILTRASI: berkas hasil SSRF diunduh -> jwt_secret, app_secret_key, dan kredensial database terekspos.
5) (Screenshot 5) CHAIN: image_url diarahkan ke endpoint metadata IAM -> diambil server dengan http_status 200.
6) (Screenshot 6) DAMPAK CIA: berkas kredensial IAM diunduh -> AccessKeyId, SecretAccessKey, dan session token terekspos.

16 / 26FAIL

SQL Injection - Authentication - Login Bypass

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] SQL Injection - Authentication - Login Bypass

Deskripsi

Endpoint /login membangun query SQL dengan f-string yang menyisipkan username dan password mentah tanpa parameterisasi: SELECT * FROM users WHERE username='{username}' AND password='{password}'. Penyerang menutup literal string lalu mengomentari sisa query sehingga pemeriksaan password dilewati sepenuhnya.

Dampak

Confidentiality + Integrity (Critical): autentikasi dapat dilewati tanpa mengetahui password. Payload admin' -- memberikan sesi administrator penuh beserta JWT dengan klaim is_admin true, yang membuka panel admin dan seluruh fungsi administratif (hapus akun, buat admin baru, setujui pinjaman).

CWE

CWE-89: Improper Neutralization of Special Elements used in an SQL Command

OWASP

A03:2021 - Injection

Skenario

Normal: login dengan kredensial sah milik sendiri menghasilkan token non-admin. Eksploitasi: username diisi admin' -- dengan password sembarang -> query menjadi SELECT * FROM users WHERE username='admin' -- ' AND password='anything' sehingga kondisi password terpotong menjadi komentar. Dampak: token admin dipakai membuka panel administrasi.

Endpoint

POST http://127.0.0.1:5001/login

Fitur terdampak

Autentikasi pengguna (form login web dan API login)

Rekomendasi perbaikan

- Gunakan parameterized query / prepared statement untuk seluruh akses database; jangan pernah merangkai SQL dengan f-string atau konkatenasi. - Simpan password sebagai hash ber-salt (bcrypt/argon2) dan bandingkan hash, bukan mencocokkan password di dalam klausa WHERE. - Terapkan allow-list karakter pada input username. - Jangan kembalikan detail query atau objek user mentah pada respons.

Bukti konsep

1) (Screenshot 1) NORMAL: login dengan kredensial sah pentest_attacker -> token non-admin, is_admin false. 2) (Screenshot 2) EKSPLOITASI: username admin' -- dengan password anything -> login sukses sebagai admin, is_admin true. 3) (Screenshot 3) DAMPAK CIA: token hasil injeksi dipakai mengakses /sup3r_s3cr3t_admin -> HTTP 200, panel administrasi terbuka.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] SQL Injection - Authentication - Login Bypass

Description:
Endpoint /login membangun query SQL dengan f-string yang menyisipkan username dan password mentah tanpa parameterisasi: SELECT * FROM users WHERE username='{username}' AND password='{password}'. Penyerang menutup literal string lalu mengomentari sisa query sehingga pemeriksaan password dilewati sepenuhnya.

Impact:
Confidentiality + Integrity (Critical): autentikasi dapat dilewati tanpa mengetahui password. Payload admin' --  memberikan sesi administrator penuh beserta JWT dengan klaim is_admin true, yang membuka panel admin dan seluruh fungsi administratif (hapus akun, buat admin baru, setujui pinjaman).

CWE:
CWE-89: Improper Neutralization of Special Elements used in an SQL Command

OWASP:
A03:2021 - Injection

Scenario:
Normal: login dengan kredensial sah milik sendiri menghasilkan token non-admin. Eksploitasi: username diisi admin' --  dengan password sembarang -> query menjadi SELECT * FROM users WHERE username='admin' -- ' AND password='anything' sehingga kondisi password terpotong menjadi komentar. Dampak: token admin dipakai membuka panel administrasi.

Endpoint:
POST http://127.0.0.1:5001/login

Affected Feature:
Autentikasi pengguna (form login web dan API login)

Remediation:
- Gunakan parameterized query / prepared statement untuk seluruh akses database; jangan pernah merangkai SQL dengan f-string atau konkatenasi.
- Simpan password sebagai hash ber-salt (bcrypt/argon2) dan bandingkan hash, bukan mencocokkan password di dalam klausa WHERE.
- Terapkan allow-list karakter pada input username.
- Jangan kembalikan detail query atau objek user mentah pada respons.

POC:
1) (Screenshot 1) NORMAL: login dengan kredensial sah pentest_attacker -> token non-admin, is_admin false.
2) (Screenshot 2) EKSPLOITASI: username admin' --  dengan password anything -> login sukses sebagai admin, is_admin true.
3) (Screenshot 3) DAMPAK CIA: token hasil injeksi dipakai mengakses /sup3r_s3cr3t_admin -> HTTP 200, panel administrasi terbuka.

17 / 26FAIL

SQL Injection - GraphQL - Transaction Summary Resolver

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] SQL Injection - GraphQL - Transaction Summary Resolver

Deskripsi

Resolver transactionSummary meneruskan argumen accountNumber ke fungsi _load_actor_by_account_number yang membangun query dengan f-string: SELECT id, username, account_number, is_admin FROM users WHERE account_number = '{account_number}'. Bagi pemanggil dengan peran administrator, nilai argumen tidak dibatasi sama sekali sehingga dapat menyisipkan sintaks SQL.

Dampak

Confidentiality (High): injeksi SQL pada lapisan GraphQL memungkinkan pengambilan baris tabel users di luar rekening yang diminta. Karena peran administrator pada aplikasi ini dapat diperoleh melalui beberapa jalur yang telah dibuktikan terpisah (injeksi SQL pada login, mass assignment saat pendaftaran, dan pemalsuan JWT), prasyarat administrator bukan penghalang nyata bagi penyerang.

CWE

CWE-89: Improper Neutralization of Special Elements used in an SQL Command

OWASP

A03:2021 - Injection

Skenario

Normal: accountNumber berisi rekening yang sah -> ringkasan transaksi rekening tersebut dikembalikan. Kontrol: accountNumber berisi rekening yang tidak ada (NOPE000000) -> galat Account not found. Eksploitasi: nilai yang sama ditambah sintaks injeksi NOPE000000' OR '1'='1 -> kondisi WHERE selalu benar, baris pertama tabel users dikembalikan meski rekening tersebut tidak ada.

Endpoint

POST http://127.0.0.1:5001/graphql

Fitur terdampak

GraphQL transactionSummary (ringkasan transaksi)

Rekomendasi perbaikan

- Gunakan parameterized query pada seluruh resolver; hapus perangkaian string SQL. - Validasi format accountNumber dengan allow-list karakter sebelum menyentuh database. - Terapkan prinsip hak akses minimal pada akun database yang dipakai aplikasi. - Jangan mengandalkan peran pemanggil sebagai pengganti sanitasi input.

Bukti konsep

1) (Screenshot 1) NORMAL: accountNumber ADMIN001 -> ringkasan transaksi dikembalikan secara wajar. 2) (Screenshot 2) KONTROL: accountNumber NOPE000000 yang tidak ada -> galat Account not found. 3) (Screenshot 3) DAMPAK CIA: accountNumber NOPE000000' OR '1'='1 -> query dimanipulasi sehingga mengembalikan baris ADMIN001 meski rekening yang diminta tidak ada, membuktikan eksekusi SQL yang disisipkan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] SQL Injection - GraphQL - Transaction Summary Resolver

Description:
Resolver transactionSummary meneruskan argumen accountNumber ke fungsi _load_actor_by_account_number yang membangun query dengan f-string: SELECT id, username, account_number, is_admin FROM users WHERE account_number = '{account_number}'. Bagi pemanggil dengan peran administrator, nilai argumen tidak dibatasi sama sekali sehingga dapat menyisipkan sintaks SQL.

Impact:
Confidentiality (High): injeksi SQL pada lapisan GraphQL memungkinkan pengambilan baris tabel users di luar rekening yang diminta. Karena peran administrator pada aplikasi ini dapat diperoleh melalui beberapa jalur yang telah dibuktikan terpisah (injeksi SQL pada login, mass assignment saat pendaftaran, dan pemalsuan JWT), prasyarat administrator bukan penghalang nyata bagi penyerang.

CWE:
CWE-89: Improper Neutralization of Special Elements used in an SQL Command

OWASP:
A03:2021 - Injection

Scenario:
Normal: accountNumber berisi rekening yang sah -> ringkasan transaksi rekening tersebut dikembalikan. Kontrol: accountNumber berisi rekening yang tidak ada (NOPE000000) -> galat Account not found. Eksploitasi: nilai yang sama ditambah sintaks injeksi NOPE000000' OR '1'='1 -> kondisi WHERE selalu benar, baris pertama tabel users dikembalikan meski rekening tersebut tidak ada.

Endpoint:
POST http://127.0.0.1:5001/graphql

Affected Feature:
GraphQL transactionSummary (ringkasan transaksi)

Remediation:
- Gunakan parameterized query pada seluruh resolver; hapus perangkaian string SQL.
- Validasi format accountNumber dengan allow-list karakter sebelum menyentuh database.
- Terapkan prinsip hak akses minimal pada akun database yang dipakai aplikasi.
- Jangan mengandalkan peran pemanggil sebagai pengganti sanitasi input.

POC:
1) (Screenshot 1) NORMAL: accountNumber ADMIN001 -> ringkasan transaksi dikembalikan secara wajar.
2) (Screenshot 2) KONTROL: accountNumber NOPE000000 yang tidak ada -> galat Account not found.
3) (Screenshot 3) DAMPAK CIA: accountNumber NOPE000000' OR '1'='1 -> query dimanipulasi sehingga mengembalikan baris ADMIN001 meski rekening yang diminta tidak ada, membuktikan eksekusi SQL yang disisipkan.

18 / 26FAIL

Stored Cross-Site Scripting - User Profile - Bio Field

5 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] Stored Cross-Site Scripting - User Profile - Bio Field

Deskripsi

Endpoint /update_bio menyimpan isi bio tanpa sanitasi apa pun. Panel administrasi kemudian menyisipkan nilai tersebut ke dalam DOM melalui innerHTML pada template literal tanpa escaping (templates/admin.html), sementara field lain di modal yang sama seperti id dan account_number justru melewati fungsi escapeHtml. Akibatnya markup yang dikirim pengguna biasa dieksekusi sebagai HTML di dalam sesi administrator.

Dampak

Confidentiality + Integrity (Critical): pengguna dengan hak paling rendah dapat menanam skrip yang berjalan di browser administrator tanpa interaksi apa pun selain membuka detail pengguna, yang merupakan tugas rutin admin. Karena token sesi disimpan di localStorage dan dapat dibaca JavaScript, payload berhasil mengambil JWT administrator secara utuh. Token tersebut memberi penyerang kendali penuh atas panel administrasi, termasuk menghapus akun, membuat administrator baru, dan menyetujui pinjaman.

CWE

CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)

OWASP

A03:2021 - Injection

Skenario

Normal: bio diisi teks biasa dan tampil sebagai teks pada modal detail pengguna di panel admin. Eksploitasi: penyerang mengisi bio dengan tag img beserta handler onerror. Payload tersimpan mentah dan dikembalikan apa adanya oleh /api/v3/user/2. Dampak: administrator membuka modal detail pengguna tersebut, payload dieksekusi di dalam sesi administrator dan membaca JWT administrator dari localStorage.

Endpoint

POST http://127.0.0.1:5001/update_bio GET http://127.0.0.1:5001/api/v3/user/<user_id> Sink: http://127.0.0.1:5001/sup3r_s3cr3t_admin (modal detail pengguna)

Fitur terdampak

Bio profil pengguna dan modal detail pengguna pada panel administrasi

Rekomendasi perbaikan

- Render nilai yang berasal dari pengguna sebagai teks (textContent), bukan innerHTML; terapkan escapeHtml pada field bio sebagaimana sudah dilakukan pada field lain di modal yang sama. - Sanitasi bio di sisi server dengan pustaka allow-list saat disimpan dan saat dikembalikan API. - Terapkan Content-Security-Policy yang melarang inline script dan handler event. - Simpan token sesi pada cookie HttpOnly dan SameSite, bukan localStorage, agar tidak terjangkau JavaScript.

Bukti konsep

1) (Screenshot 1) NORMAL: bio diisi teks biasa melalui /update_bio -> tersimpan. 2) (Screenshot 2) EKSPLOITASI: bio diisi tag img dengan handler onerror -> diterima tanpa sanitasi. 3) (Screenshot 3) SINK: /api/v3/user/2 mengembalikan payload mentah apa adanya, inilah data yang dikonsumsi panel admin. 4) (Screenshot 4) NORMAL UI: administrator membuka modal detail pengguna saat bio berisi teks biasa -> tampil sebagai teks. 5) (Screenshot 5) DAMPAK CIA: administrator membuka modal detail pengguna yang sama setelah payload ditanam -> skrip dieksekusi di dalam sesi administrator dan menampilkan JWT administrator yang berhasil dicuri secara utuh.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Stored Cross-Site Scripting - User Profile - Bio Field

Description:
Endpoint /update_bio menyimpan isi bio tanpa sanitasi apa pun. Panel administrasi kemudian menyisipkan nilai tersebut ke dalam DOM melalui innerHTML pada template literal tanpa escaping (templates/admin.html), sementara field lain di modal yang sama seperti id dan account_number justru melewati fungsi escapeHtml. Akibatnya markup yang dikirim pengguna biasa dieksekusi sebagai HTML di dalam sesi administrator.

Impact:
Confidentiality + Integrity (Critical): pengguna dengan hak paling rendah dapat menanam skrip yang berjalan di browser administrator tanpa interaksi apa pun selain membuka detail pengguna, yang merupakan tugas rutin admin. Karena token sesi disimpan di localStorage dan dapat dibaca JavaScript, payload berhasil mengambil JWT administrator secara utuh. Token tersebut memberi penyerang kendali penuh atas panel administrasi, termasuk menghapus akun, membuat administrator baru, dan menyetujui pinjaman.

CWE:
CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)

OWASP:
A03:2021 - Injection

Scenario:
Normal: bio diisi teks biasa dan tampil sebagai teks pada modal detail pengguna di panel admin. Eksploitasi: penyerang mengisi bio dengan tag img beserta handler onerror. Payload tersimpan mentah dan dikembalikan apa adanya oleh /api/v3/user/2. Dampak: administrator membuka modal detail pengguna tersebut, payload dieksekusi di dalam sesi administrator dan membaca JWT administrator dari localStorage.

Endpoint:
POST http://127.0.0.1:5001/update_bio
GET  http://127.0.0.1:5001/api/v3/user/<user_id>
Sink: http://127.0.0.1:5001/sup3r_s3cr3t_admin (modal detail pengguna)

Affected Feature:
Bio profil pengguna dan modal detail pengguna pada panel administrasi

Remediation:
- Render nilai yang berasal dari pengguna sebagai teks (textContent), bukan innerHTML; terapkan escapeHtml pada field bio sebagaimana sudah dilakukan pada field lain di modal yang sama.
- Sanitasi bio di sisi server dengan pustaka allow-list saat disimpan dan saat dikembalikan API.
- Terapkan Content-Security-Policy yang melarang inline script dan handler event.
- Simpan token sesi pada cookie HttpOnly dan SameSite, bukan localStorage, agar tidak terjangkau JavaScript.

POC:
1) (Screenshot 1) NORMAL: bio diisi teks biasa melalui /update_bio -> tersimpan.
2) (Screenshot 2) EKSPLOITASI: bio diisi tag img dengan handler onerror -> diterima tanpa sanitasi.
3) (Screenshot 3) SINK: /api/v3/user/2 mengembalikan payload mentah apa adanya, inilah data yang dikonsumsi panel admin.
4) (Screenshot 4) NORMAL UI: administrator membuka modal detail pengguna saat bio berisi teks biasa -> tampil sebagai teks.
5) (Screenshot 5) DAMPAK CIA: administrator membuka modal detail pengguna yang sama setelah payload ditanam -> skrip dieksekusi di dalam sesi administrator dan menampilkan JWT administrator yang berhasil dicuri secara utuh.

19 / 26FAIL

Unrestricted File Upload - Profile Picture - File Type Validation

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[FAIL] Unrestricted File Upload - Profile Picture - File Type Validation

Deskripsi

Endpoint /upload_profile_picture menyimpan berkas apa pun tanpa memvalidasi ekstensi, content-type, maupun magic bytes, dan tanpa batas ukuran. Berkas disimpan di static/uploads yang disajikan langsung oleh server, dan Flask menetapkan Content-Type berdasarkan ekstensi berkas.

Dampak

Confidentiality + Integrity (High): penyerang dapat mengunggah dokumen HTML berisi JavaScript dan mengaksesnya pada origin aplikasi dengan Content-Type text/html, sehingga skrip dieksekusi sebagai bagian dari situs. Ini memberi penyerang XSS tersimpan pada origin aplikasi, yang dapat dipakai mencuri token sesi korban yang membuka tautan tersebut, sekaligus menjadikan domain bank sebagai inang halaman phishing.

CWE

CWE-434: Unrestricted Upload of File with Dangerous Type

OWASP

A04:2021 - Insecure Design

Skenario

Normal: berkas gambar PNG diunggah sebagai foto profil -> wajar dan diterima. Eksploitasi: berkas payload.html berisi tag script diunggah melalui endpoint yang sama -> diterima tanpa penolakan. Dampak: berkas diakses kembali melalui HTTP dan disajikan dengan Content-Type text/html berisi skrip utuh, sehingga dieksekusi di origin aplikasi.

Endpoint

POST http://127.0.0.1:5001/upload_profile_picture

Fitur terdampak

Unggah foto profil

Rekomendasi perbaikan

- Terapkan allow-list ekstensi dan verifikasi magic bytes; tolak apa pun selain format gambar yang diizinkan, dan lakukan re-encode gambar. - Simpan berkas unggahan di luar web root dan sajikan melalui handler yang menetapkan Content-Type aman serta Content-Disposition attachment. - Sajikan konten pengguna dari domain terpisah tanpa cookie sesi. - Terapkan batas ukuran berkas dan beri nama acak sepenuhnya.

Bukti konsep

1) (Screenshot 1) NORMAL: unggah berkas gambar PNG sebagai foto profil -> diterima. 2) (Screenshot 2) EKSPLOITASI: unggah payload.html berisi tag script melalui endpoint yang sama -> diterima tanpa validasi tipe. 3) (Screenshot 3) DAMPAK CIA: berkas diakses via HTTP -> disajikan dengan Content-Type text/html berisi skrip utuh, dieksekusi pada origin aplikasi.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Unrestricted File Upload - Profile Picture - File Type Validation

Description:
Endpoint /upload_profile_picture menyimpan berkas apa pun tanpa memvalidasi ekstensi, content-type, maupun magic bytes, dan tanpa batas ukuran. Berkas disimpan di static/uploads yang disajikan langsung oleh server, dan Flask menetapkan Content-Type berdasarkan ekstensi berkas.

Impact:
Confidentiality + Integrity (High): penyerang dapat mengunggah dokumen HTML berisi JavaScript dan mengaksesnya pada origin aplikasi dengan Content-Type text/html, sehingga skrip dieksekusi sebagai bagian dari situs. Ini memberi penyerang XSS tersimpan pada origin aplikasi, yang dapat dipakai mencuri token sesi korban yang membuka tautan tersebut, sekaligus menjadikan domain bank sebagai inang halaman phishing.

CWE:
CWE-434: Unrestricted Upload of File with Dangerous Type

OWASP:
A04:2021 - Insecure Design

Scenario:
Normal: berkas gambar PNG diunggah sebagai foto profil -> wajar dan diterima. Eksploitasi: berkas payload.html berisi tag script diunggah melalui endpoint yang sama -> diterima tanpa penolakan. Dampak: berkas diakses kembali melalui HTTP dan disajikan dengan Content-Type text/html berisi skrip utuh, sehingga dieksekusi di origin aplikasi.

Endpoint:
POST http://127.0.0.1:5001/upload_profile_picture

Affected Feature:
Unggah foto profil

Remediation:
- Terapkan allow-list ekstensi dan verifikasi magic bytes; tolak apa pun selain format gambar yang diizinkan, dan lakukan re-encode gambar.
- Simpan berkas unggahan di luar web root dan sajikan melalui handler yang menetapkan Content-Type aman serta Content-Disposition attachment.
- Sajikan konten pengguna dari domain terpisah tanpa cookie sesi.
- Terapkan batas ukuran berkas dan beri nama acak sepenuhnya.

POC:
1) (Screenshot 1) NORMAL: unggah berkas gambar PNG sebagai foto profil -> diterima.
2) (Screenshot 2) EKSPLOITASI: unggah payload.html berisi tag script melalui endpoint yang sama -> diterima tanpa validasi tipe.
3) (Screenshot 3) DAMPAK CIA: berkas diakses via HTTP -> disajikan dengan Content-Type text/html berisi skrip utuh, dieksekusi pada origin aplikasi.

20 / 26FAIL

Unrestricted Resource Consumption - Authentication - Login Rate Limiting

3 tangkapan layar · 2 rekaman HTTP · 1 catatan proses

Kerentanan

[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting

Deskripsi

Endpoint /login tidak menerapkan rate limiting, penguncian akun, perlambatan progresif, maupun CAPTCHA. Percobaan login yang gagal secara beruntun seluruhnya dilayani dengan kecepatan penuh. Respons gagal juga membedakan kondisi sehingga memudahkan enumerasi username.

Dampak

Confidentiality (Medium): penyerang dapat melakukan brute force dan credential stuffing terhadap akun mana pun, termasuk administrator, tanpa hambatan. Lima puluh percobaan berturut-turut terhadap akun admin tidak memicu penguncian maupun perlambatan, dan setelah seluruh percobaan gagal tersebut login dengan kredensial yang benar tetap diterima, membuktikan tidak ada mekanisme penguncian sama sekali.

CWE

CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Normal: satu percobaan login dengan password salah ditolak dengan HTTP 401. Eksploitasi: lima puluh percobaan berturut-turut terhadap akun admin dikirim tanpa jeda -> seluruhnya dilayani HTTP 401, tidak ada HTTP 429 maupun penguncian. Dampak: setelah 50 kegagalan, login dengan password yang benar tetap berhasil, menunjukkan akun tidak pernah terkunci sehingga brute force dapat dijalankan sampai tuntas.

Endpoint

POST http://127.0.0.1:5001/login

Fitur terdampak

Autentikasi pengguna

Rekomendasi perbaikan

- Terapkan rate limiting per akun dan per IP dengan perlambatan progresif. - Kunci akun sementara atau wajibkan CAPTCHA setelah sejumlah kegagalan berturut-turut. - Seragamkan pesan galat agar tidak membocorkan keberadaan username. - Catat dan beri peringatan atas lonjakan kegagalan autentikasi, serta terapkan MFA.

Bukti konsep

1) (Screenshot 1) NORMAL: satu percobaan login dengan password salah -> HTTP 401 Invalid credentials. 2) (Screenshot 2) EKSPLOITASI: 50 percobaan gagal berturut-turut terhadap akun admin -> seluruhnya HTTP 401, tidak ada HTTP 429 maupun penguncian. 3) (Screenshot 3) DAMPAK CIA: setelah 50 kegagalan, login dengan password yang benar tetap diterima -> akun tidak pernah terkunci, brute force dapat dijalankan hingga berhasil.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting

Description:
Endpoint /login tidak menerapkan rate limiting, penguncian akun, perlambatan progresif, maupun CAPTCHA. Percobaan login yang gagal secara beruntun seluruhnya dilayani dengan kecepatan penuh. Respons gagal juga membedakan kondisi sehingga memudahkan enumerasi username.

Impact:
Confidentiality (Medium): penyerang dapat melakukan brute force dan credential stuffing terhadap akun mana pun, termasuk administrator, tanpa hambatan. Lima puluh percobaan berturut-turut terhadap akun admin tidak memicu penguncian maupun perlambatan, dan setelah seluruh percobaan gagal tersebut login dengan kredensial yang benar tetap diterima, membuktikan tidak ada mekanisme penguncian sama sekali.

CWE:
CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Normal: satu percobaan login dengan password salah ditolak dengan HTTP 401. Eksploitasi: lima puluh percobaan berturut-turut terhadap akun admin dikirim tanpa jeda -> seluruhnya dilayani HTTP 401, tidak ada HTTP 429 maupun penguncian. Dampak: setelah 50 kegagalan, login dengan password yang benar tetap berhasil, menunjukkan akun tidak pernah terkunci sehingga brute force dapat dijalankan sampai tuntas.

Endpoint:
POST http://127.0.0.1:5001/login

Affected Feature:
Autentikasi pengguna

Remediation:
- Terapkan rate limiting per akun dan per IP dengan perlambatan progresif.
- Kunci akun sementara atau wajibkan CAPTCHA setelah sejumlah kegagalan berturut-turut.
- Seragamkan pesan galat agar tidak membocorkan keberadaan username.
- Catat dan beri peringatan atas lonjakan kegagalan autentikasi, serta terapkan MFA.

POC:
1) (Screenshot 1) NORMAL: satu percobaan login dengan password salah -> HTTP 401 Invalid credentials.
2) (Screenshot 2) EKSPLOITASI: 50 percobaan gagal berturut-turut terhadap akun admin -> seluruhnya HTTP 401, tidak ada HTTP 429 maupun penguncian.
3) (Screenshot 3) DAMPAK CIA: setelah 50 kegagalan, login dengan password yang benar tetap diterima -> akun tidak pernah terkunci, brute force dapat dijalankan hingga berhasil.

21 / 26FAIL

Unrestricted Resource Consumption - Password Reset - PIN Rate Limiting

5 tangkapan layar · 4 rekaman HTTP · 1 catatan proses

Kerentanan

[FAIL] Unrestricted Resource Consumption - Password Reset - PIN Rate Limiting

Deskripsi

Endpoint reset password tidak menerapkan rate limiting, penguncian akun, maupun pembatasan jumlah percobaan PIN. PIN pemulihan hanya terdiri dari 3 digit sehingga ruang tebakan hanya 1000 kemungkinan dan dapat dihabiskan dalam hitungan detik.

Dampak

Confidentiality + Integrity (High): pengambilalihan akun tanpa perlu membocorkan PIN terlebih dahulu. Penyerang yang hanya mengetahui username dapat memicu permintaan reset lalu menebak seluruh ruang PIN. Pada pengujian, PIN korban ditemukan pada percobaan ke-451 dan password korban berhasil diganti, dilanjutkan login sebagai korban. Serangan ini berlaku pada endpoint v2 dan v3 yang tidak membocorkan PIN, sehingga tetap efektif meski kebocoran PIN pada v1 diperbaiki.

CWE

CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Normal: permintaan reset diajukan melalui /api/v2/forgot-password, PIN tidak dibocorkan pada respons. Kontrol: satu PIN salah ditolak dengan pesan Invalid reset PIN. Eksploitasi: percobaan berturut-turut dikirim tanpa jeda dan seluruhnya dilayani dengan HTTP 400 tanpa satu pun HTTP 429, penguncian, atau perlambatan. Dampak: PIN yang benar ditemukan, password korban diganti, dan login sebagai korban berhasil.

Endpoint

POST http://127.0.0.1:5001/api/v2/forgot-password POST http://127.0.0.1:5001/api/v2/reset-password

Fitur terdampak

Pemulihan password (verifikasi PIN)

Rekomendasi perbaikan

- Terapkan rate limiting per akun dan per alamat IP, serta penguncian sementara setelah beberapa percobaan PIN yang gagal. - Ganti PIN 3 digit dengan token acak minimal 128 bit yang sekali pakai dan berumur pendek. - Batalkan token pemulihan setelah sejumlah kecil percobaan gagal dan haruskan permintaan reset baru. - Kirim notifikasi ke pemilik akun pada setiap permintaan dan keberhasilan reset.

Bukti konsep

1) (Screenshot 1) NORMAL: permintaan reset via /api/v2/forgot-password -> PIN tidak dibocorkan pada respons. 2) (Screenshot 2) KONTROL: satu PIN salah (000) -> ditolak dengan Invalid reset PIN. 3) (Screenshot 3) EKSPLOITASI: percobaan PIN berturut-turut tanpa jeda -> seluruhnya dilayani HTTP 400, tidak ada HTTP 429, penguncian, maupun perlambatan. 4) (Screenshot 4) EKSPLOITASI: PIN yang benar ditemukan pada percobaan ke-451 -> reset_success true, password korban diganti. 5) (Screenshot 5) DAMPAK CIA: login sebagai pentest_victim dengan password hasil brute force -> token terbit, akun korban diambil alih.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Unrestricted Resource Consumption - Password Reset - PIN Rate Limiting

Description:
Endpoint reset password tidak menerapkan rate limiting, penguncian akun, maupun pembatasan jumlah percobaan PIN. PIN pemulihan hanya terdiri dari 3 digit sehingga ruang tebakan hanya 1000 kemungkinan dan dapat dihabiskan dalam hitungan detik.

Impact:
Confidentiality + Integrity (High): pengambilalihan akun tanpa perlu membocorkan PIN terlebih dahulu. Penyerang yang hanya mengetahui username dapat memicu permintaan reset lalu menebak seluruh ruang PIN. Pada pengujian, PIN korban ditemukan pada percobaan ke-451 dan password korban berhasil diganti, dilanjutkan login sebagai korban. Serangan ini berlaku pada endpoint v2 dan v3 yang tidak membocorkan PIN, sehingga tetap efektif meski kebocoran PIN pada v1 diperbaiki.

CWE:
CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Normal: permintaan reset diajukan melalui /api/v2/forgot-password, PIN tidak dibocorkan pada respons. Kontrol: satu PIN salah ditolak dengan pesan Invalid reset PIN. Eksploitasi: percobaan berturut-turut dikirim tanpa jeda dan seluruhnya dilayani dengan HTTP 400 tanpa satu pun HTTP 429, penguncian, atau perlambatan. Dampak: PIN yang benar ditemukan, password korban diganti, dan login sebagai korban berhasil.

Endpoint:
POST http://127.0.0.1:5001/api/v2/forgot-password
POST http://127.0.0.1:5001/api/v2/reset-password

Affected Feature:
Pemulihan password (verifikasi PIN)

Remediation:
- Terapkan rate limiting per akun dan per alamat IP, serta penguncian sementara setelah beberapa percobaan PIN yang gagal.
- Ganti PIN 3 digit dengan token acak minimal 128 bit yang sekali pakai dan berumur pendek.
- Batalkan token pemulihan setelah sejumlah kecil percobaan gagal dan haruskan permintaan reset baru.
- Kirim notifikasi ke pemilik akun pada setiap permintaan dan keberhasilan reset.

POC:
1) (Screenshot 1) NORMAL: permintaan reset via /api/v2/forgot-password -> PIN tidak dibocorkan pada respons.
2) (Screenshot 2) KONTROL: satu PIN salah (000) -> ditolak dengan Invalid reset PIN.
3) (Screenshot 3) EKSPLOITASI: percobaan PIN berturut-turut tanpa jeda -> seluruhnya dilayani HTTP 400, tidak ada HTTP 429, penguncian, maupun perlambatan.
4) (Screenshot 4) EKSPLOITASI: PIN yang benar ditemukan pada percobaan ke-451 -> reset_success true, password korban diganti.
5) (Screenshot 5) DAMPAK CIA: login sebagai pentest_victim dengan password hasil brute force -> token terbit, akun korban diambil alih.

22 / 26PASS

Broken Function Level Authorization - Admin - Administrative Endpoints

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[PASS] Broken Function Level Authorization - Admin - Administrative Endpoints

Deskripsi

Pengujian berupaya memanggil fungsi administratif secara langsung memakai token pengguna biasa, melewati antarmuka panel admin. Endpoint yang diuji mencakup pembuatan administrator baru, penghapusan akun, dan penangguhan akun.

Dampak

Tidak ada dampak. Kontrol bertahan: ketiga endpoint administratif memeriksa peran pemanggil dan menolak token pengguna biasa dengan HTTP 403. Pemanggilan langsung tanpa melalui antarmuka tidak memberi hak tambahan. Catatan penting: kontrol ini hanya seaman klaim peran pada token. Karena klaim is_admin dibaca dari token dan tanda tangan token tidak diverifikasi dengan benar, pemeriksaan peran ini dapat dilewati dengan token yang ditempa, sebagaimana dibuktikan pada temuan JWT Signature Not Verified.

CWE

CWE-285: Improper Authorization

OWASP

A01:2021 - Broken Access Control

Skenario

Token pengguna biasa dipakai memanggil /admin/create_admin, /admin/delete_account/3, dan /admin/toggle_suspension/3 secara langsung. Hasil: seluruhnya ditolak dengan HTTP 403.

Endpoint

POST http://127.0.0.1:5001/admin/create_admin POST http://127.0.0.1:5001/admin/delete_account/<user_id> POST http://127.0.0.1:5001/admin/toggle_suspension/<user_id>

Fitur terdampak

Fungsi administratif (buat admin, hapus akun, tangguhkan akun)

Rekomendasi perbaikan

- Pertahankan pemeriksaan peran pada seluruh endpoint administratif. - Ambil peran dari database berdasarkan subject token, bukan dari klaim di dalam token, agar kontrol ini tidak dapat dilewati dengan token palsu.

Bukti konsep

1) (Screenshot 1) PERCOBAAN: token pengguna biasa memanggil /admin/create_admin -> HTTP 403, kontrol bertahan. 2) (Screenshot 2) PERCOBAAN: token pengguna biasa memanggil /admin/delete_account/3 -> HTTP 403, kontrol bertahan. 3) (Screenshot 3) PERCOBAAN: token pengguna biasa memanggil /admin/toggle_suspension/3 -> HTTP 403, kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] Broken Function Level Authorization - Admin - Administrative Endpoints

Description:
Pengujian berupaya memanggil fungsi administratif secara langsung memakai token pengguna biasa, melewati antarmuka panel admin. Endpoint yang diuji mencakup pembuatan administrator baru, penghapusan akun, dan penangguhan akun.

Impact:
Tidak ada dampak. Kontrol bertahan: ketiga endpoint administratif memeriksa peran pemanggil dan menolak token pengguna biasa dengan HTTP 403. Pemanggilan langsung tanpa melalui antarmuka tidak memberi hak tambahan.

Catatan penting: kontrol ini hanya seaman klaim peran pada token. Karena klaim is_admin dibaca dari token dan tanda tangan token tidak diverifikasi dengan benar, pemeriksaan peran ini dapat dilewati dengan token yang ditempa, sebagaimana dibuktikan pada temuan JWT Signature Not Verified.

CWE:
CWE-285: Improper Authorization

OWASP:
A01:2021 - Broken Access Control

Scenario:
Token pengguna biasa dipakai memanggil /admin/create_admin, /admin/delete_account/3, dan /admin/toggle_suspension/3 secara langsung. Hasil: seluruhnya ditolak dengan HTTP 403.

Endpoint:
POST http://127.0.0.1:5001/admin/create_admin
POST http://127.0.0.1:5001/admin/delete_account/<user_id>
POST http://127.0.0.1:5001/admin/toggle_suspension/<user_id>

Affected Feature:
Fungsi administratif (buat admin, hapus akun, tangguhkan akun)

Remediation:
- Pertahankan pemeriksaan peran pada seluruh endpoint administratif.
- Ambil peran dari database berdasarkan subject token, bukan dari klaim di dalam token, agar kontrol ini tidak dapat dilewati dengan token palsu.

POC:
1) (Screenshot 1) PERCOBAAN: token pengguna biasa memanggil /admin/create_admin -> HTTP 403, kontrol bertahan.
2) (Screenshot 2) PERCOBAAN: token pengguna biasa memanggil /admin/delete_account/3 -> HTTP 403, kontrol bertahan.
3) (Screenshot 3) PERCOBAAN: token pengguna biasa memanggil /admin/toggle_suspension/3 -> HTTP 403, kontrol bertahan.

23 / 26PASS

Broken Object Level Authorization - GraphQL - Transaction Summary

3 tangkapan layar · 3 rekaman HTTP

Kerentanan

[PASS] Broken Object Level Authorization - GraphQL - Transaction Summary

Deskripsi

Pengujian berupaya membaca ringkasan transaksi milik pengguna lain melalui argumen accountNumber pada resolver GraphQL transactionSummary, termasuk rekening korban dan rekening administrator.

Dampak

Tidak ada dampak. Kontrol bertahan: resolver membandingkan accountNumber yang diminta dengan rekening milik pemegang token dan menolak permintaan lintas objek dengan galat eksplisit. Pengguna biasa hanya dapat membaca ringkasan transaksi rekeningnya sendiri. Catatan: jalur kode yang sama tetap bermasalah bagi pemanggil dengan peran administrator, karena nilai argumen diteruskan ke query SQL tanpa parameterisasi; hal tersebut dilaporkan terpisah pada temuan SQL Injection - GraphQL.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

A01:2021 - Broken Access Control

Skenario

Normal: pengguna biasa meminta ringkasan transaksi rekeningnya sendiri -> berhasil. Percobaan: accountNumber diganti dengan rekening korban -> ditolak. Percobaan: accountNumber diganti dengan rekening administrator -> ditolak.

Endpoint

POST http://127.0.0.1:5001/graphql

Fitur terdampak

GraphQL transactionSummary (otorisasi objek)

Rekomendasi perbaikan

- Pertahankan pemeriksaan kepemilikan rekening pada resolver. - Lengkapi dengan parameterized query agar argumen yang sama tidak menjadi titik injeksi bagi pemanggil dengan hak lebih tinggi.

Bukti konsep

1) (Screenshot 1) NORMAL: pengguna biasa meminta ringkasan transaksi rekeningnya sendiri -> berhasil. 2) (Screenshot 2) PERCOBAAN: accountNumber diganti dengan rekening korban -> ditolak dengan galat You can only query your own transaction summary, kontrol bertahan. 3) (Screenshot 3) PERCOBAAN: accountNumber diganti dengan rekening administrator -> ditolak, kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] Broken Object Level Authorization - GraphQL - Transaction Summary

Description:
Pengujian berupaya membaca ringkasan transaksi milik pengguna lain melalui argumen accountNumber pada resolver GraphQL transactionSummary, termasuk rekening korban dan rekening administrator.

Impact:
Tidak ada dampak. Kontrol bertahan: resolver membandingkan accountNumber yang diminta dengan rekening milik pemegang token dan menolak permintaan lintas objek dengan galat eksplisit. Pengguna biasa hanya dapat membaca ringkasan transaksi rekeningnya sendiri.

Catatan: jalur kode yang sama tetap bermasalah bagi pemanggil dengan peran administrator, karena nilai argumen diteruskan ke query SQL tanpa parameterisasi; hal tersebut dilaporkan terpisah pada temuan SQL Injection - GraphQL.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
A01:2021 - Broken Access Control

Scenario:
Normal: pengguna biasa meminta ringkasan transaksi rekeningnya sendiri -> berhasil. Percobaan: accountNumber diganti dengan rekening korban -> ditolak. Percobaan: accountNumber diganti dengan rekening administrator -> ditolak.

Endpoint:
POST http://127.0.0.1:5001/graphql

Affected Feature:
GraphQL transactionSummary (otorisasi objek)

Remediation:
- Pertahankan pemeriksaan kepemilikan rekening pada resolver.
- Lengkapi dengan parameterized query agar argumen yang sama tidak menjadi titik injeksi bagi pemanggil dengan hak lebih tinggi.

POC:
1) (Screenshot 1) NORMAL: pengguna biasa meminta ringkasan transaksi rekeningnya sendiri -> berhasil.
2) (Screenshot 2) PERCOBAAN: accountNumber diganti dengan rekening korban -> ditolak dengan galat You can only query your own transaction summary, kontrol bertahan.
3) (Screenshot 3) PERCOBAAN: accountNumber diganti dengan rekening administrator -> ditolak, kontrol bertahan.

24 / 26PASS

Broken Object Level Authorization - Merchant Payments - Payment By ID

2 tangkapan layar · 2 rekaman HTTP

Kerentanan

[PASS] Broken Object Level Authorization - Merchant Payments - Payment By ID

Deskripsi

Pengujian berupaya membaca detail satu transaksi milik merchant lain melalui /api/v1/payments/<payment_id> menggunakan API key merchant yang berbeda.

Dampak

Tidak ada dampak. Kontrol bertahan: endpoint membatasi pencarian pada transaksi milik merchant pemegang API key, sehingga permintaan lintas merchant dijawab Payment not found alih-alih membocorkan data. Catatan: endpoint lain pada modul yang sama TIDAK menerapkan pembatasan ini. /api/v1/payments/merchant_id/<merchant_id> mengembalikan transaksi merchant lain dan dilaporkan terpisah sebagai temuan Broken Object Level Authorization - Merchant Payments - Payments By Merchant.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

A01:2021 - Broken Access Control

Skenario

Normal: ScopeShopA membaca transaksinya sendiri berdasarkan payment_id memakai API key miliknya -> berhasil. Percobaan: ScopeShopB membaca payment_id yang sama memakai API key miliknya sendiri -> ditolak dengan Payment not found.

Endpoint

GET http://127.0.0.1:5001/api/v1/payments/<payment_id>

Fitur terdampak

Pembayaran merchant (detail transaksi per id)

Rekomendasi perbaikan

- Pertahankan pembatasan pencarian transaksi berdasarkan merchant pemilik API key. - Terapkan pola yang sama pada seluruh endpoint modul pembayaran, khususnya /api/v1/payments/merchant_id/<merchant_id> yang saat ini belum membatasi.

Bukti konsep

1) (Screenshot 1) NORMAL: ScopeShopA membaca transaksinya sendiri memakai API key miliknya -> berhasil. 2) (Screenshot 2) PERCOBAAN: ScopeShopB membaca payment_id yang sama memakai API key miliknya -> ditolak dengan Payment not found, kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] Broken Object Level Authorization - Merchant Payments - Payment By ID

Description:
Pengujian berupaya membaca detail satu transaksi milik merchant lain melalui /api/v1/payments/<payment_id> menggunakan API key merchant yang berbeda.

Impact:
Tidak ada dampak. Kontrol bertahan: endpoint membatasi pencarian pada transaksi milik merchant pemegang API key, sehingga permintaan lintas merchant dijawab Payment not found alih-alih membocorkan data.

Catatan: endpoint lain pada modul yang sama TIDAK menerapkan pembatasan ini. /api/v1/payments/merchant_id/<merchant_id> mengembalikan transaksi merchant lain dan dilaporkan terpisah sebagai temuan Broken Object Level Authorization - Merchant Payments - Payments By Merchant.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
A01:2021 - Broken Access Control

Scenario:
Normal: ScopeShopA membaca transaksinya sendiri berdasarkan payment_id memakai API key miliknya -> berhasil. Percobaan: ScopeShopB membaca payment_id yang sama memakai API key miliknya sendiri -> ditolak dengan Payment not found.

Endpoint:
GET http://127.0.0.1:5001/api/v1/payments/<payment_id>

Affected Feature:
Pembayaran merchant (detail transaksi per id)

Remediation:
- Pertahankan pembatasan pencarian transaksi berdasarkan merchant pemilik API key.
- Terapkan pola yang sama pada seluruh endpoint modul pembayaran, khususnya /api/v1/payments/merchant_id/<merchant_id> yang saat ini belum membatasi.

POC:
1) (Screenshot 1) NORMAL: ScopeShopA membaca transaksinya sendiri memakai API key miliknya -> berhasil.
2) (Screenshot 2) PERCOBAAN: ScopeShopB membaca payment_id yang sama memakai API key miliknya -> ditolak dengan Payment not found, kontrol bertahan.

25 / 26PASS

JWT Algorithm Confusion - Authentication - alg none

3 tangkapan layar · 2 rekaman HTTP · 1 catatan proses

Kerentanan

[PASS] JWT Algorithm Confusion - Authentication - alg none

Deskripsi

Pengujian berupaya melewati verifikasi tanda tangan JWT dengan mengubah header algoritma menjadi none dan mengosongkan bagian tanda tangan, sebuah teknik klasik untuk memalsukan token. Kode sumber mencantumkan none pada daftar algoritma yang diterima, sehingga endpoint ini diuji secara khusus.

Dampak

Tidak ada dampak. Kontrol bertahan: token dengan alg none ditolak pada seluruh endpoint yang diuji, baik endpoint pengguna biasa maupun panel administrasi, dengan HTTP 401. Pustaka JWT yang digunakan menolak algoritma none ketika kunci verifikasi diberikan, sehingga niat kode yang permisif tidak dapat dieksploitasi lewat jalur ini. Catatan: hal ini TIDAK berarti validasi token aman. Jalur pemalsuan lain berhasil dan dilaporkan terpisah pada temuan JWT Signature Not Verified, di mana token dengan tanda tangan salah tetap diterima.

CWE

CWE-347: Improper Verification of Cryptographic Signature

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Token sah didekode, header diubah menjadi alg none, klaim is_admin diubah menjadi true, lalu token dirangkai ulang tanpa tanda tangan. Token tersebut dikirim ke endpoint pengguna dan endpoint administrasi. Hasil: keduanya menolak dengan HTTP 401.

Endpoint

GET http://127.0.0.1:5001/dashboard GET http://127.0.0.1:5001/sup3r_s3cr3t_admin

Fitur terdampak

Validasi JWT (algoritma none)

Rekomendasi perbaikan

- Pertahankan penolakan algoritma none, dan hapus none dari daftar algoritma yang dikonfigurasi agar niat kode selaras dengan perilaku pustaka. - Kunci algoritma ke satu nilai yang diharapkan secara eksplisit.

Bukti konsep

1) (Screenshot 1) PROSES: token sah didekode, header diubah menjadi alg none dan klaim is_admin menjadi true, lalu dirangkai ulang tanpa tanda tangan. 2) (Screenshot 2) HASIL: token alg none dikirim ke /dashboard -> HTTP 401 Invalid token, kontrol bertahan. 3) (Screenshot 3) HASIL: token alg none dikirim ke /sup3r_s3cr3t_admin -> HTTP 401, kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] JWT Algorithm Confusion - Authentication - alg none

Description:
Pengujian berupaya melewati verifikasi tanda tangan JWT dengan mengubah header algoritma menjadi none dan mengosongkan bagian tanda tangan, sebuah teknik klasik untuk memalsukan token. Kode sumber mencantumkan none pada daftar algoritma yang diterima, sehingga endpoint ini diuji secara khusus.

Impact:
Tidak ada dampak. Kontrol bertahan: token dengan alg none ditolak pada seluruh endpoint yang diuji, baik endpoint pengguna biasa maupun panel administrasi, dengan HTTP 401. Pustaka JWT yang digunakan menolak algoritma none ketika kunci verifikasi diberikan, sehingga niat kode yang permisif tidak dapat dieksploitasi lewat jalur ini.

Catatan: hal ini TIDAK berarti validasi token aman. Jalur pemalsuan lain berhasil dan dilaporkan terpisah pada temuan JWT Signature Not Verified, di mana token dengan tanda tangan salah tetap diterima.

CWE:
CWE-347: Improper Verification of Cryptographic Signature

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Token sah didekode, header diubah menjadi alg none, klaim is_admin diubah menjadi true, lalu token dirangkai ulang tanpa tanda tangan. Token tersebut dikirim ke endpoint pengguna dan endpoint administrasi. Hasil: keduanya menolak dengan HTTP 401.

Endpoint:
GET http://127.0.0.1:5001/dashboard
GET http://127.0.0.1:5001/sup3r_s3cr3t_admin

Affected Feature:
Validasi JWT (algoritma none)

Remediation:
- Pertahankan penolakan algoritma none, dan hapus none dari daftar algoritma yang dikonfigurasi agar niat kode selaras dengan perilaku pustaka.
- Kunci algoritma ke satu nilai yang diharapkan secara eksplisit.

POC:
1) (Screenshot 1) PROSES: token sah didekode, header diubah menjadi alg none dan klaim is_admin menjadi true, lalu dirangkai ulang tanpa tanda tangan.
2) (Screenshot 2) HASIL: token alg none dikirim ke /dashboard -> HTTP 401 Invalid token, kontrol bertahan.
3) (Screenshot 3) HASIL: token alg none dikirim ke /sup3r_s3cr3t_admin -> HTTP 401, kontrol bertahan.

26 / 26PASS

Path Traversal - Profile Picture - Upload Filename

2 tangkapan layar · 2 rekaman HTTP

Kerentanan

[PASS] Path Traversal - Profile Picture - Upload Filename

Deskripsi

Pengujian berupaya menulis berkas di luar direktori unggahan dengan menyisipkan urutan ../ pada nama berkas yang dikirim klien. Komentar pada kode sumber menyatakan path traversal dimungkinkan, sehingga endpoint ini diuji secara khusus.

Dampak

Tidak ada dampak. Kontrol bertahan: fungsi secure_filename dari Werkzeug meratakan nama berkas sehingga urutan ../ dihapus dan berkas tetap tersimpan di dalam direktori static/uploads. Penulisan berkas ke lokasi arbitrer tidak berhasil dicapai. Catatan: endpoint yang sama tetap bermasalah karena tidak memvalidasi tipe berkas; hal tersebut dilaporkan terpisah pada temuan Unrestricted File Upload.

CWE

CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)

OWASP

A01:2021 - Broken Access Control

Skenario

Berkas diunggah dengan nama ../../../../tmp/pwned.txt yang bertujuan keluar dari direktori unggahan. Hasil: nama berkas diratakan oleh secure_filename dan berkas tersimpan di dalam static/uploads, bukan di /tmp. Verifikasi dilakukan dengan mengambil kembali berkas tersebut pada lokasi penyimpanan yang sebenarnya.

Endpoint

POST http://127.0.0.1:5001/upload_profile_picture

Fitur terdampak

Unggah foto profil (penanganan nama berkas)

Rekomendasi perbaikan

- Pertahankan penggunaan secure_filename. - Abaikan sepenuhnya nama berkas dari klien dan hasilkan nama acak di sisi server. - Verifikasi bahwa path akhir berada di dalam direktori unggahan sebelum menulis berkas.

Bukti konsep

1) (Screenshot 1) PERCOBAAN: berkas diunggah dengan nama ../../../../tmp/pwned.txt -> nama diratakan, berkas tersimpan di dalam static/uploads. 2) (Screenshot 2) HASIL: berkas diambil kembali pada lokasi penyimpanan sebenarnya di dalam static/uploads, membuktikan traversal tidak terjadi dan kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] Path Traversal - Profile Picture - Upload Filename

Description:
Pengujian berupaya menulis berkas di luar direktori unggahan dengan menyisipkan urutan ../ pada nama berkas yang dikirim klien. Komentar pada kode sumber menyatakan path traversal dimungkinkan, sehingga endpoint ini diuji secara khusus.

Impact:
Tidak ada dampak. Kontrol bertahan: fungsi secure_filename dari Werkzeug meratakan nama berkas sehingga urutan ../ dihapus dan berkas tetap tersimpan di dalam direktori static/uploads. Penulisan berkas ke lokasi arbitrer tidak berhasil dicapai.

Catatan: endpoint yang sama tetap bermasalah karena tidak memvalidasi tipe berkas; hal tersebut dilaporkan terpisah pada temuan Unrestricted File Upload.

CWE:
CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)

OWASP:
A01:2021 - Broken Access Control

Scenario:
Berkas diunggah dengan nama ../../../../tmp/pwned.txt yang bertujuan keluar dari direktori unggahan. Hasil: nama berkas diratakan oleh secure_filename dan berkas tersimpan di dalam static/uploads, bukan di /tmp. Verifikasi dilakukan dengan mengambil kembali berkas tersebut pada lokasi penyimpanan yang sebenarnya.

Endpoint:
POST http://127.0.0.1:5001/upload_profile_picture

Affected Feature:
Unggah foto profil (penanganan nama berkas)

Remediation:
- Pertahankan penggunaan secure_filename.
- Abaikan sepenuhnya nama berkas dari klien dan hasilkan nama acak di sisi server.
- Verifikasi bahwa path akhir berada di dalam direktori unggahan sebelum menulis berkas.

POC:
1) (Screenshot 1) PERCOBAAN: berkas diunggah dengan nama ../../../../tmp/pwned.txt -> nama diratakan, berkas tersimpan di dalam static/uploads.
2) (Screenshot 2) HASIL: berkas diambil kembali pada lokasi penyimpanan sebenarnya di dalam static/uploads, membuktikan traversal tidak terjadi dan kontrol bertahan.

04 / DOKUMEN ASLI

Laporan PDF asli

Baca PDF asli di bawah atau buka di tab baru.

Jika PDF tidak muncul: Buka PDF (ID) ↗

Laporan HTML menyajikan catatan pengujian dan materi pendukung, bukan salinan kata demi kata dari PDF. Lihat PDF untuk laporan dan tata letak aslinya.