Pengujian keamanan · Keamanan web + API

VulnBank

Pengujian simulasi perbankan untuk mencari kelemahan pada autentikasi, otorisasi, sesi, dan logika transaksi.

Pengujian lab · Lingkungan simulasi

Ringkasan pengujian

Fokus pengujian

Bisakah aturan akun atau transaksi dilewati?

Pendekatan

Saya menguji autentikasi, sesi, dan alur transaksi melalui antarmuka web serta API.

Hasil

26 skenario pengujian: 21 FAIL dan 5 PASS, dengan 81 tangkapan layar. Ini hasil pengujian lab, bukan metrik produksi. Jumlah tersebut merujuk pada skenario pengujian, bukan jumlah kontrol yang berbeda.

Pengujian keamanan / Laporan

Laporan pengujian penetrasi

Lihat laporan HTML atau buka PDF asli yang tersedia di bawah. Bahasa setiap PDF tercantum pada tautannya.

Bukti / Indeks skenario

Telusuri skenario pengujian

PASS berarti aplikasi berperilaku sesuai harapan pada skenario tersebut. FAIL berarti skenario tersebut mengonfirmasi kelemahan keamanan. Jumlah ini merujuk pada skenario pengujian, bukan jumlah kontrol yang berbeda.

01
Account Takeover - Password Reset - Reset PIN DisclosureEndpoint /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 mengetahu…
FAIL
02
Active Debug Code - Application Server - Werkzeug DebuggerAplikasi 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 mil…
FAIL
03
Broken Object Level Authorization - Accounts - Balance LookupEndpoint /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 rek…
FAIL
04
Broken Object Level Authorization - Merchant Payments - Payments By MerchantEndpoint /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 memasti…
FAIL
05
Broken Object Level Authorization - Users - User Detail APIEndpoint /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 bilang…
FAIL
06
Broken Object Level Authorization - Virtual Cards - Card OperationsEndpoint 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.…
FAIL
07
Excessive Data Exposure - GraphQL - Schema IntrospectionEndpoint /graphql melayani query introspeksi __schema bagi pengguna terautentikasi biasa. Seluruh tipe, field, dan argumen skema dapat diunduh, termasuk field yang tidak dipakai antarmuka resmi.
FAIL
08
Insufficient Session Expiration - Authentication - JWT LifetimeToken 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 …
FAIL
09
JWT Signature Not Verified - Authentication - Token ValidationFungsi 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 tet…
FAIL
10
Mass Assignment - Registration - Privilege FieldsEndpoint /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 la…
FAIL
11
Race Condition - Transfer - Balance CheckEndpoint /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…
FAIL
12
Security Misconfiguration - CORS - Wildcard OriginAplikasi 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…
FAIL
13
Sensitive Data Exposure - Debug Endpoint - User CredentialsEndpoint /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.
FAIL
14
Sensitive Data Exposure - Web Root - Environment FilesBerkas 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.
FAIL
15
Server-Side Request Forgery - Profile Picture - Import By URLEndpoint /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…
FAIL
16
SQL Injection - Authentication - Login BypassEndpoint /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 li…
FAIL
17
SQL Injection - GraphQL - Transaction Summary ResolverResolver 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_numbe…
FAIL
18
Stored Cross-Site Scripting - User Profile - Bio FieldEndpoint /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), semen…
FAIL
19
Unrestricted File Upload - Profile Picture - File Type ValidationEndpoint /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, …
FAIL
20
Unrestricted Resource Consumption - Authentication - Login Rate LimitingEndpoint /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 membe…
FAIL
21
Unrestricted Resource Consumption - Password Reset - PIN Rate LimitingEndpoint 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 dihab…
FAIL
22
Broken Function Level Authorization - Admin - Administrative EndpointsPengujian berupaya memanggil fungsi administratif secara langsung memakai token pengguna biasa, melewati antarmuka panel admin. Endpoint yang diuji mencakup pembuatan administrator baru, penghapusan akun, dan penang…
PASS
23
Broken Object Level Authorization - GraphQL - Transaction SummaryPengujian berupaya membaca ringkasan transaksi milik pengguna lain melalui argumen accountNumber pada resolver GraphQL transactionSummary, termasuk rekening korban dan rekening administrator.
PASS
24
Broken Object Level Authorization - Merchant Payments - Payment By IDPengujian berupaya membaca detail satu transaksi milik merchant lain melalui /api/v1/payments/<payment_id> menggunakan API key merchant yang berbeda.
PASS
25
JWT Algorithm Confusion - Authentication - alg nonePengujian 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 …
PASS
26
Path Traversal - Profile Picture - Upload FilenamePengujian 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…
PASS