MIME Sniffing là gì? Cách để bảo vệ website khỏi cuộc tấn công "dò tìm" MIME

MIME Sniffing là gì? Cách để bảo vệ website khỏi cuộc tấn công "dò tìm" MIME

Tin ngắn hàng ngày dành cho bạn
  • Từ lâu rồi suy nghĩ làm thế nào để tăng sự hiện diện thương hiệu, cũng như người dùng cho blog. Nghĩ đi nghĩ lại thì chỉ có cách chia sẻ lên mạng xã hội hoặc trông chờ họ tìm kiếm, cho đến khi...

    In cái áo này được cái tắc đường khỏi phải lăn tăn, càng đông càng vui vì hàng trăm con mắt nhìn thấy cơ mà 🤓

    (Có tác dụng thật nha 🤭)

    » Xem thêm
  • Một vòng của sự phát triển nhiều dự án khá là thú vị. Tóm tắt lại trong 3 bước: Thấy một cái gì đó phức tạp -> Làm cho nó đơn giản đi -> Thêm thắt tính năng cho đến khi nó phức tạp... -> Quay trở lại vòng lặp mới.

    Tại sao lại như vậy? Để mình lấy 2 ví dụ cho các bạn thấy.

    Markdown ra đời với mục tiêu tạo ra một định dạng văn bản thô "dễ viết, dễ đọc, dễ dàng chuyển thành một dạng gì đó như HTML". Vì thời đó chẳng ai đủ kiên nhẫn mà vừa ngồi viết vừa thêm định dạng cho văn bản hiển thị ở trên web như thế nào. Ấy vậy mà giờ đây người ta đang "nhồi nhét" hoặc tạo ra các biến thể dựa trên markdown để bổ sung thêm nhiều định dạng mới đến mức... chẳng nhớ nổi hết cú pháp.

    React cũng là một ví dụ. Từ thời PHP, việc khát khao tạo ra một cái gì đó tách biệt hẳn giao diện người dùng và phần xử lý logic chính của ứng dụng thành 2 phần riêng biệt cho dễ đọc, dễ viết. Kết quả là các thư viện UI/UX phát triển rất mạnh mẽ, mang lại khả năng tương tác với người dùng rất tốt, còn phần logic ứng dụng thì nằm ở một máy chủ riêng biệt. Bộ đôi Front-end, Back-end cũng từ đấy mà thịnh hành, không thể thiếu anh bồi bàn REST API. Ấy vậy mà giờ đây React trông cũng không khác biệt gì so với PHP là mấy, kéo theo là cả Vue, Svelte... lại cùng quy tất cả về một mối.

    Cơ mà không phải vòng lặp là xấu, ngược lại vòng lặp này mang tính tiến hoá nhiều hơn là "cải lùi". Nhiều khi lại tạo ra được cái hay hơi cái cũ thế là người ta lại dựa trên cái hay đó để tiếp tục lặp. Nói cách khác là chắc lọc tinh hoa từng tí một tí một á 😁

    » Xem thêm
  • Song song với các dự án chính thức thì thi thoảng mình vẫn thấy các dự án "bên lề" nhằm tối ưu hoặc cải tiến ngôn ngữ theo khía cạnh nào đó. Ví dụ nature-lang/nature là một dự án hướng tới cải tiến Go, mang lại một số thay đổi nhằm giúp cho việc sử dụng Go trở nên thân thiện hơn.

    Nhìn lại mới thấy hao hao JavaScript 😆

    » Xem thêm

Vấn đề

Có thể bạn đã biết, song song với việc bảo mật website ở máy chủ để đảm bảo không ai có thể truy cập được để thực hiện hành vi trái phép, thì bảo mật phía máy khách (client) cũng không hề được xem nhẹ. Mỗi năm, các trình duyệt web phổ biến luôn được cập nhật thêm các bản vá lỗ hổng bảo mật kèm với việc bổ sung các đặc tả kĩ thuật nhằm tăng tính bảo mật hơn cho trình duyệt của họ. Một trình duyệt có thể bảo vệ người dùng tối đa thì ai mà chẳng muốn sử dụng.

