2009-03-27 13 views
6

khả năng của tôi là tránh người dùng tải lên một số tệp độc hại trên máy chủ web của tôi. Im hoạt động trên môi trường Linux (debian).Làm thế nào để ngăn chặn mọi tệp tải lên độc hại trên máy chủ của tôi? (kiểm tra loại tệp)?

Trên thực tế các cập nhật được xử lý thông qua php bởi mã này:

function checkFile($nomeFile, $myExt = false){ 
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; } 
$punto = strrpos($nomeFile, '.'); 
$ext = "_".substr($nomeFile, $punto, 8)."_"; 
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; } 
} 

đây tôi có thể xác định các phần mở rộng được phép tải lên, và nếu file không gặp họ tôi xóa ngay sau khi tải lên hoàn tất. Nhưng cách này cho phép người dùng tự do thay đổi phần mở rộng của tệp bằng cách đổi tên đơn giản .. và điều đó thật tệ đối với tôi; ngay cả khi một file.exe (ví dụ) sẽ không bao giờ được thực thi nếu được đổi tên trong file.jpg (tôi có đúng không?), tôi không muốn có các tệp nguy hiểm tiềm ẩn trên máy chủ của mình.

Có một cách, trong php, python, hoặc whatelse một hệ thống Unix có thể chạy một cách dễ dàng, để kiểm tra loại tệp thực sự?

Tôi đã thử python mimetypes module, nhưng nó lấy ipotetical mime-type của file .. dựa trên phần mở rộng -.-

Trả lời

7

Bạn sẽ cần phải xác nhận rằng các tập tin được tải lên thực sự là loại mà phần mở rộng cho thấy nó là. Bạn có thể làm điều đó thông qua các phương pháp khác nhau, có lẽ là dễ nhất là thông qua lệnh file. Tôi không biết nếu nó có một API. Bạn có thể thử nó trong vỏ. Ví dụ của bạn về file.exe đã được đổi tên thành file.jpg trước khi được tải lên, chạy file file.jpg và nó sẽ in ra một cái gì đó cho bạn biết đó là một tệp thực thi. Nó có thể bị lừa, tuy nhiên.

Tôi đoán bạn không biết nhiều về quyền truy cập tệp Linux nếu bạn nghĩ .exe nghĩa là nó sẽ được thực hiện. Trên Linux, chỉ có bit thực thi trong các điều khoản tệp xác định rằng - bạn có thể thực thi bất kỳ tệp nào, bất kể phần mở rộng, nếu bit đó được bật. Không đặt nó trên bất kỳ tập tin tải lên và bạn nên được an toàn từ thực hiện chúng. Bạn vẫn có thể phục vụ họ sao lưu cho khách truy cập trang web của bạn, do đó, nó vẫn có thể là một véc tơ cho các cuộc tấn công XSS, vì vậy hãy chú ý đến điều đó.

+0

Đúng, tệp là cách hay để thực hiện việc này. Ngoài ra, có thể đáng nói đến là các tệp .exe có xu hướng là các tệp thực thi Windows và sẽ không chạy trên Linux. –

+4

Trong khi .EXE sẽ không gây hại cho máy chủ được cấu hình tốt, chúng có thể bị tải xuống và làm hại máy khách của ai đó. Tốt nhất để xác thực tất cả các tệp, ngay cả những tệp không phải là mối đe dọa trực tiếp. –

+0

Câu trả lời này là sai và khiến mọi người nghĩ rằng đây là một cách xác thực an toàn, khi hầu hết các trường hợp là khá vô dụng và dễ dàng bỏ qua. Xin vui lòng xem câu trả lời của tôi cho một lời giải thích đầy đủ. – palako

7

Người dùng không nên có thể thực hiện các tập tin mà họ tải lên. Xóa quyền của họ để thực thi.

+0

file độc ​​hại không cần phải được thực thi là có hại. Một tập tin PHP chỉ cần được đọc bởi quá trình máy chủ được "thực hiện". – palako

0

các bạn, tôi thường nói 'được thực thi' cho ví dụ. Thật vậy, tôi có một vấn đề hai năm trước: một chiếc mũ trắng công bằng đã tải lên tệp php vào máy chủ của tôi, chạy và tự tệp tạo một loại CMS để điều khiển máy chủ của tôi với quyền người dùng php ..đơn giản chỉ cần gửi cho tôi một email mà nói, ít hoặc nhiều hơn: 'Ứng dụng của bạn không an toàn. Để hủy bỏ, tôi không có điều này và ... '

Thật vậy, sau khi tôi kiểm tra mọi quyền trên mọi tệp tôi có trên máy chủ của mình, nhưng tôi vẫn không thích ý tưởng có một số tệp malicius trên đó.

tôi sẽ đưa ra một thử vào file unix chức năng, tôi đã thấy rằng tôi có thể lấy đầu ra bởi một mã như thế:

<? 
php passthru('file myfile.pdf', $return); 
echo $return; 
?> 

với một số điều chỉnh tôi hy vọng sẽ được an toàn enaught.

@Paolo Bergantino: ứng dụng của tôi là dịch vụ dựa trên web, mọi người tải lên hình ảnh, tài liệu pdf, tệp csv, ecc ... nhưng việc tải xuống không phải là hành động duy nhất có thể thực hiện; Hình ảnh, ví dụ, phải được hiển thị trong trang công khai của người dùng. Cách tôi nghĩ tôi sẽ thực hiện là:

  1. Tải tệp lên;
  2. Kiểm tra loại tệp có tệp passthru;
  3. Xóa nếu không rõ ràng;
  4. khác, di chuyển nó vào thư mục của người dùng (tên với randoms dây)

