Tấn công Cross-Site Scripting (XSS) được coi là một trong những cuộc tấn công tiêm (injection) diễn ra tràn lan nhất nhưng dễ dàng khắc phục nhất đối với các doanh nghiệp thương mại điện tử và nhiều ứng dụng web khác. Từ việc nhắm mục tiêu vào các ứng dụng được xây dựng trên công nghệ web cũ đến các ứng dụng mới hơn sử dụng UI phía client phong phú, XSS đã quấy rối tất cả. Tuy nhiên, điều quan trọng là phải nhận ra rằng các lỗ hổng tiềm ẩn gây ra cuộc tấn công XSS có thể được phát hiện và khắc phục kịp thời.
Làm thế nào một cuộc tấn công Cross-site scripting xảy ra?
Một cuộc tấn công cross-site scripting (XSS) xảy ra khi
- Một ứng dụng web yêu cầu dữ liệu đầu vào qua một nguồn không tin cậy
- Nội dung động được nhập qua yêu cầu web được sử dụng mà không được kiểm tra xem có chứa mã độc hay không.
Một ví dụ đơn giản về dữ liệu đầu vào như vậy là khi chúng ta gửi tên, email, tên người dùng-mật khẩu hoặc bất kỳ đầu vào nào trong một biểu mẫu. Mỗi đầu vào đã nhập ở trên có thể bị thao túng nếu mã bên dưới không xác thực đúng cách các đầu vào. Kẻ tấn công利用 sự không thể này để chèn nội dung độc hại, thường dưới dạng mã JavaScript, HTML hoặc bất kỳ dạng mã nào có thể thực thi bởi trình duyệt. Người dùng cuối không có cách nào để nghi ngờ kịch bản không tin cậy và sẽ kết thúc việc thực thi nó. Một khi đã tiêm, kịch bản có quyền truy cập vào bất kỳ cookie, session token hoặc thông tin nhạy cảm nào được trang web này sử dụng.
Một cuộc tấn công XSS có 3 loại:
- Tấn công dựa trên DOM: Do chèn mã độc từ phía client. Mã được chèn có thể là JavaScript, Flash, Visual Basic, v.v.
- Tấn công XSS Persistent (Lưu trữ): Xảy ra khi payload được lưu trữ phía máy chủ và được truy xuất khi có yêu cầu người dùng đến một trang
- Tấn công XSS Non-Persistent (Phản chiếu): Xảy ra khi payload được phản chiếu trở lại người dùng bằng cách mở liên kết đến một trang web dễ bị tổn thương với đầu vào được chế tác.
Cấu trúc của một cuộc tấn công Cross-site scripting (XSS)
Kẻ tấn công khai thác XSS như thế nào?
Thông thường, kẻ tấn công sử dụng lỗ hổng XSS để trích xuất cookie phiên của người dùng cuối, cuối cùng cho phép kẻ tấn công truy cập tài khoản của người dùng. Một ví dụ về kịch bản trên là:
- Trang web bạn truy cập có trường bình luận.
- Kẻ tấn công đăng payload sau vào phần bình luận.
- Ngay khi bất kỳ người dùng hợp pháp nào mở hộp bình luận để xem bình luận sau, HTML phân tích cú pháp kịch bản này.
- Khi HTML được phân tích cú pháp bởi trình duyệt, cookie của người dùng được gửi đến máy chủ của kẻ tấn công.
Lỗ hổng đơn giản này, nếu tồn tại trong ứng dụng web của bạn, có thể có hệ quả rất nghiêm trọng. Một khai thác XSS phổ biến khác là khi kẻ tấn công sử dụng ứng dụng của bạn cho drive-by downloads, nơi kẻ tấn công khiến người dùng cuối tải xuống mã độc mà không hay biết, bằng cách nhấp vào các liên kết trông hợp pháp.
Các vụ Cross-Site Scripting nổi tiếng
Các cuộc tấn công XSS chủ yếu xảy ra vì lợi ích tài chính, một vụ đáng chú ý là vụ tấn công trong quá khứ chống lại géant thương mại điện tử eBay. Hacker đã chèn mã JavaScript độc hại vào một số listing iPhone giá rẻ, điều này chuyển hướng người dùng đến một trang đăng nhập giả được tạo để xâm phạm thông tin đăng nhập của người dùng.
Ngoài các trang web thương mại điện tử, một số trang web mạng xã hội cũng đã bị các cuộc tấn công'infamous' tương tự. Twitter曾 bị nhắm mục tiêu bởi một con giun XSS dẫn đến các liên kết độc hại được ghim trên một trang web tên là StalkDaily. Một cuộc tấn công XSS nổi tiếng khác là cuộc tấn công MySpace bởi con giun Samy – một virus lành tính làm thay đổi trang hồ sơ của người dùng MySpace và gửi yêu cầu kết bạn ngẫu nhiên.
Các biện pháp phòng ngừa để giảm thiểu tấn công XSS
Ngăn chặn tấn công XSS không có nghĩa là vô hiệu hóa người dùng nhập payload của họ, mà là采取措施阻止它被浏览器解析为HTML。也就是说,这里有几种用于防止XSS攻击的方法。
-
Xác thực đầu vào
Để ngăn chặn XSS, hãy whitelist hầu hết đầu vào thành chữ và số hoặc trong một số trường hợp, ký tự đặc biệt. Điều này sẽ giảm bề mặt tấn công và tối thiểu hóa tiềm năng lỗi.
-
Sử dụng các phần tử DOM an toàn
Thường xuyên, việc xử lý không an toàn các phần tử DOM (document object model) dẫn đến tấn công XSS ngay cả trong các UI client phong phú. Ví dụ, sử dụng thuộc tính innerHTML hiển thị đầu vào người dùng dưới dạng XSS với các sự kiện JavaScript. Trong trường hợp này, phương án an toàn thay thế là sử dụng contentText hoặc innerText.
-
JavaScript Escaping
Escape dấu nháy đơn có thể ngăn chặn tiêm mã trong JavaScript. HTML encoding sử dụng dấu nháy đơn với ' nên được dùng để ngăn chặn vấn đề tiêm mã.
-
Output Encoding
Output encoding làm việc tuyệt vời khi nói đến việc trung hòa tối đa các payload XSS. Phương pháp này hoạt động để giảm thiểu các cuộc tấn công tiêm mã phía máy chủ. Mặc dù HTML encoding là một phương pháp khá phổ biến, URL encoding có thể giúp loại bỏ bất kỳ sự tiêm mã nào của markup trong liên kết và chuyển hướng.