2016-02-22 21 views
6

Hãy tưởng tượng một ứng dụng PHP đồ chơi dễ bị tấn công tuyệt đối với tệp nội bộ, ví dụ:Tại sao bao gồm ('php: // input') không hoạt động?

<?php include($_GET['action']); 

Tôi đã thử các yêu cầu sau đây để khai thác nó:

POST /?action=php://input HTTP/1.1 
Host: XXXXXXXXXXXXXXXXX 
Content-Length: 3 

foo 

này có hiệu quả thực thi include('php://input'); với yêu cầu cơ thể foo, vì vậy tôi mong chờ nó để in foo. Tuy nhiên, tôi nhận được lỗi sau đây

<br /> 
<b>Warning</b>: include(php://input): failed to open stream: operation failed in <b>XXXXXXXXXXXXXXXXX</b> on line <b>12</b><br /> 
<br /> 
<b>Warning</b>: include(): Failed opening 'php://input' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>XXXXXXXXXXXXXXXXXXX</b> on line <b>12</b><br /> 

Sự cố ở đây là gì? Đây có phải là tính năng bảo mật của PHP không? Nếu có, ai đó có thể chỉ ra phần trách nhiệm của mã nguồn PHP để giảm thiểu điều này?

+0

gì về suối tùy chỉnh? Sử dụng 'stream_wrapper_register' và tất cả nhạc jazz đó? – Halcyon

+2

Kiểm tra giá trị của tùy chọn này trong cấu hình của bạn http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-include – Gustek

+0

@Halcyon Tôi đang nghe. Không có cách nào tôi đã tìm thấy điều này có thể khai thác trên một thiết lập LAMP hiện đại ngoại trừ nếu bạn có một tập tin nguyên thủy-ghi (chẳng hạn như 'session_start()' hoặc đăng nhập cụ thể ứng dụng vv) –

Trả lời

2

Tôi tìm thấy câu trả lời với sự trợ giúp của Gustek. Rõ ràng php://input thuộc restrction của allow_url_include, trong khi ví dụ php://filter không:

giới hạn bởi allow_url_include: php: // đầu vào, php: // stdin, php: // bộ nhớ và php: // chỉ tạm thời .

Nguồn: Docs for php:// URL handler

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