php://input 和 file_get_contents 只是输出 POST 数据而不是处理它

php://input and file_get_contents just output the POST data rather than process it

我有以下代码片段。对于 URL QueryString,我传入 php://input。在请求正文中,我传入 <?php echo "ABC";?>

$image_url=$_GET['URL'];
$data = file_get_contents($image_url);
$new = 'images/TEST.jpg';
$upload = file_put_contents($new, $data);

当我卷曲图像时,我得到 <?php echo "ABC";?>。为什么它只打印我传递给它的字符串而不是 ABC

这是一个安全实验室,我在本地 运行 所以我将它用作此漏洞利用的 PoC,例如https://blog.sucuri.net/2016/10/backdoor-abusing-of-php-tricks.html and https://www.exploit-db.com/papers/45870

我知道在查看文件时它不会被执行,但我在正文中发送的 PHP 不应该被解释并放在文件中所以我应该看到 ABC 而不是 <?php echo "ABC";?>.

另一个(更好的)例子:https://www.aptive.co.uk/blog/local-file-inclusion-lfi-testing/

谢谢

Web 服务器的标准配置是在具有 .php 文件扩展名的文件中执行 PHP 指令

您可以将您的网络服务器配置为在文件扩展名为 .jpg 的文件中执行 PHP(具体取决于您使用的网络服务器),但这非常不寻常 - 双重如此因为 JPEG 图像是二进制文件而不是文本文件。


另请注意,允许任意 PHP 被接受为用户输入然后在您的服务器上执行是 非常 危险的。


I'm aware I won't get executed when viewing the file but shouldn't the PHP I sent in the body get interpreted?

没有。将文件读入变量将文件读入变量。 file_get_contents 不执行用户输入中的 PHP 指令。

那也非常危险并且PHP还不错。

只是因为 .jpg 不是 .php 文件,所以默认情况下它不会被 PHP 解释器执行。因此,您只会获得文件的原始内容。

(理论上,您可以配置您的网络服务器,使其将带有 .jpg 扩展名的任何内容传递给 PHP,但我不建议这样做,因为这很可能会使访问变得更加困难实际的图像文件,或者至少减慢它们的处理速度。我想不出一个合理的用例,即应该是图像格式的东西需要通过 PHP 引擎)。


回复您的更新:

shouldn't the PHP I sent in the body get interpreted?

...不。它保存在一个字符串变量中(file_get_contents 只是 returns 文件的原始内容)。 PHP 解释器不评估它 - 实际上在代码被解释时(即在执行之前)然后该值甚至不存在(显然,因为在代码执行之前无法填充变量) .

如果你写过

$data = file_get_contents($image_url);
exec($data);

include($image_url);

那么文件中的代码很可能会被解释,合并到主脚本中并执行。 是一个很大的漏洞。您绝对应该 永远不要 使用直接从外部输入提供的代码,或者通过允许外部输入指定应评估或包含哪个代码文件或片段来执行此操作。

(N.B。不过,上述技术仍然不会导致将“ABC”字符串放入输出文件中。它会导致代码被执行,并且“ABC”被直接作为脚本的结果输出。)