Cách ngăn chặn lỗ hổng tệp tải lên | Học CNTT cùng FUNiX

Cách ngăn chặn lỗ hổng tệp tải lên

Chia sẻ kiến thức 04/01/2023

Bất kỳ trang web nào cho phép người dùng tải lên tệp của riêng họ đều có thể bị tin tặc tấn công. Tuy nhiên, có những điều bạn có thể làm để bảo mật trang web của mình.

 

Các mô-đun tải lên tệp là một trong những điểm yếu nhất trong các ứng dụng web. Bất kỳ lỗi nào, kể cả những lỗi bạn cho là nhỏ, đều có thể khiến quyền kiểm soát máy chủ rơi vào tay kẻ tấn công mạng. Bởi vậy, các nhà phát triển phần mềm cần biết những lỗi phổ biến nhất và một số phương pháp tấn công có thể xảy ra.

 

Vậy Client Side Tampering (tạm dịch là sửa đổi/can thiệp/giả mạo phía máy khách) là gì? Làm thế nào bạn có thể giữ an toàn cho các trang web và người dùng của bạn?

Client Side Tampering là gì?

Client Side Tampering là khái niệm cơ bản về tấn công ứng dụng web nói chung. Nói một cách đơn giản, điều này có nghĩa là bạn không thể tin tưởng vào bất kỳ dữ liệu nào bạn gửi cho người dùng. Ngoài ra, Client Side Tampering là một trong những nền tảng của phát triển ứng dụng an toàn. Nếu bạn kiểm tra mô-đun tải lên tệp mà bạn đang xử lý và xem xét hành vi Client Side Tampering, thì dữ liệu bạn không thể tin cậy bao gồm:

  • Tên của tệp đã tải lên.
  • Loại nội dung (Content-Type) của tệp đã tải lên.

Hai mục này là nơi bạn có cơ hội đưa vào danh sách trắng (whitelist) với tư cách một nhà phát triển phần mềm. Dữ liệu tên tệp đã tải lên có thể chứa bất kỳ nội dung nào với Client Side Tampering. Với dữ liệu Loại nội dung của tệp đã tải lên, ngay cả khi kẻ tấn công đang tải lên tệp .exe, tệp này có thể xuất hiện dưới dạng tệp ảnh/jpeg trong hệ thống.

Phần mở rộng tệp và danh sách trắng

Kiểm tra các phần mở rộng tập tin được tải lên hệ thống

Trong khi phát triển các mô-đun tải tệp lên, điều đầu tiên cần làm là đưa vào danh sách trắng phần mở rộng tệp . Ví dụ: người dùng muốn tải lên một tệp có tên “funix.jpeg”. Bạn phải đảm bảo phần mở rộng tệp mà người dùng muốn tải lên là .jpeg. Để làm điều này, hệ thống sẽ kiểm tra tệp đã tải lên xem đó có phải là một trong những phần mở rộng tệp được cho phép hay không. Để hiểu cách bạn có thể làm điều này, hãy kiểm tra mã PHP sau:

 

$file_parts = pathinfo($filename);
switch($file_parts['extension'])
{
case "jpg":
break;

case "bat": // Or exe, dll, so, etc.
break;

case "":
case NULL// No file extension
break;
}

Bạn có thể thực hiện điều này với một khối code tương tự hoặc bạn có thể sử dụng các lớp (classes) và hàm (functions) được cung cấp bởi framework mà bạn đang sử dụng.

Bạn không nên tạo dữ liệu phần mở rộng tệp bằng cách phân tích tên tệp theo ký tự dấu chấm (.), vì kẻ tấn công có thể lách bước kiểm tra này bằng tên tệp như “funix.jpeg.php”.

Thông tin loại nội dung là gì?

Thông tin Loại nội dung (Content-Type) là một phần thông tin được gửi trong yêu cầu HTTP cho mỗi lần tải lên tệp. Trình duyệt phát hiện thông tin này và thêm nó vào yêu cầu đã gửi. Tin tặc có thể cố gắng thay đổi thông tin bằng giả mạo phía máy khách và bỏ qua xác thực phía máy chủ. Ở giai đoạn này, các nhà phát triển cần một cơ chế kiểm soát để xác thực thông tin Loại nội dung. Chỉ một mình điều này sẽ không đủ; tuy nhiên, đó là một vấn đề quan trọng mà các nhà phát triển cần chú ý.

Giả sử bạn mã hóa một cơ chế để kiểm tra chính xác phần mở rộng tệp và chỉ chấp nhận các tệp có phần mở rộng .jpeg. Ngoài cơ chế phòng ngừa này, bạn có thể kiểm tra thông tin Loại nội dung và chỉ chấp nhận các tệp có thông tin hình ảnh/jpeg, tăng cường bảo vệ chống lại các cuộc tấn công mạng

