XSS (Cross Site Scripting) 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. Đây 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) vào website sau đó sẽ được thực thi ở phía người dùng (trong trình duyệt của người dùng) và gửi về cho hacker những thông tin của người dùng thông qua cách thức do hacker định sẵn từ trước. Tuỳ thuộc vào mục đích của kẻ tấn công, mà những thông tin này có thể là:
-
Cookie: hacker có thể lấy được cookie của người dùng và dùng những thông tin trong cookie để giả mạo phiên truy cập hoặc lấy những thông tin nhạy cảm khác được lưu trong cookie.
-
Keylogging: hacker có thể ghi lại những thao tác gõ phím của người dùng bằng cách sử dụng sự kiện trong Javascript và gửi tất cả những thao tác gõ phím đó về cho hắn để thực hiện những mục đích như đánh cắp các thông tin nhạy cảm, lấy mật khẩu truy cập website hoặc mã số thẻ tín dụng…
-
Phishing: hacker có thể thay đổi giao diện của website bằng cách thay đổi cấu trúc HTML trong trang web để đánh lừa người dùng. Hacker có thể tạo ra những form đăng nhập giả nhằm lừa người dùng đăng nhập vào để đánh cắp mật khẩu.
Các dạng tấn công XSS:
XSS nói chung được chia làm ba loại chính:
- Stored XSS Attacks
- Reflected XSS Attacks
- DOM Based XSS Attacks
Stored XSS Attacks
Stored XSS là dạng tấn công mà hacker chèn trực tiếp các mã độc vào cơ sở dữ liệu của website. Dạng tấn công này xảy ra khi các dữ liệu được gửi lên server không được kiểm tra kỹ lưỡng mà lưu trực tiếp vào cơ sở dữ liệu. Khi người dùng truy cập vào trang web này thì những đoạn script độc hại sẽ được thực thi chung với quá trình load trang web. Ví dụ như cácform góp ý, các comments… trên trang web
Dạng tấn công Stored XSS được thực hiện như sau:
- Trước tiên, hacker sẽ khai thác lỗi Stored XSS trên website bằng cách tìm những form (khung đăng ký, khung comment, khung liên hệ …) không được kiểm tra kỹ dữ liệu đầu vào và tiến hành chèn các đoạn mã độc vào cơ sở dữ liệu.
- Sau đó khi người dùng truy cập vào trang web có chứa dữ liệu liên quan đến cơ sở dữ liệu này thì ngay lập tức, các đoạn script độc hại sẽ được chạy chung với trang web.
- Khi các đoạn script được thực thi, tuỳ vào mục đích của hacker, các đoạn script sẽ gửi về cho hacker nhũng thông thông tin như cookie, session token … đến đây, coi như quá trình tấn công của hacker đã thành công. Hình sau đây sẽ mô tả các bước thực hiện kĩ thuật tấn công này:
Reflected XSS Attacks
Reflected XSS là dạng tấn công thường gặp nhất trong các loại hình XSS (Có đến 75% kỹ thuật XSS dựa trên Reflected XSS). Với Reflected XSS, hacker không gửi dữ liệu độc hại để chèn vào cơ sở dữ liệu của website, mà gửi trực tiếp link có chứa mã độc cho người dùng, khi người dùng click vào link này thì trang web sẽ được load chung với các đoạn script độc hại. Có nhiều hướng để khai thác thông qua lỗi Reflected XSS, một trong những cách được biết đến nhiều nhất là chiếm phiên làm việc (session) của người dùng, từ đó có thể truy cập được dữ liệu và chiếm được quyền của họ trên website.
Dạng tấn công bằng Reflected XSS được mô tả như sau:
Khi người dùng đăng nhập vào website và giả sử được gán một cookie:
session_id: 715297f1-ee2e-2751-0d2f-08b0ddc1ec70
Bằng cách nào đó, kẻ tấn công gửi được cho người dùng URL:
http://example.com/search?q=<script>alert(<script>alert(document.cookie);</script>);</script>
Khi nạn nhân click vào đường link được hacker gửi. Server phản hồi cho nạn nhân, kèm với dữ liệu có trong request(đoạn javascript của hacker). Sau đó trình duyệt nhận phản hồi từ server sẽ load trang web và thực thi các đoạn script kèm theo, sau đó gửi về cho hacker những thông tin của nạn nhân.
DOM Based XSS Attacks
DOM viết tắt của Document Object Model là 1 dạng chuẩn của W3C đưa ra nhằm để truy xuất và thao tác dữ liệu của tài liệu có cấu trúc như HTML, XML. Mô hình này thể hiện tài liệu dưới dạng cấu trúc cây phân cấp. Tất cả các thành phần trong HTML, XML đều được xem như một node.
DOM Based XSS là kỹ thuật khai thác XSS dựa trên việc thay đổi cấu trúc DOM của tài liệu, cụ thể là HTML. Để hiểu rõ hơn về DOM-based XSS chúng ta cùng xem xét ví dụ sau:
Một website có URL đến trang đăng nhập như sau:
http://127.0.0.1:5000/login?message=Please login to start your session
Khi truy cập đến thì chúng ta thấy một form đăng nhập rất bình thường.
Có thể dễ dàng nhận thấy tham số message truyền vào nội dung thông báo trên form, source code của đoạn thông báo này như sau:
<div class="form-group">
<script>
var pos=document.URL.indexOf("message=")+8;
document.write(decodeURIComponent(document.URL.substring(pos,document.URL.length)));
</script>
</div>
Đoạn JavaScript có nhiệm vụ lấy giá trị từ tham số message và in ra. Từ việc kiểm tra đầu vào lỏng lẻo này, hoàn toàn có thể lừa người dùng truy cập các URL nguy hiểm. Ví dụ:
http://127.0.0.1:5000/login?message=<select class = "form-control" onchange="java_script_:show()"><option value="Vietnamese">Vietnamese</option><option value="English">English</option></select><script>function show(){alert("XSS");}</script>
Khi đấy Form đăng ký sẽ trở thành thế này:
Người dùng sẽ chẳng chút nghi ngờ với một form “bình thường” như thế này, và khi lựa chọn ngôn ngữ, script sẽ được thực thi. Chúng ta có thể thấy rằng mã độc đã được thực thi ngay khi click vào giá trị trong thẻ select, tức là được thực thi ngay ở phía client mà không cần thông qua response của server
Kết luận
- Để khai thác Reflected XSS, hacker phải lừa được nạn nhân truy cập vào URL của mình. Còn Stored XSS không cần phải thực hiện việc này, sau khi chèn được mã nguy hiểm vào CSDL của ứng dụng, hacker chỉ việc ngồi chờ nạn nhân tự động truy cập vào. Với nạn nhân, việc này là hoàn toàn bình thường vì họ không hề hay biết dữ liệu mình truy cập đã bị nhiễm độc.
- Mục tiêu của hacker sẽ dễ dàng đạt được hơn nếu tại thời điểm tấn công nạn nhân vẫn trong phiên làm việc(session) của ứng dụng web. Với Reflected XSS, hacker có thể thuyết phục hay lừa nạn nhân đăng nhập rồi truy cập đến URL mà hắn ta cung cấp để thực thi mã độc. Nhưng Stored XSS thì khác, vì mã độc đã được lưu trong CSDL Web nên bất cứ khi nào người dùng truy cập các chức năng liên quan thì mã độc sẽ được thực thi, và nhiều khả năng là những chức năng này yêu cầu phải xác thực(đăng nhập) trước nên hiển nhiên trong thời gian này người dùng vẫn đang trong phiên làm việc.
- DOM Based XSS giống với Reflected hơn là Stored XSS khi phải lừa người dùng truy cập vào một URL đã nhúng mã độc. Điểm khác biệt giữa DOM Base XSS so với Reflected và Stored XSS là kĩ thuật này được thực thi ở phía client mà không cần thông qua response của server.
Tôi có viết một webapp nhỏ bằng flask demo cho 3 loại XSS này. Chi tiết source code các bạn có thể xem tại: github.com