Cách ngăn chặn lỗ hổng tải lên tệp
Các mô-đun tải lên tệp là một trong những liên kết yếu nhất trong các ứng dụng web. Bất kỳ lỗi nào mắc phải, 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 trực tiếp vào tay kẻ tấn công mạng. Vì lý do nà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 giả mạo phía khách hàng là gì? Làm thế nào bạn có thể chống lại điều này để giữ an toàn cho các trang web của bạn và người dùng của bạn?
Mục Lục
Giả mạo phía khách hàng là gì?
Giả mạo phía máy khách là khái niệm cơ bản về các cuộc tấn công ứng dụng web nói chung. Nói một cách đơn giản, điều đó có nghĩa là bạn không còn có 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, giả mạo phía máy khách 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 giả mạo phía máy khách, 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 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 với tư cách là nhà phát triển phần mềm. Dữ liệu tên của tệp đã tải lên có thể chứa bất kỳ nội dung nào bị giả mạo phía máy khách. Với dữ liệu Kiểu nội dung của tệp đã tải lên, ngay cả khi kẻ tấn công đang tải tệp .exe lên, tệp này có thể xuất hiện dưới dạng hình ảnh/jpeg trong hệ thống.
Phần mở rộng tệp và danh sách trắng
Trong khi phát triển các mô-đun tải lên tệp, điều đầu tiên cần làm là quy trình đưa vào danh sách trắng cho phần mở rộng tệp. Ví dụ: người dùng muốn tải lên tệp có tên “muo.jpeg”. Bạn phải đảm bảo rằng phần mở rộng tệp mà người dùng muốn tải lên là .jpeg. Đối với điều này, hệ thống sẽ kiểm tra tệp đã tải lên và xem liệu đó có phải là một trong những phần mở rộng tệp được 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 đơn giản sau:
$file_parts = pathinfo($filename);
switch($file_parts['extension'])
{
case "jpg":
break;
case "bat":
break;
case "":
case NULL:
break;
}
Bạn có thể thực hiện điều này với một khối mã tương tự như khối mã ở trên hoặc bạn có thể sử dụng các lớp và chức năng được cung cấp bởi khung công tác mà bạn đang sử dụng.
Cẩn thận không 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ể bỏ qua bước kiểm tra này bằng tên tệp chẳng hạn như “muo.jpeg.php”.
Thông tin loại nội dung là gì?
Thông tin Loại nội dung 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 internet phát hiện thông tin này và thêm nó vào yêu cầu đã gửi. Kẻ tấn công 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 để thực hiện xác thực thông tin Loại nội dung. Điều này một mình 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à bạn 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 đề phòng và chỉ chấp nhận các tệp có thông tin hình ảnh/jpeg, một mức độ bảo vệ bổ sung 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 internet hỗ trợ các phần bổ trợ như Adobe Flash Player. Mặc dù hỗ trợ cho trình phát đó không còn khả dụng nhưng vẫn có thể cài đặt các tệp liên quan đó trên nhiều hệ thống, mặc dù Flash vẫn có rủi ro bảo mật. 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ẻ
Để hành động, các nhà phát triển 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ể xảy ra:
- 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 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 giả mạo phía máy khách. Hãy tưởng tượng tệp này, do tác nhân đe dọa tải lên, đi tới “www(dot)target-site(dot)com/images/images.jpeg”.
- Giả sử kẻ tấn công có một trang web có tên là kẻ tấn công(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ẻ
- Người dùng vô tội đăng nhập vào kẻ tấn công (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.
- 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ỉ com (chấm) trang đích 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ô tội 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 mã sau nằm trong nội dung HTML
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 bằng tệp tải lên qua một tên miền phụ 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 con khác như sau: “http(colon)//file.target-site(dot)com/images/image.jpeg”.
Một giải pháp khác là thêm thông tin Bố trí nội dung: tệp đính kèm 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.
Đề phòng các lỗ hổng tải lên tệp
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 đây là một trong những vấn đề mà các nhà phát triển nên chú ý nhất. 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 trình bao bên trong trang web và dễ dàng khai thác thông tin trên máy chủ. Điều cực kỳ quan trọng là kiểm soát tất cả các tệp do người dùng tải lên, áp dụng các 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à tất nhiên, có nhiều bước bổ sung khác mà bạn phải thực hiện để bảo vệ trang web của mình, ngay cả khi bạn thực hiện tất cả các biện pháp phòng ngừa được khuyến nghị để tải lên các mô-đun tệp. Sử dụng tiêu đề bảo mật HTTP là một trong những bước bạn có thể thực hiện.