Tệp Flash SWF và các bước tấn công

Phần mở rộng tệp và dữ liệu Loại Nội dung không có ý nghĩa gì đối với các trình duyệt hỗ trợ các phần bổ trợ như Adobe Flash Player. Mặc dù không còn hỗ trợ cho trình phát đó nhưng vẫn có thể cài đặt các tệp liên quan đó trên nhiều hệ thống. Trong một hệ thống chưa thực hiện các biện pháp phòng ngừa liên quan, có thể gọi một tệp Flash bằng thẻ (tag) <object>, dù phần mở rộng của nó là gì. Điều này sẽ gây ra vấn đề bảo mật nghiêm trọng khác.

 
tư vấn trang web cắm cuối đời

Các nhà phát triển ứng dụng web cần biết các con đường mà tội phạm mạng có thể thực hiện. Đây là cách nó có thể diễn ra:

  1. Kẻ tấn công độc hại tải SWF (định dạng tệp Adobe Flash) có tên “image.jpeg” lên trang web bị nhắm mục tiêu. Trong quá trình tải lên, quá trình xác minh danh sách trắng xác nhận rằng tệp do kẻ tấn công tải lên có phần mở rộng .jpeg. Xác minh Loại nội dung bị bỏ qua với Client Side Tampering. Hãy tưởng tượng tệp này, do kẻ tấn công tải lên, đi tới “www(dot)target-site(dot)com/images/images.jpeg”.
  2. Giả sử kẻ tấn công có một trang web có tên là attacker(dot)com. Kẻ tấn công gọi tệp image.jpeg được tải lên trang đích trên trang web này, sử dụng thẻ (tag) <object> với kiểu gán ứng dụng/x-shockwave-flash.
  3. Người dùng đăng nhập vào attacker(dot)com. Trang web đó gọi tệp SWF tại www(dot)target-site(dot)com/images/image.jpeg và thực thi các lệnh được cung cấp cho SWF.
  4. Thông qua đó, kẻ tấn công mạng có thể tạo các hành động yêu cầu HTTP cho địa chỉ của trang web mục tiêu mà người dùng bình thường không nhận thấy. Với những yêu cầu này, kẻ tấn công sẽ sử dụng phiên của người dùng và bỏ qua kiểm tra CSRF.
 

Để hiểu rõ hơn về kịch bản tấn công này, hãy coi đoạn code sau nằm trong nội dung HTML <object> được attacker(dot)com gửi tới người dùng:

style="height:1px;width:1px;" data="www.target-site.com/images/image.jpeg" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="c=read&u=somethings"

Một trong những giải pháp tốt nhất là truy cập các tệp được tải lên qua một tên miền phụ (subdomain) khác. Trong trường hợp nói trên, bạn có thể truy cập các tệp tĩnh không phải từ cùng một miền mà từ một miền phụ (subdomain) khác như: “http(colon)//file.target-site(dot)com/images/image.jpeg”.

Một giải pháp khác là thêm thông tin Content-Disposition: attachment vào phản hồi HTTP khi bạn nhận được yêu cầu truy cập vào các tệp bạn muốn tải lên.

Ngăn chặn lỗ hổng tệp tải lên

Bất kỳ tệp nào mà người dùng có thể tải lên trang web đều nguy hiểm, vì vậy các nhà phát triển web nên chú ý đến vấn đề này. Nếu những kẻ tấn công phát hiện ra một lỗ hổng như vậy, chúng có thể mở một shell bên trong trang web và dễ dàng khai thác thông tin trên máy chủ. Hãy kiểm soát tất cả các tệp do người dùng tải lên, áp dụng phương pháp danh sách trắng và ẩn vị trí của thư mục đã tải lên nếu có thể.

Vân Nguyễn

Dịch từ: https://www.makeuseof.com/how-to-secure-file-upload-modules/

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, phường Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        

Cơ quan chủ quản: Công ty Cổ phần Giáo dục Trực tuyến FUNiX
MST: 0108171240 do Sở kế hoạch và Đầu tư thành phố Hà Nội cấp ngày 27 tháng 02 năm 2018
Địa chỉ:
Văn phòng Hà Nội: Tầng 4, Tòa nhà 25T2, Đường Nguyễn Thị Thập, phường Yên Hòa, Hà Nội.
Văn phòng TP.HCM: Lầu 8, Tòa nhà Giày Việt Plaza 180-182 Lý Chính Thắng, phường Nhiêu Lộc, TP. Hồ Chí Minh.
Hotline: 078 231 3602 – Email: info@funix.edu.vn

yêu cầu gọi lại