你写的防止任意文件上传漏洞的代码,不一定安全

这篇具有很好参考价值的文章主要介绍了你写的防止任意文件上传漏洞的代码,不一定安全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明:任意文件上传漏洞,很多PHP开发者也会做一些简单的防护,但是这个防护有被绕过的可能。

原生漏洞PHP示例代码:

$file = $_FILES['file'] ?? [];
//检测文件类型
$allow_mime = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'];
if(! in_array($file['type'], $allow_mime)) {
    echo json_encode(['code' => 1, 'msg' => "文件类型错误"], JSON_UNESCAPED_UNICODE);
    return;
}

print_r($file);

上传一个PHP文件,提示文件类型错误,使用ApiPost修改上传的Content-Type,把原先的application/x-httpd-php修改为image/png,则可绕过。
因为:$_FILES['type']是根据上传文件的content-type获取的,并文件本身的mime-type,而content-type又可以被篡改。

原生漏洞PHP漏洞优化意见(获取临时文件的真实类型):

$file = $_FILES['file'] ?? [];
//检测文件类型
$allow_mime = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'];
if(! in_array((new \finfo(\FILEINFO_MIME_TYPE))->file($file['tmp_name']), $allow_mime)) {
    echo json_encode(['code' => 1, 'msg' => "文件类型错误"], JSON_UNESCAPED_UNICODE);
    return;
}

print_r($file);

对Laravel框架,也有同样的问题,别用错函数:

$file->getClientMimeType(); //相当于$_FILES['file']['type'];
$file->getMimeType(); //相当于(new \finfo(\FILEINFO_MIME_TYPE))->file($_FILES['file']['tmp_name'])

说话得有依据,经过反复的追Laravel的源码:

底层对getClientMimeType()的实现:
是在vendor/symfony/http-foundation/Request.php的createFromGlobals()中,基于$_FILES做的封装。
底层对getMimeType()的实现:
是在vendor/symfony/mime/FileinfoMimeTypeGuesser.php的guessMimeType()中,利用finfo的内置PHP类实现的。

对Laravel任意文件上传漏洞优化意见(获取临时文件的真实类型):

使用getMimeType函数。

整体修复意见:

先判断文件后缀,在判断临时文件的mime类型属性,不要根据请求头判断。

扩展:

