我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP文件上传中fileinfo出现的安全问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP文件上传中fileinfo出现的安全问题

什么是fileinfo

fileinfo的函数通过在文件的给定位置查找特定的魔术字节序列 来猜测文件的内容类型以及编码,也就是说我们可以获得上传文件的MIME信息

在windows中我们可以在php.ini中开启
在这里插入图片描述

extension=fileinfo

在linux中开启fileinfo

找到fileinfo的路径执行命令:find / -name fileinfo,查询到fileinfo所在目录执行phpsize命令执行命令:/usr/local/php/bin/phpize执行configure配置执行命令:./configure --with-php-config=/usr/local/php/bin/php-config注意:如果提示php-config命令不存在,则需要先安装php-devel,执行命令:yum install php-devel。编译安装命令:make && make install修改php.ini文件在php.ini文件中添加extension=fileinfo.so

在打开fileinfo后我们就可以使用fileinfo扩展了
那fileinfo包括哪些呢
在这里插入图片描述
像如图红圈中的那些都是fileinfo扩展。

fileinfo预定义常量

常量名作用
FILEINFO_NONE无特殊处理
FILEINFO_SYMLINK跟随符号链接
FILEINFO_MIME_TYPE返回 mime 类型。 自 PHP 5.3.0 可用
FILEINFO_MIME_ENCODING返回文件的 mime 编码。 自 PHP 5.3.0 可用
FILEINFO_MIME按照 RFC 2045 定义的格式返回文件 mime 类型和编码
FILEINFO_COMPRESS解压缩压缩文件。 由于线程安全问题,自 PHP 5.3.0 禁用
FILEINFO_DEVICES查看设备的块内容或字符
FILEINFO_CONTINUE返回全部匹配的类型
FILEINFO_PRESERVE_ATIME如果可以的话,尽可能保持原始的访问时间
FILEINFO_RAW对于不可打印字符不转换成 \ooo 八进制表示格式
FILEINFO_EXTENSION根据 MIME 类型返回适当的文件扩展名。 有的文件类型具有多种扩展名,例如 JPEG 将会返回多个扩展名,以斜杠分隔,比如 “jpeg/jpg/jpe/jfif”。如果在 magic.mime 数据库里类型未知,则返回的是 “???”。 PHP 7.2.0 起有效

如何使用fileinfo去过滤上传文件

首先我们要创建一个 fileinfo 资源,然后就可以调用 fileinfo 资源了

$file = $_FILES;$finfor = finfo_open(FILEINFO_MIME_TYPE);$info = finfo_file($finfor, $file['jpg']['tmp_name']); //拿上传文件的MIME头与finfo_open()返回mime类型进行比较返回真实的mime头

此时若上传文件是txt文件伪造后的jpg等图片文件则会返回一个txt文件的mime头
那修改掉数据包中的mime头可以绕过吗?
在这里插入图片描述
上面这图就是直接上传的一个txt改jpg图片文件的,可以看到他的mime类型为image/jpeg

POST /study/wjsc/sc.php HTTP/1.1Host: 192.168.0.106Content-Length: 199Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Origin: http://192.168.0.106Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymrijfqP5su2sSW5YUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Referer: http://192.168.0.106/study/wjsc/sc.phpAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close------WebKitFormBoundarymrijfqP5su2sSW5YContent-Disposition: form-data; name="jpg"; filename=".jsp.jpg"Content-Type: image/jpeg<?php phpinfo();?>------WebKitFormBoundarymrijfqP5su2sSW5Y--

看一下上传后的效果
在这里插入图片描述
提示不合法,可以看一下返回的mime类型
在这里插入图片描述
返回为text/x-php类型。

如何去绕过fileinfo检测

这样写看似安全,但是由于fileinfo的检测原理恰恰会出现安全漏洞。
首先,先上传一个正常的图片
在这里插入图片描述
提示合法。
那接下来若上传的是一个图片马呢
图片马的合成
在这里插入图片描述
提示合法,可以看到mime类型也是image/png,那由此可见fileinfo也不是无敌的。
在这里插入图片描述
接下来就是思考正常的图片与伪造过后的图片有哪些不一样,在一张图片中大概是由文件头和内容组成那伪造的图片除了内容以外就是文件头的问题了
在伪造的文件中加上GIF89a,然后上传。
在这里插入图片描述
可以看到提示合法
在这里插入图片描述
就这样就绕过了fileinfo的检测
方便实验我将文件后缀改成了.php
在这里插入图片描述
执行成功!
在墨者学院的在线靶场中也存在一样的漏洞靶场可以帮助快速了解这个漏洞

