FlawOpen

flawopen.com/Cross-Site Scripting

Cross-Site Scripting

Tinggi CWE-79
Bahasa: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia

Cross-site scripting terjadi ketika halaman memuat teks dari seorang pengguna dengan cara yang diurai browser sebagai HTML atau JavaScript, sehingga teks itu berjalan bagi pengguna lain dengan wewenang situs itu sendiri. Perbaikannya sama di mana pun: encode setiap nilai sesuai tempat persis ia ditulis, sanitasi segelintir field yang harus menerima HTML, dan perkuat keduanya dengan Content Security Policy. Pilih bahasa Anda di bawah untuk melihat API yang tepat, kode rentan dan kode yang sudah diperbaiki, serta aturan CI yang menangkap masalah ini.

Penjelasan Sederhana (ELI5)

Sebuah koran memuat surat pembaca di halamannya sendiri. Seorang pembaca mengirim surat yang tata letaknya persis seperti pengumuman redaksi: 'Pelanggan: hubungi nomor ini dan sebutkan data kartu Anda untuk perpanjangan.' Karena dicetak dengan huruf khas koran itu, pembaca memercayainya seolah redaksi yang menulis. XSS adalah situs web yang mencetak teks pengunjung ke halamannya sendiri, sehingga browser memperlakukannya sebagai kode situs itu, lengkap dengan akses situs ke akun Anda. Escaping berarti mencetak setiap surat di dalam kotak kutipan yang jelas, sehingga tidak ada surat yang bisa menyamar sebagai pengumuman redaksi.

Konsep Kunci & Istilah

Cross-site scripting (CWE-79)
Sebuah halaman web memuat data yang tidak tepercaya tanpa menetralkannya untuk browser, sehingga markup atau skrip di dalamnya diurai dan dijalankan di origin halaman, dengan akses ke DOM, cookie, dan API-nya.
Reflected, stored and DOM-based XSS
XSS reflected mengembalikan data request langsung di respons, biasanya lewat tautan yang dirancang. XSS stored menyimpan nilai lalu menyajikannya ke setiap orang yang melihat. XSS berbasis DOM bahkan tidak menyentuh server: JavaScript di klien menyalin data dari URL atau penyimpanan ke sink seperti innerHTML.
Contextual output encoding
Setiap konteks output membutuhkan encoding-nya sendiri: entitas HTML untuk teks elemen dan atribut berkutip, escaping string JavaScript di dalam skrip, percent-encoding di parameter URL, dan pemeriksaan skema untuk href dan src. Meng-encode HTML untuk nilai yang ditaruh di dalam skrip tidak cukup.
Sanitizing vs encoding
Encoding menampilkan markup sebagai teks. Jika pengguna harus mengirim format, lewatkan HTML ke sanitizer berbasis allowlist (DOMPurify, nh3 sebagai penerus bleach, OWASP Java HTML Sanitizer, HtmlSanitizer, ammonia) yang mempertahankan tag yang diizinkan dan membuang skrip, event handler, serta URL javascript:.
Content Security Policy (CSP)
Header respons yang memberi tahu browser skrip mana yang boleh berjalan. script-src berbasis nonce tanpa 'unsafe-inline' memblokir sebagian besar skrip yang disuntikkan meskipun ada bug encoding yang lolos, dan require-trusted-types-for 'script' mengunci sink DOM.

Alur Serangan Langkah demi Langkah

Langkah 1

Teks tidak tepercaya sampai ke halaman

Kata pencarian, field profil, komentar, fragmen URL, atau respons API dimuat saat halaman disusun di server atau diperbarui di browser.

Langkah 2

Teks ditulis tanpa encoding yang tepat

Escaping template dimatikan, nilai masuk ke konteks skrip atau URL yang tidak dicakup escaping HTML, atau kode klien menetapkannya ke innerHTML. Nilai uji yang tidak berbahaya <img src=x onerror=alert(1)> tetap utuh.

Langkah 3

Browser menguraikannya sebagai kode

Browser korban membangun elemen <img> sungguhan dan memicu onerror, atau menjalankan tautan javascript: saat diklik.

Langkah 4

Skrip bertindak sebagai situs

Skrip berjalan dengan origin situs: ia bisa membaca halaman, memanggil API situs dengan cookie atau token korban, mengubah apa yang dilihat pengguna, dan mengirim formulir atas namanya.

Panduan XSS per bahasa

Python JavaScript Go Java PHP C# Ruby C/C++ Rust Kotlin Swift

Daftar Periksa Penguatan Sistem Rekayasa

Bacaan terkait

XSS reflected, stored, dan DOM dijelaskan Apakah escaping saja cukup? CSP atau escaping? Apakah DOMPurify saja cukup? XSS lewat rendering Markdown