2016-02-22 1 views
6

Представьте, что приложение PHP для игрушек уязвимо к включению абсолютного локального файла, например.Почему включение ('php: // input') не работает?

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

Я попробовал следующий запрос на использование его:

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

foo 

Это эффективно выполняет include('php://input'); с телом запроса foo, так что я ожидал бы напечатать foo. Однако я получаю следующую ошибку:

<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 /> 

В чем проблема? Является ли это функцией безопасности PHP? Если да, может ли кто-нибудь указать на ответственную часть исходного кода PHP, которая смягчает это?

+0

Как насчет пользовательских потоков? Используя 'stream_wrapper_register' и весь этот джаз? – Halcyon

+2

Проверьте значение этого параметра в вашей конфигурации http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-include – Gustek

+0

@Halcyon Я слушаю. Я не нашел это пригодным для использования на современной установке LAMP, за исключением случаев, когда у вас есть примитив с файловой записью (например, 'session_start()' или журналирование, специфичное для приложения) и т.д.) –

ответ

2

Я нашел ответ с помощью Gustek. Видимо php://input подпадает под restrction из allow_url_include, в то время как, например php://filter нет:

Ограничен allow_url_include: PHP: // ввод, PHP: // стандартный ввод, PHP: // память и PHP: только // темп ,

Источник: Docs for php:// URL handler

Смежные вопросы