来源地址:https://blog.csdn.net/m0_52361291/article/details/125902327

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP文件上传中fileinfo出现的安全问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么解决php上传文件出错问题

这篇文章将为大家详细讲解有关怎么解决php上传文件出错问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php上传文件出错的解决办法:1、在php.ini配置文件中设置“post_max_size”的值;
2023-06-08

php上传中文文件无法上传问题怎么解决

php上传中文文件无法上传的解决办法:1、通过“iconv("GBK", "UTF-8", $content);”方法将中文字符编码转换一下;2、将文件重命名即可。
2023-05-14

怎么解决php不能上传中文文件问题

这篇文章主要介绍“怎么解决php不能上传中文文件问题”,在日常操作中,相信很多人在怎么解决php不能上传中文文件问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决php不能上传中文文件问题”的疑惑有所
2023-06-20

完全解决FTP上传文件名称中文乱码问题

完全解决FTP上传文件名称中文乱码问题 说明无效踩坑经历 有效解决方法定时上传文件至ftp样例 说明 今天项目上加了个定时扫描本地文件路径下所有文件实现自动上传至ftp文件服务器的功能,经测试发现一旦上传中文名称的文件
2023-08-21

如何处理PHP开发中的文件上传和下载问题

在PHP开发中,文件上传和下载是常见的功能需求。本文将介绍如何处理PHP开发中的文件上传和下载问题,并提供具体的代码示例,帮助读者快速上手。一、文件上传创建上传表单首先,需要在页面上创建一个上传表单,以便用户选择并上传文件。可以使用HTML
2023-10-21

如何解决php只能上传1k内的文件问题

这篇文章主要讲解了“如何解决php只能上传1k内的文件问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决php只能上传1k内的文件问题”吧!php只能上传1k内的文件的解决办法:1、
2023-06-25

PHP 框架安全指南:如何保护上传的文件?

问题:如何保护 php 框架中的文件上传安全?答案:通过遵循以下步骤,保护 php 框架中的文件上传安全:验证文件类型:防止恶意文件上传。限制文件大小:确保文件大小在可接受范围内。使用安全存储位置:避免将文件存储在 web 可访问的目录。过
PHP 框架安全指南:如何保护上传的文件?
2024-05-23

SpringMVC文件上传中要解决的问题大汇总

这篇文章主要介绍了SpringMVC文件上传中要解决的问题,主要有中文文件名编码问题,文件位置存储问题以及文件名冲突问题等等,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
2023-01-15

怎么解决php ueditor上传图片出现未知错误的问题

小编给大家分享一下怎么解决php ueditor上传图片出现未知错误的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php ueditor上传图片出现未知错误
2023-06-25

如何解决php ueditor上传图片出现未知错误的问题

php ueditor上传图片出现未知错误的解决办法:1、找到并打开php.ini配置文件;2、修改“upload_tmp_dir”的参数即可。
2015-05-21

如何在phpcms中安全地处理用户上传的文件?(phpcms环境下如何确保用户上传文件的安全性?)

在PHPCMS中安全处理用户上传文件的方法:验证文件类型限制文件大小扫描恶意软件重命名文件限制文件存储位置清理输入使用安全协议定期备份和监视定期更新系统对上传用户进行身份验证其他建议:使用云存储服务实施文件版本控制审计文件使用情况定期审核上传过程
如何在phpcms中安全地处理用户上传的文件?(phpcms环境下如何确保用户上传文件的安全性?)
2024-04-02

如何处理Go语言中的并发文件上传问题

在Go语言中处理并发文件上传问题时,可以使用goroutine来实现并发上传。下面是一个简单的示例代码:```gopackage mainimport ("fmt""io""net/http""os""path/filepath")func
2023-10-09

如何处理Go语言中的并发文件上传问题?

如何处理Go语言中的并发文件上传问题?随着互联网的发展,文件上传在日常开发中变得越来越常见。而在文件上传的过程中,处理多个文件的并发上传问题成为了一个关键的考虑因素。本文将介绍如何使用Go语言来处理并发文件上传问题,并提供具体的代码示例。一
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录