Một trong những loại lỗ hổng phổ biến nhất trong các trang web được gọi là “Cross-Site Scripting” hoặc “XSS”. Các lỗ hổng XSS là nơi người dùng có thể khiến JavaScript được thực thi. Có một số biến thể khác nhau của lỗ hổng XSS, với các mức độ nghiêm trọng khác nhau.
Vấn đề với việc kẻ tấn công có thể thực thi JavaScript trong các phiên của người dùng khác là kẻ tấn công có thể làm bất cứ điều gì với trang web mà nạn nhân xem. Điều này bao gồm chuyển hướng nạn nhân đến các trang web bên ngoài, đánh cắp mã thông báo xác thực và theo dõi chi tiết thanh toán.
Dạng lỗ hổng XSS nghiêm trọng nhất là "Stored" hoặc "Persist" Cross-Site Scripting, đây là nơi kẻ tấn công có thể tạo ra một trọng tải XSS và sau đó gửi nó, vì vậy nó được lưu trong cơ sở dữ liệu. Với một khai thác XSS được lưu trong cơ sở dữ liệu, nó có thể ảnh hưởng đến những người dùng khác trong một khoảng thời gian rộng.
Một dạng khác của Cross-Site Scripting là “Reflected”, loại này không được lưu tại bất kỳ thời điểm nào, thay vào đó, payload được đưa vào trình duyệt. Thông thường, loại XSS này là một phần của các cuộc tấn công lừa đảo, trong đó kẻ tấn công cố gắng lừa nạn nhân nhấp vào một liên kết độc hại.
Nói chung, hầu hết các cuộc tấn công XSS đều có tải trọng được gửi đến máy chủ tại một số thời điểm, nhưng một số cuộc tấn công hoàn toàn là phía máy khách, không bao giờ được gửi đến máy chủ và thay vào đó chỉ ảnh hưởng đến JavaScript phía máy khách. Đây được gọi là XSS dựa trên DOM vì nó nằm trong Mô hình đối tượng tài liệu JavaScript hoặc DOM. Loại lỗ hổng này đặc biệt khó xác định và giải quyết vì máy chủ không bao giờ nhìn thấy các hoạt động khai thác và do đó không thể ghi lại.
Trước đây, kỹ thuật phòng chống các lỗ hổng XSS là lọc tất cả dữ liệu do người dùng gửi, sử dụng danh sách khối để từ chối bất kỳ thông báo nào có ký tự hoặc từ có nghĩa trong JavaScript. Điều này có xu hướng dẫn đến một cuộc chạy đua vũ trang nhằm tìm kiếm các vòng bỏ qua cho bộ lọc đồng thời ngăn cản một số người dùng hợp pháp gửi. Giải pháp chính xác là sử dụng các thực thể HTML để mã hóa dữ liệu do người dùng gửi. khi bật mô-đun thực thể HTML, các ký tự được mã hóa tự động thành một định dạng mà trình duyệt biết để hiển thị chúng dưới dạng ký hiệu chính xác nhưng không coi chúng là mã.