Tìm kiếm và khai thác lỗ hổng CROSS-SITE SCRIPT INCLUSION (XSSI)

Bài viết này trình bày cách tìm kiếm, phân loại và khai thác lỗ hổng Cross-Site Script Inclusion (XSSI).

Giới thiệu Cross-Site Script Includsion (XSSI)

Lỗ hổng Cross-Site Script Includsion (XSSI) xảy ra khi tài nguyên của domain này được chèn qua domain khác thông qua thẻ SCRIPT. Nguy cơ lỗ hổng này phụ thuộc vào tính bí mật thông tin mà kẻ tấn công có thể thu thập được như thông tin người dùng, token, SESSION v.v

Thông qua thẻ SCRIPT, thông tin phiên giao dịch của người dùng như SESSION, Cookie cũng được gửi đi trong Request . Kết quả trả về từ Response sẽ bao gồm những thông tin mà người dùng đã xác thực.

Cơ chế bảo vệ Same-Origin-Policy (SOP) ở trình duyệt không được áp dụng vì mặc định, các scripts được quyền chèn vào nhau ở mỗi domain.

Kịch bản khai thác

Kẻ tấn công lừa người dùng vào một domain, trong đó có thẻ SCRIPT với src dẫn đến domain bị lỗ hổng XSSI và các đoạn mã khai thác để lấy thông tin người dùng.

Tìm kiếm lỗ hổng XSSI

Hiện tại, chưa có công cụ hỗ trợ tìm kiếm lỗ hổng XSSI hiệu quả. Tuy nhiên, thông qua các cảnh báo của Burpsuite, người dùng vẫn có thể phát hiện được các đường dẫn, tài nguyên có nguy cơ bị lỗi.

Sau khi phát hiện được các nguy cơ cảnh báo, phải thực hiện rà soát các thông tin trả về để tìm kiếm các dữ liệu nhạy cảm và quá trình này phải làm hoàn toàn bằng thủ công

Thông tin XSSI thông qua Burpsuite

Phân loại XSSI

Lỗ hổng XSSI được phân loại thông qua 4 trường hợp sau:

  1. Static Javascript: Thông tin nhạy cảm nằm ở trong tập tin javascript
  2. Static Javascript (Yêu cầu xác thực): Tương tự nhưng yêu cầu người dùng đăng nhập mới có thể truy cập
  3. Dynamic Javascript: Nội dung Javascript thay đổi phụ thuộc vào người dùng.
  4. Non-Javascript: Các tập tin có Content-type không phải là Javascript như CSV, HTML, TEXT…

Cách thức khai thác

Để khai thác lỗ hổng XSSI hiệu quả, cần có kiến thức cơ bản về lập trình Javascript để có thể tùy biến mã khai thác.

Tuy phân loại thành nhiều nhóm khác nhau nhưng khi khai thác sẽ chỉ gặp một số trường hợp sau

Regular XSSI (Static Javascript)

Nhóm Reguar XSSI xảy ra khi các dữ liệu nhạy cảm nằm ở các static script. Để phát hiện Regular XSSI, cần phải đọc nội dung của tập tin script và tìm kiếm các thông tin. Ví dụ

Tập tin http://example1.com/js/secret.js chứa thông tin token, apikey tương ứng với người dùng đã đăng nhập.

Lúc này, kẻ tấn công thực hiện chèn script cùng với mã khai thác sau vào domain http://example2.com/XSSI.html

Lúc này, người dùng truy cập thông qua domain http://example2.com/XSSI.html

Thông tin tập tin secret.js khi người dùng truy cập domain example2.com

Dynamic Javascript

Để phát hiện dynamic Javascript, cần thực hiện tạo từ 1 đến 2 Request và so sánh kết quả trả về từ các Request trên để phát hiện sự thay đổi (Dynamic). Việc này tốn khá nhiều thời gian khi thực hiện thủ công.

Hiện nay Burpsuite có hỗ trợ Extention DetectDynamicJS hỗ trợ làm tự động và phát hiện sự thay đổi. Quá trình gửi Request và so sánh Response sẽ được thực hiện thụ động.

Non-Script-XSSI

Non-Script-XSSI chỉ khai thác thành công khi Response Header không có tham số X-Content-Type-Options: nosniff

Ví dụ: Khi người dùng đăng nhập thành công sẽ có Response với Content-Type: text/html như sau:

Lúc này, mã khai thác:

Một số ví dụ khác:

  1. Khai thác thông qua tập tin CSV, tham khảo thêm tại https://www.mbsd.jp/Whitepaper/xssi.pdf
  2. Khai thác, lấy thông tin JSON từ Array bằng cách overriding Array Constructor tại http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/

Ngăn chặn XSSI

Một số khuyến nghị nhằm hạn chế lỗ hổng XSSI:

  1. Không đưa các thông tin nhạy cảm vào tập tin Javascript
  2. Không sử dụng JSONP
  3. Cấu hình chính xác Content-Type
  4. Thêm Header X-Content-Type-Options: nosniff ở Response.

Trình duyệt vẫn thực thi mã thông qua thẻ script ngay cả khi Content-Type trả về không phải Javascript. Để hạn chế việc này, cần cấu hình X-Content-Type-Options: nosniff ở Header Response

Kết quả khi cấu hình X-Content-Type-Options: nosniff

Tham khảo

Leave a Reply

Your email address will not be published. Required fields are marked *