想象一个玩具PHP应用程序容易受到绝对本地文件包含的影响,例如
<?php include($_GET['action']);
我尝试了以下请求来利用它:
POST /?action=php://input HTTP/1.1
Host: XXXXXXXXXXXXXXXXX
Content-Length: 3
foo
这有效地执行了带有请求正文foo
include('php://input');
,因此我希望它打印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源代码中负责任的部分来缓解这种情况吗?
我在Gustek的帮助下找到了答案。显然php://input
属于allow_url_include
的恢复,而例如php://filter
则不属于:
受allow_url_include限制:仅限 php://input、php://stdin、php://memory 和 php://temp。
来源:php://
网址处理程序的文档