Khai thác tải lên tệp phpinfo

Trước khi thảo luận về cách khai thác các lỗ hổng tải tệp lên, điều quan trọng là phải hiểu cơ bản về chức năng tải tệp lên là gì. Chức năng tải tệp lên cho phép người dùng tải tệp lên hệ thống tệp của máy chủ web. Các chức năng tải lên tệp có thể có một số quy tắc nhất định [ví dụ: chỉ các tệp JPG mới được phép tải lên]. Vậy điều gì sẽ xảy ra nếu chúng ta quản lý tải tệp PHP lên máy chủ web bằng chức năng tải tệp lên chỉ chấp nhận JPG?

Lỗ hổng tải lên tệp nguy hiểm như thế nào?

Tác động của lỗ hổng tải lên tệp phụ thuộc vào một số yếu tố chính

  • Trong một số trường hợp, trang web có thể không xác thực đúng loại và nội dung của tệp đã tải lên. Điều này cho phép kẻ tấn công tải lên tệp chứa mã phía máy chủ [vỏ web]. Điều này cuối cùng có thể khiến kẻ tấn công kiểm soát máy chủ, điều này cực kỳ nguy hiểm
  • Nếu trang web không xác thực được tên của tệp đã tải lên, kẻ tấn công có thể ghi đè lên các tệp quan trọng bằng cách tải lên tệp có cùng tên. Nếu máy chủ cũng dễ bị tấn công khi duyệt thư mục, kẻ tấn công có thể ghi đè lên một tệp từ các vị trí không lường trước được [ví dụ: apache2. conf]
  • Nếu trang web không xác thực đúng kích thước của tệp đã tải lên, kẻ tấn công có thể nhanh chóng lấp đầy dung lượng đĩa trống. Đây là một kiểu tấn công DoS

Làm cách nào để khai thác lỗ hổng tải lên tệp?

Trong phần này, chúng ta sẽ thảo luận từng bước “Cách khai thác lỗ hổng tải lên tệp” với một số ví dụ hữu ích

Các trường hợp ví dụ được sử dụng trong bài đăng này là môi trường phòng thí nghiệm từ PortSwigger

1. Tải lên vỏ web cơ bản

Tình trạng. Để giải quyết vấn đề trong phòng thí nghiệm, hãy tải lên trình bao web PHP cơ bản và sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Sau đó, bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Bây giờ chúng tôi đã đăng nhập với tư cách là người dùng wiener và đang tìm kiếm chức năng tải tệp lên trong ứng dụng

Bước 2. Chúng tôi đã tìm thấy chức năng tải tệp lên trong hồ sơ của người dùng

Bước 3. Sau khi xác định chức năng tải tệp lên, chúng tôi tạo một tệp PHP chứa mã trong ảnh chụp màn hình bên dưới, cho phép chúng tôi xem các bí mật của người dùng “Carlos”

Bước 4. Bây giờ chúng ta có thể tải lên tệp PHP mà chúng ta đã tạo trước đó

Bước #5. Bây giờ chúng ta cần buộc máy chủ web chạy tệp này. Để làm điều này, chúng tôi phải thực hiện yêu cầu GET đối với tệp mà chúng tôi đã tải lên trước đó. Chúng ta có thể xem điểm cuối của thư mục đã tải lên trong ảnh chụp màn hình ở trên [/files/avatars/file_upload_test. php]. Thực hiện yêu cầu và đọc bí mật của người dùng “Carlos”

Bước #6. Gửi cờ và phòng thí nghiệm được giải quyết

Ghi chú. Chúng tôi sẽ không hiển thị ứng dụng chính và trang giải quyết trong phòng thí nghiệm trong các phần khác

2. Tải lên Web Shell qua Bỏ qua Hạn chế Loại Nội dung

Tình trạng. Để giải bài thực hành này, hãy tải lên một trình bao web PHP cơ bản và sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Chúng tôi đã tìm thấy cùng một chức năng tải lên tệp và đã cố tải lên cùng một tệp PHP. Thật không may, ứng dụng có hạn chế về loại nội dung

Bước 2. Chúng tôi nhận thấy ứng dụng chỉ cho phép các loại nội dung hình ảnh/jpeg và hình ảnh/png. Vì vậy, chúng tôi đã thay đổi loại nội dung thành hình ảnh/jpeg và tệp đã được tải lên thành công vào /avatars/file_upload. điểm cuối php

Bước 3. Bây giờ, hãy tạo một yêu cầu GET cho tệp mà chúng tôi đã tải lên trước đó. Đọc bí mật của người dùng “Carlos”

3. Web Shell Tải lên qua Directory Traversal

Tình trạng. Để giải quyết vấn đề trong phòng thí nghiệm, hãy tải lên trình bao web PHP cơ bản và sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Như đã thấy trong các ví dụ trước, bước đầu tiên là kiểm tra chức năng tải tệp lên. Sau khi kiểm tra chức năng, chúng tôi nhận thấy rằng không có giới hạn nào đối với việc tải tệp PHP lên máy chủ

Bước 2. Nhưng khi chúng tôi thực hiện yêu cầu GET đối với tệp PHP đã tải lên của mình, máy chủ đã trả về nội dung của tệp PHP dưới dạng văn bản thuần túy

Bước 3. Sau khi thử một số kỹ thuật bỏ qua, chúng tôi nhận ra rằng chúng tôi có thể chỉ cần tải lên tệp PHP của mình thông qua truyền tải thư mục. Bây giờ chúng ta chỉ cần thay đổi tên tệp từ file_upload_test. php to. %2ffile_upload_test. php. Sau khi thay đổi, bây giờ chúng ta có thể thấy rằng tệp đã được tải lên thành công vào thư mục /files [thư mục mẹ của /avatars]