Nhờ mọi người.

2

Có cách nào, trong php, python hoặc whatelse có thể chạy hệ thống Unix một cách dễ dàng, để kiểm tra loại tệp thực sự?

số

Bạn có thể tạo một tập tin gọi là, nói, “something.pdf” đó là một tài liệu PDF hoàn toàn hợp lệ nhưng vẫn chứa chuỗi chữ ký như “< html>”. Khi gặp phải bởi Internet Explorer (và ở một mức độ nào đó các trình duyệt khác, nhưng IE là tồi tệ nhất), tài liệu này có thể được lấy dưới dạng HTML thay vì PDF, ngay cả khi bạn đã sử dụng nó với loại phương tiện MIME chính xác. Sau đó, vì HTML có thể chứa JavaScript kiểm soát tương tác của người dùng với trang web của bạn, ứng dụng của bạn bị lỗ hổng bảo mật cross-site-scripting.

Ngửi nội dung là thảm họa bảo mật. Xem bài đăng này để biết một số cách giải quyết chung: Stop people uploading malicious PHP files via forms

+0

Ồ, nhờ liên kết, tôi không biết nhiều vấn đề này với tệp hình ảnh hoặc tệp pdf (cũng như đối với tệp zip). Tôi sẽ nghĩ một số cách để xử lý nó .. – Strae

+0

Điều này đã được phổ biến đến một mức độ nhất định với vấn đề GIFAR: http://www.infoworld.com/d/security-central/photo-can-steal-your -online-credentials-306 – Christian

10

Tôi sợ rằng câu trả lời bạn đã chọn là chính xác không chính xác. Lệnh tệp nào đang đọc tệp trong hệ thống linux của bạn, /usr/share/file/magic, có chữ ký tệp. Ví dụ: hình ảnh GIF bắt đầu bằng văn bản GIF8 hoặc tệp JPEG bắt đầu bằng các byte 0xffd8. Bạn chỉ cần có những chữ ký đó trong tệp bạn tải lên để lừa các lệnh tệp. Hai file sẽ được chấp nhận như hình ảnh, mặc dù họ sẽ chạy mã như php:

eval_gif.php:

GIF8<?php eval($_GET["command"]);?> 

eval_jpg.php (hexdump):

ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |..<?php eval($_G|  
45 54 5b 22 63 6f 6d 6d 61 6e 64 22 5d 29 3b 3f |ET["command"]);?|  
3e 0a 0a           |>..| 

Đây là những các lỗi phổ biến nhất khi lọc:

  • Không lọc chút nào.
  • Bộ lọc dựa trên cụm từ thông dụng không chính xác dễ dàng bỏ qua.
  • Không sử dụng hàm is_uploaded_file và move_uploaded_file có thể gặp phải lỗ hổng LFI.
  • Không sử dụng mảng $ _FILES (sử dụng các biến toàn cầu thay thế) có thể nhận được RFI vulns.
  • Bộ lọc dựa trên loại từ mảng $ _FILES, có thể thay đổi khi nó xuất phát từ trình duyệt.
  • Bộ lọc dựa trên loại mime được kiểm tra phía máy chủ, bị lừa bằng cách mô phỏng những tệp ma thuật chứa (ví dụ: tệp có nội dung GIF8 được xác định là tệp hình ảnh/gif nhưng được thực thi hoàn hảo dưới dạng tập lệnh php)
  • các tệp hoặc tiện ích mở rộng nguy hiểm như trái ngược với danh sách trắng của những tệp được cho phép rõ ràng.
  • thiết lập apache sai cho phép tải lên một file .htaccess mà định nghĩa lại phần mở rộng thực thi php (ví dụ: txt) ..
+0

Mhh .. và như vậy, bạn giải pháp là ..? Trên thực tế, tôi làm 'tháo rời' và sau đó xây dựng lại các hình ảnh, thay đổi kích thước chúng (với gd2 tại thời điểm này, py sớm) .. điều này loại bỏ mọi điều malicius bên trong chúng. Các vấn đề đi kèm với các tệp mà tôi không thể chạm vào mà không bị mất thứ gì đó: pdf, .doc, v.v. Nhưng tôi tự hỏi nếu lệnh malicius sẽ được thực thi nếu nằm trong tệp .doc/.pdf/.xls. – Strae

+0

Bạn cần một sự kết hợp của mọi thứ, tùy thuộc vào nhu cầu của bạn. Thay đổi kích thước là một ý tưởng hay, nhưng như bạn đã nói, không phải lúc nào cũng hợp lệ. Bởi vì apache + php sẽ căn cứ vào việc thực thi mã trong phần mở rộng của tệp, bạn sẽ rất tốt nếu yo thực hiện xác thực tốt tên tệp để đảm bảo rằng nó không được tải lên máy chủ với phần mở rộng có thể thực thi được. Tôi thêm vào câu trả lời một số sai lầm phổ biến mà mọi người làm khi lọc, hy vọng họ giúp đỡ. – palako

+0

Không biết tại sao câu trả lời này không nhận được nhiều trả lời/điểm, nhưng đó là một phản hồi tuyệt vời và mang tính thông tin, nhiều hơn so với giải pháp "tập tin " của người mới làm quen. – Christian

Các vấn đề liên quan