Các ứng dụng web hỗ trợ tải tệp lên đã trở nên thiết yếu đối với nhiều tổ chức, đóng vai trò là cổng thông tin cho khách hàng, đối tác và nhân viên chia sẻ nhiều loại tài liệu và tệp khác nhau. Ví dụ, một công ty nhân sự có thể cho phép người dùng tải sơ yếu lý lịch lên hoặc một công ty có thể giúp các đối tác chia sẻ tệp dễ dàng hơn thông qua một nền tảng web chuyên biệt.
Ngay cả với các biện pháp bảo mật nâng cao và quy trình xác thực chặt chẽ hơn, kẻ tấn công vẫn tiếp tục khai thác lỗ hổng bằng các phương pháp tinh vi. Các tệp có vẻ vô hại, chẳng hạn như hình ảnh, có thể bị thao túng để xâm phạm tính bảo mật của máy chủ web.
Tệp đa ngôn ngữ là tệp có thể hợp lệ dưới nhiều loại cùng lúc, cho phép kẻ tấn công bỏ qua các biện pháp bảo mật dựa trên loại tệp. Ví dụ bao gồm GIFAR, có chức năng như cả tệp GIF và tệp RAR, tệp đa ngôn ngữ JavaScript/JPEG được diễn giải là cả JavaScript và JPEG, và tệp Phar-JPEG, được nhận dạng là cả tệp lưu trữ Phar và ảnh JPEG. Các tệp đa ngôn ngữ này có thể không bị phát hiện bằng các phần mở rộng lừa đảo hoặc rỗng "lừa" hệ thống nghĩ rằng chúng là loại tệp lành tính (như hình ảnh hoặc PDF) trong khi chứa mã độc hại không bị phát hiện.
Xác thực tải tệp lên
Cho phép người dùng tải tệp lên mà không có xác thực phù hợp hoặc toàn diện gây ra mối đe dọa đáng kể cho các ứng dụng web. Nếu kẻ tấn công tải thành công tệp độc hại, chẳng hạn như web shell, chúng có khả năng kiểm soát máy chủ, xâm phạm cả hệ thống và dữ liệu nhạy cảm. Để giảm thiểu những rủi ro này, các biện pháp thực hành tốt nhất đã được thiết lập để hướng dẫn các nhà phát triển áp dụng các biện pháp xác thực hiệu quả. Các biện pháp thực hành này giúp đảm bảo xử lý an toàn các tệp tải lên, do đó giảm thiểu rủi ro bị khai thác.
Các lĩnh vực trọng tâm để bảo mật việc tải tệp lên bao gồm:
- Xác thực phần mở rộng: Triển khai danh sách chặn hoặc danh sách cho phép các phần mở rộng tệp để đảm bảo chỉ chấp nhận các loại tệp được phép.
- Vệ sinh tên tệp: Tạo chuỗi ngẫu nhiên cho tên tệp khi tải lên.
- Xác thực loại nội dung: Xác minh loại MIME của tệp được tải lên để đảm bảo rằng nó khớp với định dạng mong muốn.
- Xác thực tiêu đề hình ảnh: Khi tải hình ảnh lên, có thể sử dụng các hàm như getimagesize() trong PHP để xác nhận tính hợp lệ của tệp bằng cách kiểm tra tiêu đề của tệp.
Bỏ qua bộ lọc tải tệp lên
Mặc dù đã triển khai các biện pháp bảo vệ này, những kẻ tấn công vẫn liên tục tinh chỉnh các phương pháp của chúng để vượt qua các cơ chế xác thực. Các kỹ thuật như chèn ký tự null, phần mở rộng kép và phần mở rộng rỗng có thể làm suy yếu xác thực phần mở rộng: một tệp có thể xuất hiện với tên như "file.php.jpg", "file.php%00.jpg", "file.PhP" hoặc "file.php/" để tránh bị phát hiện. Xác thực kiểu MIME có thể bị bỏ qua bằng cách sửa đổi các byte ma thuật ban đầu của tệp, chẳng hạn như thay đổi chúng thành GIF89a, tiêu đề được liên kết với các tệp GIF, có thể đánh lừa hệ thống xác định tệp là định dạng hợp lệ. Ngoài ra, một tệp .htaccess độc hại có thể được tải lên để thao túng cấu hình máy chủ, cho phép thực thi các tệp có phần mở rộng trái phép.
Tấn công tập tin đa ngôn ngữ
Ngay cả khi triển khai các quy trình xác thực nghiêm ngặt kết hợp nhiều biện pháp bảo mật để ngăn chặn kỹ thuật bỏ qua bộ lọc tải tệp lên, các cuộc tấn công tinh vi nhắm vào các tệp đa ngôn ngữ hoặc hình ảnh đa ngôn ngữ vẫn là mối đe dọa bảo mật đáng kể. Phương pháp này cho phép kẻ tấn công tạo các tệp—chẳng hạn như hình ảnh—tuân theo cấu trúc nhị phân dự kiến cho các tệp hình ảnh, nhưng đồng thời có thể thực thi mã độc khi được diễn giải trong một ngữ cảnh khác. Bản chất kép của các tệp này cho phép chúng bỏ qua các cơ chế xác thực truyền thống và khai thác lỗ hổng trong các tình huống cụ thể.
Tệp Đa ngôn ngữ đơn giản với ExifTool
Một kỹ thuật đơn giản để tạo ảnh đa ngôn ngữ là sử dụng ExifTool. Ứng dụng mạnh mẽ này được thiết kế để đọc, ghi và sửa đổi nhiều định dạng siêu dữ liệu, chẳng hạn như EXIF, XMP, JFIF và Photoshop IRB. Tuy nhiên, những cá nhân có ý đồ xấu có thể lợi dụng ExifTool để thực hiện các hành động có hại, bao gồm cả việc tạo ảnh đa ngôn ngữ với mục đích xấu. Bằng cách sử dụng ExifTool để nhúng mã độc vào siêu dữ liệu EXIF của ảnh—đặc biệt là trong các trường như UserComment và ImageDescription—kẻ tấn công có thể tạo ảnh đa ngôn ngữ và tăng cơ hội khai thác thành công.
Sau đây là siêu dữ liệu EXIF của hình ảnh, cung cấp thông tin toàn diện liên quan đến hình ảnh đó.
Bằng cách sử dụng ExifTool, kẻ tấn công có thể nhúng mã độc vào siêu dữ liệu EXIF của hình ảnh, do đó tạo ra một tệp đa ngôn ngữ có thể vượt qua các cơ chế xác thực.
Mặc dù xác thực kiểu MIME có thể hạn chế việc tải lên các tệp web shell cơ bản, nhưng hình ảnh đa ngôn ngữ này có thể vượt qua những hạn chế này, cho phép kẻ tấn công tải lên một web shell đa ngôn ngữ.
Kẻ tấn công sau đó có thể khai thác web shell đa ngôn ngữ để kiểm soát máy chủ web.
Tập tin đa ngôn ngữ Javascript/JPEG
Tệp đa ngôn ngữ JavaScript/JPEG được cấu trúc để có giá trị như cả ảnh JPEG và tập lệnh JavaScript. Để đạt được điều này, tác nhân độc hại phải hiểu biết toàn diện về cấu trúc bên trong của tệp JPEG. Kiến thức này cho phép nhúng chính xác dữ liệu nhị phân độc hại vào trong ảnh, đảm bảo rằng nó có thể được xử lý bởi công cụ JavaScript mà không ảnh hưởng đến giá trị của nó như một ảnh JPEG.
Hình ảnh JPEG có cấu trúc như sau:
Byte | Tên |
0xFF, 0xD8 | Bắt đầu hình ảnh |
0xFF, 0xE0, 0x00, 0x10, … | Tiêu đề mặc định |
0XFF, 0XFE, … | Bình luận hình ảnh |
0xFF, 0xDB, … | Bảng lượng tử hóa |
0xFF, 0xC0, … | Bắt đầu khung hình |
0xFF, 0xC4, … | Bảng Huffman |
0xFF, 0xDA, … | Bắt đầu quét |
0xFF, 0xD9 | Kết thúc hình ảnh |
Định dạng JPEG – nguồn: https://github.com/corkami/formats/blob/master/image/JPEGRGB_dissected.png
Trong cấu trúc ảnh JPEG, tiêu đề được theo sau bởi thông tin về độ dài. Như đã trình bày trong ví dụ trước, tiêu đề bắt đầu bằng chuỗi 0xFF 0xE0 0x00 0x10 , trong đó 0x00 0x10 biểu diễn cụ thể độ dài của phân đoạn, biểu thị 16 byte. Dấu hiệu 0xFF 0xD9 đánh dấu kết thúc của ảnh.
Để tạo tệp đa ngôn ngữ JavaScript/JPEG, cần phải sửa đổi các giá trị thập lục phân của hình ảnh để đảm bảo rằng công cụ JavaScript có thể nhận dạng và xử lý chúng.
Đầu tiên, trong JavaScript, chuỗi 0xFF 0xD8 0xFF 0xE0 có thể được hiểu là các giá trị không phải ASCII, nhưng 0x00 0x10 không hợp lệ và phải được thay đổi. Giá trị thay thế phù hợp cho các giá trị hex này là 0x2F 0x2A , đây là biểu diễn thập lục phân của /*, một cú pháp được sử dụng để mở chú thích trong JavaScript. Sự thay thế này cho phép bỏ qua dữ liệu nhị phân còn lại như một phần của chú thích.
Tuy nhiên, vì 0x00 0x10 ban đầu biểu diễn độ dài của tiêu đề JPEG, việc thay đổi nó thành 0x2F 0x2A , trong hệ thập phân bằng 12074, đòi hỏi phải định nghĩa lại tiêu đề JPEG để duy trì tính hợp lệ của nó. Để đạt được điều này, cần thêm các byte null và tải trọng JavaScript phải được đặt sau dấu hiệu 0xFF 0xFE , chỉ ra chú thích hình ảnh trong cấu trúc JPEG.
Ví dụ, nếu tải trọng là */=alert(document.domain);/* , dài 28 byte, thì số byte null bắt buộc sẽ được tính như sau: 12074 (chiều dài mới) - 16 (chiều dài tiêu đề ban đầu) - 2 (đối với dấu hiệu 0xFF 0xFE ) - 28 (chiều dài tải trọng) = 12.028 byte null.
Do đó, mã JavaScript trong ảnh JPEG sẽ giống như sau:
Cuối cùng, chuỗi 0x2A 0x2F 0x2F 0x2F (tương ứng với *///) phải được đặt ngay trước dấu kết thúc JPEG 0xFF 0xD9 . Bước này đóng chú thích JavaScript và đảm bảo tải trọng được thực thi chính xác mà không làm gián đoạn cấu trúc của tệp JPEG.
Sau khi sửa đổi, hình ảnh vẫn có thể được coi là hình ảnh hợp lệ trong khi đồng thời chứa mã JavaScript có thể thực thi.
Khi tệp HTML tải hình ảnh này dưới dạng mã nguồn JavaScript, nó vẫn hợp lệ và có thể thực thi mã JavaScript được nhúng:
Các tệp hình ảnh đa ngôn ngữ không chỉ gây ra rủi ro cho việc khai thác phía máy khách mà còn cho các cuộc tấn công phía máy chủ trong những trường hợp cụ thể. Một ví dụ về điều này là tệp đa ngôn ngữ Phar/JPEG, có thể được hiểu là cả Tệp lưu trữ PHP (Phar) và là ảnh JPEG. Cấu trúc tệp Phar cho phép nhúng dữ liệu tuần tự hóa vào siêu dữ liệu, điều này gây ra rủi ro tiềm ẩn cho các lỗ hổng hủy tuần tự hóa, đặc biệt là trong một số phiên bản PHP nhất định. Do đó, các tệp đa ngôn ngữ Phar/JPEG có thể được sử dụng để bỏ qua xác thực tải tệp lên và khai thác các máy chủ dễ bị tấn công.
Định dạng tệp Phar được trình bày dưới dạng stub/manifest/contents/signature và lưu trữ thông tin quan trọng về những gì có trong kho lưu trữ Phar trong manifest của nó:
- Stub: Stub là một đoạn mã PHP được thực thi khi tệp được truy cập trong ngữ cảnh thực thi. Không có hạn chế nào đối với nội dung của stub, ngoại trừ yêu cầu kết thúc bằng __HALT_COMPILER();.
- Manifest: Phần này chứa siêu dữ liệu về kho lưu trữ và nội dung của nó, có thể bao gồm siêu dữ liệu Phar được tuần tự hóa được lưu trữ ở định dạng serialize().
- Nội dung tập tin: Các tập tin gốc có trong kho lưu trữ.
- Chữ ký (tùy chọn): Chứa thông tin chữ ký để xác minh tính toàn vẹn.
Vì stub không áp đặt bất kỳ hạn chế nội dung nào ngoài quy định của __HALT_COMPILER(), nên tác nhân đe dọa có thể đưa các giá trị thập lục phân của một hình ảnh vào stub. Bằng cách đặt các giá trị này vào đầu tệp PHAR, nó có thể được xác định là một hình ảnh hợp lệ. Do đó, một đa ngôn ngữ PHAR/JPEG có thể dễ dàng được xây dựng bằng cách thêm các byte thập lục phân của một hình ảnh JPEG vào đầu, như được minh họa trong ví dụ sau:
Thông qua phương pháp này, tệp đa ngôn ngữ được tạo ra có chức năng vừa là hình ảnh hợp lệ vừa là tệp PHAR hợp lệ và do đó có thể được sử dụng để bỏ qua một số cơ chế xác thực tải tệp lên.
Mặc dù tệp đa ngôn ngữ này có thể bỏ qua bộ lọc tải tệp lên, nhưng hiện tại nó không có khả năng khai thác máy chủ web. Để khai thác và xâm phạm máy chủ web thành công bằng tệp PHAR hoặc tệp đa ngôn ngữ PHAR, điều cần thiết là phải đưa siêu dữ liệu tuần tự độc hại vào tệp kê khai.
Khi tệp PHAR được truy cập thông qua trình bao bọc PHAR (phar://) trong một số hàm PHP nhất định (PHP ≤7.x) liên kết với các thao tác tệp - chẳng hạn như file(), file_exists(), file_get_contents(), fopen(), rename() hoặc unlink() - hàm unserialize() được kích hoạt cho siêu dữ liệu được tuần tự hóa. Cuối cùng, bằng cách sử dụng PHPGGC, một công cụ được sử dụng rộng rãi để xây dựng chuỗi tiện ích PHP, các tác nhân đe dọa có thể khai thác lỗ hổng hủy tuần tự hóa thông qua tệp đa ngôn ngữ PHAR, do đó xâm phạm máy chủ ứng dụng web.
Sự kết hợp giữa các tệp đa ngôn ngữ PHAR/JPEG và các lỗ hổng giải tuần tự hóa cho phép kẻ tấn công xâm nhập vào máy chủ ứng dụng web, ngay cả khi bộ lọc tải tệp được triển khai. Đáng chú ý, sự xâm phạm này có thể xảy ra ngay cả trong quá trình xử lý tệp hình ảnh.
Bằng cách tận dụng các tệp đa ngôn ngữ để bỏ qua bộ lọc tải tệp lên và thêm trình bao bọc PHAR (phar://) vào vị trí tệp, kẻ tấn công có thể thao túng máy chủ web để xử lý tệp như một kho lưu trữ PHAR. Thao tác này sau đó có thể kích hoạt lỗ hổng giải tuần tự hóa, dẫn đến thực thi mã từ xa thông qua các hàm thao tác tệp.
Để truyền tải những rủi ro liên quan đến các tệp đa ngôn ngữ trong ứng dụng của bạn, chúng tôi đã mô phỏng một môi trường trong đó ứng dụng sử dụng các bộ lọc tải tệp nghiêm ngặt để ngăn chặn việc tải lên các tệp độc hại hoặc web shell. Bất chấp các biện pháp bảo vệ này, một hình ảnh đa ngôn ngữ có thể bỏ qua quy trình xác thực và trong một số bối cảnh nhất định, có thể dẫn đến thực thi mã từ xa, cuối cùng là xâm phạm máy chủ ứng dụng web dễ bị tấn công.
Ví dụ này minh họa một ứng dụng web thông thường cho phép chia sẻ tệp giữa khách hàng, đối tác và tổ chức:
MetaDefender Core Và MetaDefender ICAP Server bảo vệ các ứng dụng web của bạn khỏi các mối đe dọa này và tăng cường bảo mật cho mạng và cơ sở hạ tầng của bạn.
MetaDefender ICAP Server Và MetaDefender Core hợp tác để bảo vệ máy chủ web của bạn khỏi các cuộc tấn công tinh vi liên quan đến các tệp đa ngôn ngữ PHAR/JPEG độc hại theo những cách sau:
Khi một tệp đa ngôn ngữ PHAR/JPEG được tải lên ứng dụng web, trước tiên nó sẽ được chuyển tiếp đến MetaDefender Core bởi vì MetaDefender ICAP Server để có một quy trình vệ sinh toàn diện bằng cách sử dụng Deep CDR Công nghệ ™. Không giống như các trình kiểm tra loại tệp đơn giản, Deep CDR phân tích kỹ lưỡng cấu trúc của tệp đã tải lên, loại bỏ các tập lệnh, macro và nội dung không nằm trong chính sách, đồng thời xây dựng lại tệp JPEG để chỉ bao gồm dữ liệu cần thiết.
Quá trình này loại bỏ nội dung PHAR có hại được thêm vào sau dấu kết thúc JPEG ( 0xFF 0xD9 ), đảm bảo tệp đã Làm sạch hoàn toàn là JPEG. Do đó, ứng dụng web được bảo vệ khỏi các cuộc tấn công đa ngôn ngữ PHAR/JPEG; ngay cả khi kẻ tấn công có thể thay đổi lược đồ xử lý tệp để chèn trình bao bọc PHAR, chúng cũng không thể khai thác máy chủ web.
Các tổ chức có cơ sở hạ tầng bảo mật mạng đã được thiết lập—cho dù họ sử dụng WAF (tường lửa ứng dụng web), proxy hay bộ điều khiển đầu vào—giờ đây có thể tăng cường cơ chế phòng thủ của mình thông qua MetaDefender ICAP Server . Giải pháp này tạo ra một giao diện giữa các máy chủ web hiện có và MetaDefender Core , thiết lập một điểm kiểm tra bảo mật minh bạch cho tất cả các tệp đến. Bất kỳ nội dung nào được định tuyến qua ICAP Giao diện sẽ được quét và xử lý trước khi đến máy chủ web của bạn, đảm bảo chỉ có nội dung an toàn và hợp pháp mới được đưa vào mạng của bạn và đến tay người dùng cuối.
Cách tiếp cận này có nghĩa là các tổ chức có thể tận dụng các khoản đầu tư bảo mật hiện có của mình trong khi thêm một lớp bảo vệ mạnh mẽ bổ sung. Các tổ chức sử dụng bộ điều khiển ingress NGINX có thể tích hợp MetaDefender ICAP Server với cơ sở hạ tầng hiện có của họ thông qua cấu hình proxy.
OPSWAT cách tiếp cận của 'vượt ra ngoài việc phát hiện mối đe dọa truyền thống. Thay vì chỉ đánh dấu các tệp đáng ngờ, MetaDefender Core chủ động vô hiệu hóa các mối đe dọa tiềm ẩn, chuyển đổi các tệp nguy hiểm thành nội dung an toàn, có thể sử dụng được. Khi được tích hợp với máy chủ web của bạn, MetaDefender ICAP Server cung cấp khả năng bảo vệ toàn diện chống lại các mối đe dọa zero-day và các cuộc tấn công đa ngôn ngữ.
Được trao quyền bởi triết lý “Không tin tưởng tập tin. Không tin tưởng thiết bị. ™”, OPSWAT giải quyết những thách thức của khách hàng trên toàn thế giới bằng các công nghệ được cấp bằng sáng chế ở mọi cấp độ cơ sở hạ tầng của bạn, bảo mật mạng, dữ liệu và thiết bị của bạn, đồng thời ngăn chặn các mối đe dọa đã biết và chưa biết, các cuộc tấn công zero-day và phần mềm độc hại.