Stored XSS là gì? Cách kiểm tra lỗ hổng và phòng tránh

Stored XSS là một trong những lỗ hổng bảo mật nguy hiểm mà bạn có thể gặp phải khi duyệt web. Trong bài viết này, hãy cùng ttnguyen.net tìm hiểu về stored xss là gì?, kịch bản tấn công và ví dụ minh họa. Bắt đầu thôi!

Xem thêm:

dom-based xss

hướng dẫn cài đặt wireshark

Stored XSS là gì?

Stored XSS (Stored Cross-Site Scripting) là một loại tấn công XSS, trong đó đoạn mã JavaScript độc hại được lưu trữ trên cơ sở dữ liệu của ứng dụng web. Ví dụ như bình luận, biểu mẫu hoặc hồ sơ người dùng,… Khi trang web hiển thị nội dung cho người dùng, mã JavaScript độc hại sẽ được thực thi.

Lỗ hổng này xuất hiện khi ứng dụng web không kiểm tra kỹ các dữ liệu đầu vào trước khi lưu vào cơ sở dữ liệu.

Ai là nạn nhân của cuộc tấn công này?

Nếu như nạn nhân của lỗ hổng reflected XSS là những người nhấp vào URL chứa mã độc hại. Thì đối với stored XSS, nạn nhân là những người truy cập vào chức năng liên quan đến mã độc vì lúc này hacker đã chèn code vào trong cơ sở dữ liệu của ứng dụng web. Do đó, loại tấn công này ảnh hướng đến nhiều nạn nhân hơn.

Mục tiêu của cuộc tấn công stored cross-site scripting

Khi người dùng bị tấn công, kẻ tấn công có thể đánh cắp thông tin cá nhân như tài khoản, thẻ tín dụng, cookie,… hoặc thay đổi thông tin, thực hiện các giao dịch trái phép hay lan truyền mã độc.

Kịch bản tấn công Stored XSS thực tế

Bước 1: Kẻ tấn công tạo một đoạn mã JavaScript độc hại và chèn đoạn mã đó vào một trường dữ liệu (ví dụ: bình luận, tin nhắn, tải lên tệp, hoặc cập nhật thông tin người dùng) trên trang web dễ bị tấn công.

Bước 2: Máy chủ web nhận dữ liệu và lưu trữ trong cơ sở dữ liệu hoặc các vị trí khác.

Bước 3: Khi người dùng truy cập trang chứa stored XSS, trang web sẽ hiển thị dữ liệu và thực thi đoạn mã JavaScript độc hại được lưu trữ.

Bước 4: Đoạn mã JavaScript độc hại thực hiện hành động tấn công, chẳng hạn như đánh cắp thông tin người dùng, thay đổi nội dung trang web, hoặc thực hiện các hành động không mong muốn khác.

Kịch bản tấn công Stored XSS

Ví dụ tấn công stored XSS

Trong bài viết này, mình sẽ thực hiện khai thác lỗ hổng Stored XSS trong môi trường thực hành DVWA.

Xem thêm:

Hướng dẫn cách cài đặt DVWA trên Windows bằng Xampp

Mức độ 1: Security low

Ở đây có hai trường Name và Message.

Stored XSS

Bây giờ, mình sẽ thử một đoạn mã JavaScript <script>alert('Hi')</script>. Bấm vào Sign Guestbook để gửi tin nhắn. Nếu trang web này bị tấn công thì chúng ta sẽ nhận được một cửa sổ bật lên khi chúng ta tải lại trang này.

Stored XSS DVWA security low

Như vậy chúng ta đã khai thác thành công Stored XSS tại low security. Bây giờ, mỗi lần chúng ta làm mới trang, chúng ta sẽ nhận được hộp cảnh báo vì mã độc đã được lưu trữ.

Nếu muốn khai thác lỗ hổng này ở các cấp độ bảo mật khác, trước tiên chúng ta phải xóa Guestbook nếu không chúng ta sẽ nhận được hộp cảnh báo này nhiều lần. Vì vậy, hãy nhấp vào Clear Guestbook để xóa payload XSS.

Stored XSS DVWA clear guestbook

Mức độ 2: Security medium

