2013-02-09 30 views
7

Tôi đang cố gắng để tái tạo các Null Byte tiêm tấn công trên một hình thức tải lên. Tôi có mã này:Null byte tiêm trong một hình thức tải lên

<?php 
if(substr($_FILES['file']['name'], -3) != "php") { 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])) 
    echo '<b>File uploaded</b>'; 
    else 
    echo '<b>Can not upload</b>'; 
} 
else 
    echo '<b>This is not a valid file/b>'; 
?> 

Tôi đang cố gắng để tải lên một tập tin có tên như thế này: file.php% 00jpg vì vậy nó sẽ bỏ qua các substr() và sẽ được tải lên như file.php từ move_uploaded_file () nên dừng lại ở byte rỗng (% 00).

Vấn đề là các tập tin được tải lên không được đặt tên file.php trên máy chủ nhưng file.php% 00jpg (mà có thể được truy cập bằng cách gõ /file.php%2500jpg trong thanh url).
Dường như move_uploaded_file() không quan tâm đến byte rỗng, vì vậy nó hoạt động như thế nào? Có thể tải lên tệp có phần mở rộng .php bằng đoạn mã của tôi không?

Cảm ơn :).

+0

Khai thác đơn giản hơn nhiều: Tệp có thể được tải lên với phần mở rộng "hoạt động" khác, như '.gigi', hoặc' .asp', hoặc '.phtml' – duskwuff

+2

NULL ngộ độc byte đã được sửa trong PHP' 5.3. 4'. –

+3

** Không sử dụng danh sách đen để tải lên tệp **. Sử dụng danh sách trắng. Ngoài ra, tôi có thể nghĩ ra một vài cách dễ dàng xung quanh đó. Bạn nên khử trùng. – Amelia

Trả lời

7

Url biểu mẫu HTML mã hóa tên tệp thành% 2500 và PHP giải mã lại thành% 00 (dấu phần trăm, số không, không). Không có byte null trong thử nghiệm của bạn ở bất kỳ đâu, bạn phải đặt tên tệp bằng một byte null thực tế (không thể) hoặc fiddle với yêu cầu HTTP theo cách thủ công thay vì sử dụng biểu mẫu HTML. Tuy nhiên, các phiên bản PHP hiện tại là không phải là dễ bị tấn công này, PHP bên trong sẽ biến các biến trong một vùng chứa ZVal và cho phép các byte rỗng ở giữa một chuỗi mà không có bất kỳ hiệu ứng nào.

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