Chương 3

Cross-Site Scripting (XSS)

Tìm hiểu cách tấn công Stored XSS qua Database và Reflected XSS dùng cho Phishing giả mạo

📖 Bài 1: Stored XSS (Comment Form)

1. Lỗ hổng hoạt động như thế nào?

Mã độc Javascript được người dùng gửi lên và lưu trữ trực tiếp vào Database của Server (hoặc file lưu trữ). Khi các người dùng khác truy cập trang web, mã độc này sẽ tự động tải về trình duyệt của họ và thực thi.

// server.js (Vulnerable code mô phỏng)
app.post('/api/ch3/comments', (req, res) => {
    ch3Comments.push(req.body.comment); // Lưu trực tiếp
});

app.get('/api/ch3/comments/vulnerable', (req, res) => {
    res.json({ comments: ch3Comments }); // Trả về raw
});

Hậu quả: Đánh cắp Cookie session của người dùng, thực thi hành vi bất hợp pháp nhân danh họ, hoặc làm hỏng giao diện trang web.

2. Cách vá lỗi

Sử dụng cơ chế lọc hoặc mã hóa thực thể HTML (như htmlspecialchars) trước khi in ra giao diện.

// Vá lỗi phía Server
const escaped = ch3Comments.map(c => 
    c.replace(/</g, '&lt;').replace(/>/g, '&gt;')
);

📖 Bài 2: Reflected XSS & Phishing

1. Bản chất Reflected XSS

Mã độc Javascript không được lưu trên server mà xuất hiện trực tiếp trong request (thường là Query Parameter trên URL) và phản chiếu ngay lập tức về trình duyệt của người dùng gửi request đó.

2. HTML Injection & Phishing

Hacker có thể truyền một đoạn mã HTML/CSS tạo dựng một form đăng nhập giả mạo đè lên trang web uy tín để lừa người dùng nhập tài khoản/mật khẩu.

Trong bài thực hành này, hãy kiểm nghiệm việc nhập code HTML dạng form Login vào ô Bio mô tả bản thân để tạo trang đăng nhập giả của Facebook hoặc Google.

🛠 Bài 1: Comment Form (Stored XSS)

Thử nhập mã độc sau để kiểm nghiệm:

  • <script>alert("Stored XSS triggered!");</script>
  • <img src="invalid" onerror="alert('XSS via Image!')">

Danh sách bình luận hiển thị trên trang:

🛠 Bài 2: User Profile (Reflected XSS Phishing)

Mẫu payload chèn nhanh:

Simulated Profile (Trang cá nhân của bạn):

Chưa có thông tin mô tả.