Chúng ta sẽ làm theo các bước tương tự như ở mức low-security. Tuy nhiên, khi làm mới trang, chúng ta không nhận được bất kỳ pop up nào. Tại sao chúng ta không nhận được bất kỳ thông báo cảnh báo nào mặc dù chúng ta đã nhập mã JavaScript hợp lệ? Chúng ta hãy xem mã nguồn của trang máy chủ đang chấp nhận dữ liệu người dùng.

Stored XSS Source
vulnerabilities/xss_s/source/medium.php
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

Như chúng ta có thể thấy, ở khối đầu tiên. Nó đã xóa tất cả các thẻ HTML trong trường message trước khi lưu trữ chúng vào cơ sở dữ liệu.

Còn ở khối thứ hai, nó chuyển đổi tất cả các ký tự đặc biệt như &, “, ‘, > and < để nó không thể ở dạng code HTML.

Chúng ta có thể vượt qua lớp bảo mật này bằng cách biến đổi một chút, ví dụ như <Script>, <ScRiPt> hoặc <scRiPt> thay cho <script>. Chúng ta hãy thử đoạn mã <Script>alert("Hacked")</Script> trong trường Name. Tuy nhiên, trường Name hạn chế người dùng nhập tối đa 10 ký tự. Do đó chúng ta phải thay đổi độ dài tối ta của trường để thực thi đoạn mã.

Stored XSS DVWA Medium

Stored XSS DVWA Medium

Và bây giờ chúng ta nhấn Sign Guestbook để lưu đoạn mã vào trong cơ sở dữ liệu.

Mức độ 3: Security high

Ở mức bảo mật này, form đã được kiểm soát đầu vào nghiêm ngặt hơn. Để vượt qua level này chúng ta sử dụng đoạn mã <svg/onload=alert("Hacked")> vào trong trường Name.

Stored XSS DVWA High

Chúng ta nhận được một cửa số thông báo xác nhận rằng chúng ta đã khai thác thành công lỗ hổng Stored XSS.

Cách tìm và kiểm tra lỗ hổng XSS stored

Tìm và kiểm tra lỗ hổng Stored XSS liên quan đến việc xác định những nơi có thể chèn mã độc. Ngoài việc sử dụng các công cụ quét lỗ hổng như OWASP ZAP, Burp Suite hoặc Nessus,… Ta có thể kiểm tra bằng cách thủ công. Dưới đây là cách cơ bản để giúp bạn phát hiện lỗ hổng Stored XSS:

Kiểm soát các trường đầu vào: Xác định các trường đầu vào, chẳng hạn như ô văn bản, thanh tìm kiếm và phần bình luận, nơi nội dung do người dùng tạo có thể được lưu trữ hoặc hiển thị.

Gửi mã: Chèn mã <script>alert(‘Stored XSS’)</script> vào các trường đầu vào và gửi biểu mẫu hoặc lưu nội dung. Mã code sẽ được lưu trữ trong cơ sở dữ liệu của ứng dụng.

– Truy cập nội dung đã lưu: Truy cập trang hoặc vị trí nơi nội dung đã chèn được hiển thị. Nếu mã JavaScript được thực thi khi bạn truy cập trang, bạn đã tìm thấy lỗ hổng Stored XSS.

Các phòng tránh

  • Xác thực đầu vào nội dung (Escape Dynamic Content).
  • Danh sách giá trị cho phép (Allowlist Values).
  • Triển khai Chính sách bảo mật nội dung (Implement a Content-Security Policy).

XSS Stored thường thấy nhất trong

  • Diễn đàn hoặc Bảng tin
  • Bình luận blog của bất kỳ bài viết
  • Giỏ hàng của website thương mại điện tử
  • Trang hồ sơ người dùng : chỉnh sửa các chi tiết hồ sơ như tên , họ , biệt danh , hình đại diện , hình ảnh , địa chỉ , v.v.
  • Trình quản lý tệp : ứng dụng cho phép tải tệp lên
  • Cài đặt hoặc tùy chọn ứng dụng: một ứng dụng cho phép người dùng đặt tùy chọn
  • Nhật ký: nếu ứng dụng lưu trữ thông tin nhập của một số người dùng vào nhật ký.

Trên đây là những thông tin cơ bản về Stored XSS. Việc hiểu rõ lỗ hổng này sẽ giúp bạn an toàn hơn khi duyệt web và củng cố thêm kiến thức về an ninh mạng máy tính.

Bài viết liên quan:

hàm băm là gì

các dạng tấn công trên DHCP

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em