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.
- Ruang lingkup, endpoint, dan perilaku normal
- Langkah pengujian dan variasi request
- Response yang diamati dan dampak keamanan
- Hasil PASS atau FAIL, beserta referensi CWE/OWASP dan rekomendasi perbaikan jika relevan
03 / SKENARIO PENGUJIAN DAN BUKTISkenario 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 ASLILaporan 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.