Bước 4. Bây giờ, nếu chúng ta tạo một yêu cầu GET tới /files/avatars/. /file_upload_test. php, chúng ta có thể truy cập bí mật của người dùng “Carlos”. Chúng tôi cũng có thể truy cập tệp bằng yêu cầu GET tới /files/file_upload_test. điểm cuối php

4. Tải lên Web Shell qua Bỏ qua tiện ích mở rộng trong danh sách đen

Tình trạng. Để giải bài tập trong phòng thí nghiệm, hãy tải lên một trình bao web PHP cơ bản, sau đó sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Chúng ta có thể sử dụng chức năng upload file tương tự cho quá trình khai thác. Bây giờ chúng ta có thể thấy thông báo lỗi trong nội dung phản hồi HTTP. Điều này có nghĩa là các tệp PHP không được phép

Bước 2. Sau một vài lần thử, chúng tôi đã tìm ra cách vượt qua giới hạn danh sách đen. Trong trường hợp này, chúng tôi sẽ sử dụng những gì chúng tôi đã học được trong các ví dụ trước. Trước tiên, chúng ta cần tải lên và ghi đè lên. htaccess để tải lên các tiện ích mở rộng mà chúng tôi muốn tải lên. Vì vậy, chúng tôi sẽ thay đổi tên tệp thành. htaccess và thay đổi nội dung thành AddType application/x-httpd-PHP. prplbx

Bước 3. Sau bước này, bây giờ chúng tôi có thể tải lên tệp PHP của bạn bằng. tiện ích mở rộng prplbx

Bước 4. Bây giờ chúng tôi có thể truy cập bí mật của người dùng “Carlos” như chúng tôi đã làm trước đây. Sự khác biệt là, lần này chúng tôi sẽ tạo một yêu cầu GET tới file_upload_test. ppllbx thay vì file_upload_test. php

5. Tải lên Web Shell qua phần mở rộng tệp bị xáo trộn

Tình trạng. Để giải bài tập trong phòng thí nghiệm, hãy tải lên một trình bao web PHP cơ bản, sau đó sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Chúng ta có thể sử dụng chức năng upload file tương tự cho quá trình khai thác. Chúng ta có thể thấy thông báo lỗi trong nội dung phản hồi HTTP. Các tệp PHP không được phép. Chỉ cho phép các tệp JPG và PNG

Bước 2. Sau một vài lần thử, chúng tôi đã tìm thấy một phương pháp thành công. Chúng tôi có thể làm xáo trộn tên tệp, nếu chúng tôi thêm một byte NULL và phần mở rộng được phép vào tên tệp, chúng tôi có thể bỏ qua hạn chế

Bước 3. Bây giờ chúng ta có thể truy cập bí mật của người dùng Carlos như bình thường

6. Thực thi mã từ xa thông qua tải lên Polyglot Web Shell

Tình trạng. Để giải bài tập trong phòng thí nghiệm, hãy tải lên một trình bao web PHP cơ bản, sau đó sử dụng nó để trích xuất nội dung của tệp /home/carlos/secret. Gửi bí mật này bằng cách sử dụng nút được cung cấp trong biểu ngữ phòng thí nghiệm. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau. xúc xích. peter

Bước 1. Chúng ta có thể sử dụng chức năng upload file tương tự cho quá trình khai thác. Chúng ta có thể thấy thông báo lỗi trong nội dung phản hồi HTTP. Các tệp PHP không được phép. Chỉ cho phép các tệp JPG và PNG

Bước 2. Giờ đây, chúng tôi có thể thêm tải trọng PHP vào tệp hình ảnh hợp lệ bằng ExifTool để bỏ qua hạn chế

Bước 3. Sau bước tạo, bây giờ chúng ta có thể tải lên tệp PHP mới của mình

Bước 4. Bây giờ chúng ta có thể truy cập bí mật của người dùng “Carlos” như bình thường

Làm cách nào để ngăn chặn lỗ hổng tải lên tệp?

Cách hiệu quả nhất là thực hiện tất cả các thực hành sau

So sánh phần mở rộng tệp với danh sách trắng các phần mở rộng được phép thay vì danh sách đen các phần mở rộng bị cấm. Việc đoán những tiện ích mở rộng nào bạn có thể muốn cho phép sẽ dễ dàng hơn nhiều so với những tiện ích mở rộng mà kẻ tấn công có thể cố gắng tải lên. Đảm bảo rằng tên tệp không chứa bất kỳ chuỗi con nào có thể vô tình được hiểu là một thư mục hoặc trình tự truyền tải [. /]. Đổi tên các tệp đã tải lên để tránh xung đột có thể khiến các tệp hiện có bị ghi đè. Không tải tệp lên hệ thống tệp của máy chủ cho đến khi chúng được xác thực đầy đủ. Bất cứ khi nào có thể, hãy sử dụng một khung đã thiết lập để xử lý trước các tệp tải lên thay vì cố gắng viết các cơ chế xác thực của riêng bạn

Sự kết luận

Trong bài đăng trên blog này, chúng tôi đã nói về lỗ hổng tải lên tệp là gì và khả năng gây hại của chúng đối với hệ thống. Chúng tôi cũng đã giải thích các phương pháp khai thác lỗ hổng tải tệp lên và cách ngăn chặn lỗ hổng tải tệp lên.  

Chúng tôi hy vọng bạn thấy bài đăng trên blog của chúng tôi hữu ích và nó sẽ giúp bạn thực hiện các tệp tải lên an toàn trong tương lai. Đừng quên kiểm tra các dịch vụ Kiểm tra thâm nhập của chúng tôi để giữ an toàn

Chủ Đề