Cross-Site Scripting (XSS) sering disebut sebagai ancaman web paling klasik, tapi dampaknya tetap masif. Data dari OWASP Foundation menunjukkan XSS masih berada di jajaran kerentanan web yang paling sering dieksploitasi. Banyak pengembang mengira XSS itu cuma satu jenis, padahal ada tiga varian utama yang cara kerja dan tingkat bahayanya berbeda.
Menurut Dimas Prasetyo, penetration tester dengan pengalaman lebih dari 5 tahun di industri keamanan siber Indonesia, perbedaan ketiga jenis XSS ini sering diabaikan bahkan oleh praktisi yang sudah lama berkecimpung di dunia security. “Saya sering menemukan bug bounty hunter yang sudah submit puluhan laporan, tapi belum paham bedanya Reflected XSS dan Stored XSS secara fundamental. Padahal, kalau dipahami benar, kita bisa nentuin strategi eksploitasi dan dampaknya jauh lebih akurat,” ujarnya. Dimas pernah menangani proyek penetration testing di salah satu platform e-commerce besar Indonesia, di mana temuan Stored XSS memungkinkan serangan terhadap ribuan pengguna secara otomatis karena payload tersimpan di database.
Apa Itu Reflected XSS dan Bagaimana Cara Kerjanya?
Reflected XSS adalah jenis serangan di mana payload jahat tidak disimpan di server. Sebaliknya, payload tersebut “dipantulkan” langsung dalam respons HTTP yang dikirim kembali ke browser korban. Biasanya, serangan ini memerlukan interaksi tambahan, seperti mengklik link berbahaya atau mengunjungi URL yang sudah dimodifikasi oleh penyerang.
Cara kerjanya sederhana: penyerang menyisipkan kode JavaScript berbahaya ke dalam parameter URL, misalnya https://situs.com/search?q=<script>alert('xss')</script>. Ketika korban membuka link tersebut, server mengembalikan halaman yang mengandung script tersebut, dan browser mengeksekusinya tanpa verifikasi lebih lanjut.
Karena payload tidak tersimpan permanen, serangan Reflected XSS biasanya memerlukan social engineering untuk berhasil. Penyerang harus meyakinkan korban untuk mengklik link yang sudah dibuat khusus. Meski demikian, dampaknya tetap berbahaya, terutama jika berhasil mencuri session cookie atau melakukan phishing yang lebih canggih.
Apa Itu Stored XSS dan Mengapa Lebih Berbahaya?
Stored XSS, juga dikenal sebagai Persistent XSS, merupakan varian yang jauh lebih berbahaya. Di sini, payload jahat disimpan secara permanen di server, biasanya di database, komentar, forum, atau bagian konten yang bisa diinput oleh pengguna. Setiap kali pengguna lain mengakses halaman yang berisi payload tersebut, script akan dieksekusi otomatis di browser mereka.
Perbedaan utama dengan Reflected XSS adalah tidak diperlukan interaksi langsung dari korban. Penyerang cukup menyuntikkan payload sekali, lalu semua pengguna yang mengunjungi halaman terkompromi akan terkena dampaknya. Inilah mengapa Stored XSS sering dianggap sebagai ancaman kritis dalam audit keamanan aplikasi web.
Contoh nyata: seorang bug hunter menemukan celah Stored XSS di kolom komentar sebuah situs berita. Ia menyisipkan payload yang mencuri cookie pengguna. Dalam hitungan jam, ratusan pembaca yang membuka artikel tersebut secara tidak sadar mengirimkan data sesi mereka ke server penyerang. Kasus seperti ini menunjukkan bahwa Stored XSS memiliki potensi skala serangan yang masif tanpa memerlukan upaya sosial yang rumit.
Apa Itu DOM-Based XSS dan Di Mana Letak Perbedaannya?
DOM-based XSS adalah varian yang sedikit berbeda dari dua sebelumnya. Serangan ini terjadi sepenuhnya di sisi client, di dalam browser korban, tanpa melibatkan server sama sekali. Payload tidak perlu dikirim ke server atau disimpan di database; sebaliknya, script dieksekusi karena manipulasi Document Object Model (DOM) oleh JavaScript di halaman web.
Cara kerjanya: aplikasi web menggunakan input dari sumber client-side, seperti window.location.hash, document.URL, atau document.referrer, lalu memasukkan data tersebut ke dalam DOM tanpa sanitasi yang memadai. Penyerang bisa memanfaatkan fragment identifier (bagian setelah tanda # di URL) untuk menyuntikkan kode berbahaya.
Contoh sederhana: sebuah situs single-page application (SPA) membaca hash dari URL untuk menampilkan konten. Jika hash tersebut langsung dimasukkan ke dalam HTML tanpa escape, penyerang bisa membuat URL seperti https://situs.com/app#<img src=x onerror=alert('xss')>. Browser korban akan mengeksekusi script tersebut saat halaman diproses.
DOM-based XSS sering lebih sulit terdeteksi karena tidak meninggalkan jejak di server log. Penyerang juga tidak perlu mengirim payload ke server, sehingga firewall dan WAF tradisional mungkin tidak menyadari adanya serangan.
Perbandingan Lengkap: Reflected vs Stored vs DOM-Based XSS
| Aspek | Reflected XSS | Stored XSS | DOM-Based XSS |
|---|---|---|---|
| Penyimpanan Payload | Tidak disimpan | Disimpan di server/database | Tidak disimpan, client-side |
| Cara Penyerangan | Via URL/link berbahaya | Via input yang tersimpan | Via manipulasi DOM |
| Interaksi Korban | Harus klik link | Otomatis saat buka halaman | Otomatis saat buka halaman |
| Skala Dampak | Terbatas (targeted) | Massal (semua pengunjung) | Terbatas atau massal |
| Deteksi Server | Mungkin terlihat di log | Terlihat di log/database | Sulit terdeteksi di server |
| Tingkat Bahaya | Medium | Critical | Medium-High |
| Contoh Lokasi | Form pencarian, error page | Komentar, profil, forum | SPA, hash-based routing |
Bagaimana Cara Mencegah Ketiga Jenis XSS?
Meski mekanisme serangan berbeda, prinsip mitigasi untuk ketiga jenis XSS memiliki banyak kesamaan. Berikut adalah strategi utama yang direkomendasikan oleh OWASP dan praktisi keamanan:
1. Output Encoding (Escaping)
Setiap data yang berasal dari user input harus di-escape sebelum ditampilkan di HTML, JavaScript, CSS, atau URL. Jangan pernah percaya pada input pengguna, meski tampaknya berasal dari sumber internal.
2. Content Security Policy (CSP)
CSP adalah header HTTP yang memungkinkan pengembang menentukan sumber mana saja yang diizinkan untuk mengeksekusi script. Dengan CSP yang ketat, bahkan jika XSS berhasil disuntikkan, browser akan memblokir eksekusi script yang tidak berasal dari domain tepercaya.
3. Input Validation
Validasi input di sisi server dan client. Gunakan whitelist karakter yang diperbolehkan, bukan blacklist. Blacklist seringkali tidak efektif karena penyerang bisa menemukan variasi payload yang lolos filter.
4. Gunakan Framework Modern
Framework seperti React, Vue, dan Angular secara default melakukan escaping pada output. Namun, tetap waspada terhadap fungsi yang secara eksplisit memasukkan HTML mentah, seperti dangerouslySetInnerHTML di React.
5. HttpOnly dan Secure Cookie
Aktifkan flag HttpOnly pada cookie sesi untuk mencegah JavaScript mengaksesnya. Tambahkan flag Secure agar cookie hanya dikirim melalui HTTPS.
FAQ: Pertanyaan Umum tentang XSS
Apakah XSS masih relevan di 2026?
Ya, XSS tetap menjadi ancaman yang signifikan. Meski framework modern dan WAF semakin canggih, kesalahan konfigurasi dan kode legacy masih memungkinkan serangan XSS. Laporan dari berbagai platform bug bounty menunjukkan XSS masih menjadi temuan yang sering dilaporkan.
Apakah DOM-based XSS lebih sulit diperbaiki?
DOM-based XSS bisa lebih sulit diperbaiki karena sering melibatkan logika JavaScript yang kompleks di frontend. Selain itu, karena tidak ada interaksi server, alat pemindai keamanan tradisional mungkin melewatkannya.
Apakah WAF bisa melindungi dari semua jenis XSS?
WAF bisa membantu memblokir banyak payload XSS, terutama Reflected dan Stored. Namun, DOM-based XSS yang menggunakan teknik encoding atau fragment identifier mungkin lolos dari deteksi WAF karena tidak pernah dikirim ke server.
Apa perbedaan XSS dan CSRF?
XSS mengeksploitasi kepercayaan pengguna terhadap situs web dengan menyuntikkan script berbahaya. CSRF (Cross-Site Request Forgery) mengeksploitasi kepercayaan situs web terhadap browser pengguna dengan memaksa pengguna melakukan aksi tidak diinginkan. Meski berbeda, keduanya bisa saling melengkapi dalam serangan yang lebih kompleks.
Kesimpulan
Memahami perbedaan Reflected XSS, Stored XSS, dan DOM-based XSS adalah fondasi penting bagi setiap pengembang web, bug hunter, dan praktisi keamanan siber. Ketiga jenis serangan ini memiliki karakteristik unik, tingkat bahaya berbeda, dan strategi mitigasi yang sedikit berbeda pula.
Reflected XSS bergantung pada social engineering dan tidak menyimpan payload, sehingga dampaknya lebih terbatas. Stored XSS jauh lebih berbahaya karena payload tersimpan permanen dan bisa menyerang massal tanpa interaksi tambahan. DOM-based XSS beroperasi di sisi client, sering lolos dari deteksi server, dan memerlukan pemahaman mendalam tentang JavaScript dan DOM manipulation.
Dengan menerapkan output encoding, Content Security Policy, input validation, dan penggunaan framework modern, risiko XSS bisa diminimalisir secara signifikan. Selalu ingat: jangan pernah percaya input pengguna, dan anggap setiap data yang masuk ke aplikasi sebagai potensi ancaman.
Sumber Referensi:
- OWASP Foundation — Cross-Site Scripting (XSS) Prevention Cheat Sheet
- PortSwigger Web Security Academy — XSS Types and Exploitation
- Mozilla Developer Network (MDN) — Content Security Policy