Tấn công Cross-site Scripting (XSS)
Cross-site scripting (thường gọi tắt là XSS) là một trong những lỗ hổng phổ biến nhất trên các ứng dụng web hiện nay. Các lỗ hổng XSS được phân loại thành ba nhóm chính:
Kẻ tấn công có thể sử dụng các kỹ thuật làm rối (obfuscation) trong các cuộc tấn công XSS bằng cách mã hóa các thẻ HTML hoặc đoạn mã độc hại dưới dạng Unicode, khiến nội dung độc hại trông giống như bình thường đối với người dùng cuối khi họ duyệt trang.
XSS phản chiếu (Reflected XSS)
Cuộc tấn công XSS phản chiếu (hay còn gọi là XSS không lưu trữ) xảy ra khi mã độc được tiêm vào ứng dụng web dễ bị tấn công và phản hồi lại người dùng như một phần của yêu cầu HTTP hợp lệ. Một ví dụ là người dùng bị dụ nhấp vào một liên kết độc hại dẫn đến một máy chủ dễ bị tấn công. Máy chủ này phản chiếu mã độc trở lại trình duyệt của nạn nhân, dẫn đến việc trình duyệt thực thi mã đó.
Trong trường hợp này, máy chủ dễ bị tấn công thường là một trang web được tin tưởng hoặc quen thuộc. Các phương thức truyền tải mã khai thác XSS bao gồm: email lừa đảo (phishing), ứng dụng nhắn tin và các công cụ tìm kiếm.
XSS lưu trữ (Stored/Persistent XSS)
XSS lưu trữ xảy ra khi mã độc được lưu vĩnh viễn trên máy chủ (dễ bị tấn công hoặc độc hại), thường thông qua cơ sở dữ liệu. Các trang web có chức năng lưu trữ như blog (biểu mẫu bình luận), diễn đàn, hoặc các nơi lưu dữ liệu lâu dài thường là mục tiêu.
Ví dụ: một người dùng yêu cầu hiển thị dữ liệu từ máy chủ bị nhiễm, dẫn đến việc mã độc được đưa vào trình duyệt của nạn nhân từ dữ liệu đã được lưu trữ trước đó. Tương tự XSS phản chiếu, các trang bị lợi dụng trong kiểu tấn công này cũng thường là các trang đáng tin cậy.
XSS dựa trên DOM (DOM-based XSS)
DOM (Document Object Model) là giao diện lập trình ứng dụng (API) đa nền tảng và ngôn ngữ, coi tài liệu HTML, XHTML hoặc XML như một cấu trúc cây. Trong XSS dựa trên DOM, mã độc không được gửi tới máy chủ, mà chỉ được xử lý bởi trình duyệt của người dùng.
Tấn công kiểu này thường sử dụng liên kết độc hại. Khi nạn nhân nhấp vào liên kết, nó có thể tải một trang web độc hại hoặc một trang hợp pháp có hàm xử lý DOM dễ bị khai thác. Sau khi trang được trình duyệt dựng (render), mã độc sẽ được thực thi trong ngữ cảnh của nạn nhân.
Nguy cơ và ảnh hưởng
Điều nguy hiểm của XSS là nạn nhân thường không biết mình đã bị tấn công. Các ứng dụng web sử dụng DOM thường lưu trữ dữ liệu nhạy cảm ở phía client bằng biến toàn cục, như:
👉 Lưu ý: Tuyệt đối không lưu trữ thông tin nhạy cảm trong DOM khi xây dựng ứng dụng web.
Khai thác XSS có thể gây hậu quả nghiêm trọng, bao gồm:
Điểm chung của các tấn công XSS
Dù vector tấn công khác nhau, hậu quả đều tương tự nhau. XSS là lỗ hổng nằm ở ứng dụng web, nhưng mục tiêu tấn công lại là người dùng cuối. Các vị trí dễ phát sinh XSS bao gồm:
Cross-site scripting (thường gọi tắt là XSS) là một trong những lỗ hổng phổ biến nhất trên các ứng dụng web hiện nay. Các lỗ hổng XSS được phân loại thành ba nhóm chính:
- XSS phản chiếu (Reflected XSS)
- XSS lưu trữ (Stored/Persistent XSS)
- XSS dựa trên DOM (DOM-based XSS)
Kẻ tấn công có thể sử dụng các kỹ thuật làm rối (obfuscation) trong các cuộc tấn công XSS bằng cách mã hóa các thẻ HTML hoặc đoạn mã độc hại dưới dạng Unicode, khiến nội dung độc hại trông giống như bình thường đối với người dùng cuối khi họ duyệt trang.
XSS phản chiếu (Reflected XSS)
Cuộc tấn công XSS phản chiếu (hay còn gọi là XSS không lưu trữ) xảy ra khi mã độc được tiêm vào ứng dụng web dễ bị tấn công và phản hồi lại người dùng như một phần của yêu cầu HTTP hợp lệ. Một ví dụ là người dùng bị dụ nhấp vào một liên kết độc hại dẫn đến một máy chủ dễ bị tấn công. Máy chủ này phản chiếu mã độc trở lại trình duyệt của nạn nhân, dẫn đến việc trình duyệt thực thi mã đó.
Trong trường hợp này, máy chủ dễ bị tấn công thường là một trang web được tin tưởng hoặc quen thuộc. Các phương thức truyền tải mã khai thác XSS bao gồm: email lừa đảo (phishing), ứng dụng nhắn tin và các công cụ tìm kiếm.
XSS lưu trữ (Stored/Persistent XSS)
XSS lưu trữ xảy ra khi mã độc được lưu vĩnh viễn trên máy chủ (dễ bị tấn công hoặc độc hại), thường thông qua cơ sở dữ liệu. Các trang web có chức năng lưu trữ như blog (biểu mẫu bình luận), diễn đàn, hoặc các nơi lưu dữ liệu lâu dài thường là mục tiêu.
Ví dụ: một người dùng yêu cầu hiển thị dữ liệu từ máy chủ bị nhiễm, dẫn đến việc mã độc được đưa vào trình duyệt của nạn nhân từ dữ liệu đã được lưu trữ trước đó. Tương tự XSS phản chiếu, các trang bị lợi dụng trong kiểu tấn công này cũng thường là các trang đáng tin cậy.
XSS dựa trên DOM (DOM-based XSS)
DOM (Document Object Model) là giao diện lập trình ứng dụng (API) đa nền tảng và ngôn ngữ, coi tài liệu HTML, XHTML hoặc XML như một cấu trúc cây. Trong XSS dựa trên DOM, mã độc không được gửi tới máy chủ, mà chỉ được xử lý bởi trình duyệt của người dùng.
Tấn công kiểu này thường sử dụng liên kết độc hại. Khi nạn nhân nhấp vào liên kết, nó có thể tải một trang web độc hại hoặc một trang hợp pháp có hàm xử lý DOM dễ bị khai thác. Sau khi trang được trình duyệt dựng (render), mã độc sẽ được thực thi trong ngữ cảnh của nạn nhân.
Nguy cơ và ảnh hưởng
Điều nguy hiểm của XSS là nạn nhân thường không biết mình đã bị tấn công. Các ứng dụng web sử dụng DOM thường lưu trữ dữ liệu nhạy cảm ở phía client bằng biến toàn cục, như:
- Token truy cập
- URL hồ sơ cá nhân
- Liên kết riêng tư
- Giá trị OAuth xuyên miền
- Thậm chí là thông tin đăng nhập
👉 Lưu ý: Tuyệt đối không lưu trữ thông tin nhạy cảm trong DOM khi xây dựng ứng dụng web.
Khai thác XSS có thể gây hậu quả nghiêm trọng, bao gồm:
- Cài đặt hoặc thực thi mã độc
- Đánh cắp tài khoản
- Chiếm đoạt cookie phiên
- Rò rỉ hoặc thay đổi tệp cục bộ
- Chuyển hướng trang web
Điểm chung của các tấn công XSS
Dù vector tấn công khác nhau, hậu quả đều tương tự nhau. XSS là lỗ hổng nằm ở ứng dụng web, nhưng mục tiêu tấn công lại là người dùng cuối. Các vị trí dễ phát sinh XSS bao gồm:
- Trường tìm kiếm phản hồi lại chuỗi truy vấn
- Tiêu đề HTTP
- Trường nhập liệu phản hồi lại dữ liệu
- Thông báo lỗi có chứa văn bản do người dùng cung cấp
- Trường ẩn có chứa dữ liệu người dùng
- Ứng dụng hiển thị dữ liệu do người dùng cung cấp