mime_content_type函数与(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path')的区别?

检测文件mime类型,还有一个mime_content_type();

  1. mime_content_type()获取的mime类型,会与操作系统的mime类型有映射,意味着不同的系统可能存在一些小差别。
  2. finfo类使用了 PHP 的 FileInfo 扩展。FileInfo 扩展利用了文件的特征签名(或称为魔术数字)来检测文件的实际类型,并根据文件的内容进行精确的 MIME 类型推断。

虽然两者相差不大,但是推荐用(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path');

(new \finfo(\FILEINFO_MIME_TYPE))->file('file_path')与finfo_file()的区别?

使用finfo_file()也可以获取文件的mime类型。

$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file['tmp_name']);
$mime = (new \finfo(FILEINFO_MIME_TYPE))->file($file['tmp_name']);

两者底层对获取mime类型的实现无差别,展示写法不同。

什么是文件的魔术数字?

文件的魔术数字是文件头部的一段特定的字节序列,用来描述文件的类型或格式,一般用16进制表示。
文件的魔术数字一般包含一些特殊的字符和数字组成的固定长度的字节串,不同类型的文件具有不同的魔术数字。例如,PNG 图像文件的魔术数字为 89 50 4E 47 0D 0A 1A 0A,而 JPG 图像文件的魔术数字为 FF D8 FF E0 00 10 4A 46 49 46 00 01。
PHP获取魔术数字实现方案:文章来源地址https://www.toymoban.com/news/detail-760011.html

$fileHandle = fopen($_FILES['file']['tmp_name'], 'rb');
$hex = '';
while (! feof($fileHandle)) {
    $byte = fread($fileHandle, 1);
    $hex .= sprintf("%02X ", ord($byte));
}
fclose($fileHandle);
echo $hex;

到了这里,关于你写的防止任意文件上传漏洞的代码,不一定安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现

    致远OA是一套办公协同管理软件。致远OA wpsAssistServlet接口存在任意文件上传漏洞,攻击者通过漏洞可以发送特定的请求包上传恶意文件,获取服务器权限。 致远OA A6、A8、A8N (V8.0SP2,V8.1,V8.1SP1) 致远OA G6、G6N (V8.1、V8.1SP1) 1、调用文件上传接口上传测试文件,请求包如下: 2、

    2024年02月11日
    浏览(51)
  • Ueditor编辑器任意文件上传漏洞

    UEditor是一款所见即所得的开源富文本编辑器,具有轻量、可定制、用户体验优秀等特点,被广大WEB应用程序所使用。本次爆出的高危漏洞属于.NET版本,其它的版本暂时不受影响。漏洞成因是在抓取远程数据源的时候未对文件后缀名做验证导致任意文件写入漏洞,黑客利用此

    2024年01月21日
    浏览(44)
  • 蓝凌OA sysUiComponent 任意文件上传漏洞复现

         蓝凌核心产品EKP平台定位为新一代数字化生态OA平台,数字化向纵深发展,正加速构建产业互联网,对企业协作能力提出更高要求,蓝凌新一代生态型OA平台能够支撑办公数字化、管理智能化、应用平台化、组织生态化,赋能大中型组织更高效的内外协作与管理,支撑商

    2024年02月05日
    浏览(30)
  • weblogic 任意文件上传漏洞 (CVE-2018-2894)

    搭建环境: docker-compose up -d  查看weblogic后台登录密码:docker-compose logs | grep password 漏洞成因:weblogic管理端未授权的两个页面存在任意文件上传getshell漏洞,可直接获取webshell。 影响版本:WebLogic :10.3.6.0,12.1.3.0,12.2.1.2,12.2.1.3 漏洞地址:/ws_utc/begin.do、/ws_utc/config.do 默认端

    2023年04月08日
    浏览(39)
  • 《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

    文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权限,造成严重

    2024年02月12日
    浏览(33)
  • 奇安信天擎 rptsvr 任意文件上传漏洞复现

    奇安信天擎是奇安信集团旗下一款致力于一体化终端安全解决方案的终端安全管理系统(简称“天擎”)产品。通过“体系化防御、数字化运营”方法,帮助政企客户准确识别、保护和监管终端,并确保这些终端在任何时候都能可信、安全、合规地访问数据和业务。天擎基于

    2024年01月19日
    浏览(27)
  • CVE-2020-17518 flink任意文件上传漏洞复现

    Apache Flink 是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。 编号:CVE-2020-17518 Flink 1.5.1引入了REST API,但其实现上存在多处

    2024年02月10日
    浏览(31)
  • Weblogic 任意文件上传漏洞(CVE-2018-2894)复现

    目录 weblogic  漏洞环境准备 漏洞复现 修复建议 WebLogic 是 美国Oracle公司 出品的一个 application server ,确切的说是一个基于 JAVAEE 架构的 中间件 , WebLogic 是用于 开发 、集成、部署和管理大型分布式 Web 应用、 网络应用 和 数据库应用 的 Java应用服务器 。将 Java 的动态功能和

    2024年02月01日
    浏览(34)
  • 金蝶Apusic应用服务器 任意文件上传漏洞复现

       金蝶Apusic应用服务器(Apusic Application Server,AAS)是一款标准、安全、高效、集成并具丰富功能的企业级应用服务器软件,全面支持JakartaEE8/9的技术规范,提供满足该规范的Web容器、EJB容器以及WebService容器等,支持Websocket1.1、Servlet4.0、HTTP2.0等最新的技术规范,为企业级应

    2024年02月04日
    浏览(67)
  • 用友时空KSOA ImageUpload任意文件上传漏洞复现+利用

      用友时空KSOA是建立在SOA理念指导下研发的新一代产品,是根据流通企业最前沿的I需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的IT系统之间彼此轻松对话,帮助流通企业保护原有的IT投资,简化IT管理,提升竞争能力,确保企业整体的战略目标以及创新活

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包