【问题标题】:How can PHP's finfo::buffer be spoofed?PHP 的 finfo::buffer 如何被欺骗?
【发布时间】:2014-11-12 12:50:19
【问题描述】:

在处理上传文件时$_FILES['foo']['type'] 完全不可靠。我发现如果您更改 OS X 上的扩展名,“类型”会自动更改。

改为考虑:

$fileInfo = new \finfo(FILEINFO_MIME);
$mimeType = $fileInfo->buffer(file_get_contents($_FILES['foo']['tmp_name']));
$mimeType = explode(';', $mimeType);

现在,如果我将 PHP 脚本重命名为 .jpg 并上传(在 OS X 10.10 上)$_FILES['foo']['type'] = image/jpeg$mimeType = text/x-php

文件类型可以很容易地改变,但是 PHP 的 finfo::buffer 怎么会被欺骗呢? PHP 检查的$_FILES['foo']['type']finfo(FILEINFO_MIME) 有什么区别?

【问题讨论】:

    标签: php file


    【解决方案1】:

    PHP 不检查 $_FILES 类型中的任何内容;上传文件时,发送方浏览器正在发送它认为文件类型的元数据。 $_FILES['file']['type'] 只是反映了浏览器上传的这个值。显然,任何人都可以随意恶搞。

    Finfo 使用magic database,它只是文件类型识别特征的集合。即,所有 JPEG 文件都有一个特征标头,所有 ZIP 文件都以某种方式开始,这种文件类型具有这些前导字节数,该文件类型具有这些类型的尾随字节等等等等。如果你真的很难欺骗的话想要生成某种类型的有效文件,但绝不是不可能的。

    【讨论】:

      【解决方案2】:

      $_FILES 从包含该文件的 mime 部分的 Content-Type 标头中获取它的类型。该部分由发送文件的任何内容创建,通常是浏览器,它会根据文件扩展名猜测类型。

      另一方面,fileinfo 扩展依赖于 magic_open 库。如果我没记错的话,magic_open 会检查文件的多个属性,包括文件头来确定 mimetype。尝试将 php 嵌入到 html 文件中。我相信,由于文件头是<!DOCTYPE html>,它将确定text/html 是mime 类型。

      【讨论】:

      • 感谢成功的欺骗,您是否需要允许上传 text/html 文件,然后还允许在允许 PHP 文件运行的文件夹中执行文件?例如,如果您只允许使用图像,是否无法使用 finfo 获取 PHP 代码?
      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 2017-01-19
      • 2013-06-29
      • 2011-07-27
      • 2011-03-07
      • 2013-02-22
      • 2018-07-27
      相关资源
      最近更新 更多