MIME types là một trong những đặc tả cho biết bản chất và định dạng của tài liệu, tệp hoặc phân loại byte. Lấy một ví dụ đơn giản cho dễ hình dung là một endpoint API nếu trong headers trả về có chứa thuộc tính Content-Type: application/json thì ngay lập tức client sẽ biết dữ liệu trả về là ở định dạng JSON, từ đó có phương án xử lý phù hợp thay vì phải cố "đoán" xem dữ liệu trả về là text, image hay video...

content-type image

Nếu không có Content-Type hoặc ở một số trình duyệt không "thích" kiểm tra Content-Type thì nó sẽ tiến hành một cuộc "dò tìm" xem dữ liệu trả về ở dạng nào. Điều này vô tình tạo ra một cuộc tấn công gọi là "MIME Sniffing".

MIME Sniffing là gì?

MIME Sniffing đã và đang là một kỹ thuật được một số trình duyệt web (chủ yếu là Internet Explorer) sử dụng để kiểm tra nội dung của một nội dung cụ thể. Việc này được thực hiện nhằm mục đích xác định định dạng tệp của nội dung phản hồi. Kỹ thuật này hữu ích trong trường hợp không có đủ thông tin như Content-Type cho một nội dung cụ thể, do đó có khả năng trình duyệt diễn giải nội dung không chính xác.

Mặc dù việc dò tìm MIME có thể hữu ích để xác định định dạng tệp chính xác của nội dung nhưng nó cũng có thể gây ra lỗ hổng bảo mật. Lỗ hổng này có thể khá nguy hiểm cho cả chủ sở hữu cũng như khách truy cập trang web. Điều này là do kẻ tấn công có thể tận dụng khả năng "dò tìm" MIME để thực hiện một cuộc tấn công XSS (Cross Site Scripting).

Mô tả quá trình MIME Sniffing khá đơn giản. Bao gồm các bước chính sau:

  • Trình duyệt web yêu cầu một nội dung cụ thể phản hồi không có loại nội dung hoặc loại nội dung được đặt trước đó tại máy chủ gốc.
  • Trình duyệt web "dò tìm" nội dung để phân tích nội dung cụ thể đó là định dạng tệp nào.
  • Khi trình duyệt đã hoàn thành phân tích, nó sẽ so sánh những gì nó tìm thấy với những gì máy chủ web cung cấp trong Content-Type tiêu đề (nếu có). Nếu có sự không khớp, trình duyệt sẽ sử dụng loại MIME mà nó xác định là được liên kết với nội dung.

Giả sử trang web của bạn cho phép người dùng upload tệp tin lên máy chủ. Bạn chỉ chấp nhận định dạng ảnh cụ thể là JPG. Kẻ tấn công nhanh trí đổi đuôi một tệp HTML thành .jpg rồi tải tệp lên. Khi đó nếu trình duyệt thực hiện "dò tìm" MIME khi cố gắng hiển thị hình ảnh, khả năng cao đoạn mã HTML sẽ được thực thi ở trình duyệt.

Cách thiết lập ngăn trình duyệt dò tìm MIME

Hầu hết các trình duyệt hiện nay đều tôn trọng tiêu đề này, bao gồm Chrome/Chromium, Edge, IE >= 8.0, Firefox >= 50 và Safari >= 11.

trình duyệt hỗ trợ nosniff

Để thiết lập, bạn chỉ cần đặt X-Content-Type-Options: nosniff trong phản hồi của headers HTTP của máy chủ.

Ví dụ, nếu bạn đang dùng nginx làm máy chủ.

server {
    listen 443 ssl;

    ...

    add_header X-Content-Type-Options nosniff;
    ...

Tổng kết

Mặc dù ngày nay cơ chế bảo mật này có thể là thiết lập mặc định hoặc là cấu hình "không thể thiếu" của máy chủ web. Tuy nhiên tôi hy vọng qua bài viết này cung cấp cho bạn đọc thêm một góc nhìn về tầm quan trọng của các đặc tả kỹ thuật, cũng như các hành vi có thể bị khai thác để sử dụng trong mục đích xấu bất kì lúc nào.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Update Group2 năm trước

Anh ơi viết bài về funtor, monad, Applicative, Monoid đi ạ

Trả lời