文件上传漏洞与phpcms漏洞安全分析

目录

1. 文件上传漏洞简介

2. 文件上传漏洞的危害

3. 文件上传漏洞的触发条件

1. 文件必须能被服务器解析执行

2. 上传目录必须支持代码执行

3. 需要能访问上传的文件

4. 例外情况:非脚本文件也可能被执行

4. 常见的攻击手法

4.1 直接上传恶意文件

4.2 文件扩展名绕过

4.3 解析漏洞利用

5. 文件上传漏洞的防御措施

5.1 文件类型检查

5.2 上传路径与访问控制

5.3 服务器配置安全

6.phpcms文件上传漏洞安全分析

6.1.前言

6.2.漏洞情况

第一关:初代 PHPCMS 头像上传漏洞

第二关:FineCMS 的补丁与再次绕过(竞争条件漏洞)

​编辑

第三关:利用随机数生成目录名漏洞

第四关:新补丁

正确的修复方式

结论


1. 文件上传漏洞简介

文件上传漏洞是一种常见的 Web 安全漏洞,攻击者可以通过该漏洞上传恶意文件,如 WebShell、木马或其他恶意代码脚本,以实现远程控制服务器、窃取数据或发起进一步攻击。这类漏洞通常源于 Web 应用在文件上传功能的安全校验不当,例如缺乏文件类型验证、文件存储位置不合理或服务器解析机制存在漏洞。

2. 文件上传漏洞的危害

文件上传漏洞可能导致以下安全风险:
1. 代码执行:攻击者上传 Web 脚本语言文件(如 .php、.jsp、.asp),服务器解析执行后,黑客可直接控制服务器。
2. 恶意文件传播:上传病毒或木马文件,诱骗用户或管理员下载执行,导致感染。
3. 策略文件篡改:上传 crossdomain.xml 等策略文件,控制 Flash 或其他前端组件的跨域行为,可能导致 CSRF、XSS 等安全问题。
4. 钓鱼与欺诈:上传伪造的钓鱼图片,或利用图片解析漏洞,在部分浏览器环境下执行恶意 JavaScript 代码。
5. 服务器程序溢出:利用某些应用的文件解析逻辑漏洞,如图片处理模块缺陷,实现远程代码执行(RCE)。
6. 本地文件包含(LFI)利用:上传包含恶意 PHP 代码的文本文件,再通过 LFI 漏洞执行该脚本,从而实现服务器控制。

3. 文件上传漏洞的触发条件

要成功利用文件上传漏洞,攻击者上传的后门文件需要满足以下关键条件:

1. 文件必须能被服务器解析执行

攻击者上传的恶意文件必须符合服务器的运行环境。例如:

  • 如果服务器运行的是 PHP 环境,则攻击者需要上传 .php 文件
  • 如果服务器运行的是 JSP 环境,则需要上传 .jsp 文件
  • 如果服务器运行的是 ASP.NET,则 .aspx 文件可能有效。

示例:
如果目标服务器只支持 PHP,而攻击者上传的是 Java Webshell(.jsp),即使上传成功,服务器也无法解析执行,攻击仍然无效。

2. 上传目录必须支持代码执行

即使上传了可执行脚本,文件存储的路径也必须是可执行目录,否则服务器不会解析代码。

  • 可执行目录: 服务器会解析 .phpjspasp 等脚本,并执行其中的代码。
  • 非可执行目录: 服务器会将脚本文件当作普通文本处理,无法运行恶意代码。

示例:
如果 Web 应用将上传的文件存放在 /uploads/ 目录,并且 Nginx 或 Apache 已经配置禁止该目录执行脚本,那么即使攻击者上传了 shell.php,服务器也不会解析并执行其中的代码,攻击失败。

3. 需要能访问上传的文件

通常,上传文件成功后,服务器会返回上传文件的访问地址。如果攻击者无法访问这个地址,文件上传漏洞也无法被利用。

示例:

  • 如果服务器存储路径是 /var/www/uploads/,但外部无法访问该目录,即使攻击者上传了 Webshell 也无法触发它。
  • 如果文件上传成功,但服务器未返回文件访问路径,攻击者无法得知上传文件存放在哪里,除非能通过其他漏洞(如目录遍历)找到它。

4. 例外情况:非脚本文件也可能被执行

某些情况下,即使上传的不是脚本文件,也可能被服务器错误解析,从而执行恶意代码。例如:

  • 图片马(图片木马):攻击者上传一张 .jpg.png 图片,但图片的元数据中隐藏了 PHP 代码。如果服务器存在解析漏洞,可能会执行隐藏代码。
  • 配置错误的 Web 服务器:某些中间件(如 Apache、Nginx、IIS)可能存在解析漏洞,使非 .php 文件也会被当作 PHP 代码解析。

4. 常见的攻击手法

4.1 直接上传恶意文件

攻击者利用未做任何安全限制的上传接口,直接上传如 .php.jsp.asp 等可执行脚本。

4.2 文件扩展名绕过

攻击者使用以下方式绕过服务器对文件后缀的限制:

  • 双重扩展名(如 shell.php.jpg
  • 大小写绕过(如 SHELL.PHP
  • 空格或特殊字符绕过(如 shell.php.
  • MIME 类型伪造(通过修改 Content-Type 伪造合法文件)

4.3 解析漏洞利用

不同 Web 服务器对文件解析方式不同,可能导致绕过扩展名检查。例如:

  • Apache 服务器:支持 .htaccess 配置文件,攻击者可以上传 .htaccess 文件修改解析规则。
  • IIS 服务器:shell.asp;.jpg 可能仍会被解析为 .asp
  • Nginx 解析漏洞:某些版本可能会错误解析 .php/ 文件。

5. 文件上传漏洞的防御措施

5.1 文件类型检查

  • 采用白名单机制,仅允许上传安全的文件类型,如 .jpg.png.pdf 等。

  • 验证文件扩展名,避免使用双重扩展名(如 shell.php.jpg)绕过检测。

  • 检查 MIME 类型,防止攻击者伪造文件类型。

  • 使用文件内容分析工具(如 fileinfo)检查文件实际类型。

5.2 上传路径与访问控制

  • 存储文件时重命名,避免使用用户自定义的文件名。

  • 限制上传目录的权限,确保其不可执行(例如通过 Nginx 配置 disable_php )。

  • 采用分离存储策略,将上传文件存放在与 Web 目录隔离的存储服务器上。

  • 避免返回完整的文件路径,降低攻击者利用漏洞的可能性。

5.3 服务器配置安全

  • 禁止执行上传目录中的脚本,如 Apache 配置 .htaccess 限制 PHP 解析。

  • 禁用危险函数,如 eval()exec(),防止远程代码执行。

  • 开启 WAF(Web 应用防火墙),检测并拦截恶意上传行为。

  • 定期扫描上传文件,发现并删除可疑文件。

6.phpcms文件上传漏洞安全分析

6.1.前言

PHPCMS 曾经是国内流行的 CMS 之一,但因安全漏洞频发,给广大站点带来了严重的安全隐患。其中,头像上传漏洞尤为经典,不仅影响 PHPCMS 本身,还波及了大量借鉴其代码的 CMS,如 FineCMS。

6.2.漏洞情况

第一关:初代 PHPCMS 头像上传漏洞

PHPCMS 头像上传功能的逻辑如下:

  1. 用户上传 ZIP 压缩包。

  2. 服务器解压 ZIP,并删除非 JPG 文件。

漏洞代码片段:

漏洞点分析

  • 解压后仅删除 ZIP 根目录中的非法文件,但未递归删除文件夹中的非法文件

复现步骤如下:

  1. 攻击者可上传 ZIP 包,其中包含 test 目录,并在其中放置 web.php,绕过删除机制。

第二关:FineCMS 的补丁与再次绕过(竞争条件漏洞)

FineCMS 修复代码:

利用时间差上传 ZIP 文件,其中包含如下代码:

<?php fputs(fopen('../../../../../shell.php','w'),'<?php phpinfo();eval($_POST[a]);?>');?>

在服务器解压 ZIP 并执行删除操作的瞬间,攻击者访问 webshell,实现 Getshell。

复现步骤如下:利用burp抓包,然后通过不停发包与刷新,访问php文件,让他在上级或者其他级目录生成恶意代码

第三关:利用随机数生成目录名漏洞

为了防止竞争条件攻击,开发者修改了代码,使上传的文件存放在随机命名的目录中。然而,新机制未能正确处理解压失败的情况,导致 Webshell 仍然可能被上传。

复现步骤如下:

  1. 构造一个解压失败的压缩包。
  2. 让 PHPCMS 处理解压失败,但部分文件仍然被释放到 Web 目录。
  3. 由于目录删除机制缺陷,Webshell 仍然得以保留。

如何构造解压失败的压缩包

第四关:新补丁

  • 头像文件解压至随机命名的目录。

  • 发生错误时,立即删除临时目录。

代码示例:

绕过方法:路径穿越攻击(Directory Traversal)

  • 构造 ZIP 文件,修改其内部文件名,如 ../../../index.php

  • 利用 Notepad++ 修改 ZIP 内部文件路径,上传后覆盖网站根目录的 index.php,实现 Webshell。

正确的修复方式

以上漏洞的根本问题在于:

  1. 不应直接在 Web 目录下解压用户上传的文件

  2. 应使用白名单方式限制解压文件

  3. 避免使用 Zip 方式上传头像,改用前端处理

安全修复方案:

  • 将 ZIP 文件解压到临时目录(如 /tmp)

  • 仅提取合法的 JPG 文件,其他文件一律忽略

  • 对解压缩的文件进行严格 MIME 类型检测

  • 采用白名单方式,避免黑名单的局限性

结论

PHPCMS 头像上传漏洞的演变历程,展现了补丁打补丁的错误思路。正确的修复方法应从设计上避免问题,而不是简单地对抗攻击者的新手法。开发者应深刻理解文件上传的安全风险,避免重蹈覆辙。

仅仅是技术分享,不要再审核卡我啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)📚前言📚页面效果📚指令输入…

「多开浏览器」颜值升级之「消灭堆叠的窗口」(二)

01 传统指纹浏览器的架构 传统指纹浏览器&#xff08;也称为多用户浏览器或反检测浏览器&#xff09;是一种用于模拟多个独立用户环境的技术工具&#xff0c;主要用于网络爬虫、广告验证、社交媒体管理等场景。其核心目标是通过模拟不同的浏览器指纹&#xff08;Browser Finge…

IndexError: index 0 is out of bounds for axis 1 with size 0

IndexError: index 0 is out of bounds for axis 1 with size 0 欢迎来到英杰社区&#xff0c;这里是博主英杰https://bbs.csdn.net/topics/617804998 报错原因 数组或数据结构为空 如果数组或 DataFrame 在指定的维度上没有任何元素&#xff08;例如&#xff0c;没有列&#x…

本地部署阿里万象2.1文生视频模型(Wan2.1-T2V)完全指南

在生成式AI技术爆发式发展的今天,阿里云开源的万象2.1(Wan2.1)视频生成模型,为创作者提供了从文字/图像到高清视频的一站式解决方案。本文针对消费级显卡用户,以RTX 4060 Ti 16G为例,详解本地部署全流程与性能调优方案,涵盖环境配置、多模型选择策略、显存优化技巧及实战…

[Python学习日记-85] 并发编程之多进程 —— Process 类、join 方法、僵尸进程与孤儿进程

[Python学习日记-85] 并发编程之多进程 —— Process 类、join 方法、僵尸进程与孤儿进程 简介 multiprocessing 模块 Process 类 僵尸进程与孤儿进程 简介 在前面的进程理论的介绍当中我们已经介绍了进程的概念、并发与并行的区别以及进程并发的实现理论&#xff0c;这些都…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中&#xff0c;单条数据的日期拿取&#xff0c;并判断上下班打卡情况。代码可能满足不了大部分需求&#xff0c;目前只够本公司用&#xff0c;如果需要&#xff0c;可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…

Python项目】基于Python的图像去雾算法研究和系统实现

Python项目】基于Python的图像去雾算法研究和系统实现 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;图像去雾系统主要是基于暗通道先验和逆深度估计技术的去雾算法&#xff0c;系统功能模块分为&#xff08;1&#xff09;图像上传模块&…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…

模块11_面向对象

文章目录 模块11_面向对象模块十回顾&&模块十一重点 第一章.接口1.接口的介绍2.接口的定义以及使用3.接口中的成员3.1抽象方法3.2默认方法3.3静态方法3.4成员变量3.4成员变量 4.接口的特点5.接口和抽象类的区别 第二章.多态1.多态的介绍2.多态的基本使用3.多态的条件下…

常见webshell工具的流量特征

1、蚁剑 1.1、蚁剑webshell静态特征 蚁剑中php使用assert、eval执行&#xff1b;asp只有eval执行&#xff1b;在jsp使用的是Java类加载&#xff08;ClassLoader&#xff09;&#xff0c;同时会带有base64编码解码等字符特征。 1.2、蚁剑webshell动态特征 查看流量分析会发现…

03标准IO接口

一、系统与标准IO的区别 相同点:系统IO与标准IO都可以操作linux系统下的文件。 ⭐不同点: 系统IO&#xff1a;打开文件得到的是一个整数&#xff0c;称为文件描述符。 标准IO&#xff1a;打开文件得到的是一个指针&#xff0c;称为文件指针。系统IO&#xff1a;可以访问linux…

Axure高保真Element框架元件库

点击下载《Axure高保真Element框架元件库》 原型效果&#xff1a;https://axhub.im/ax9/9da2109b9c68749a/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 Element 框架的组件元件集。通过对 Element 框架组件的深入剖析&#xff0c;结合 Axure 的强大功能&#…

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢&#xff1f;有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达&#xff1a;指 操作系统 将一个信号&#xff08;Signal…

【FL0090】基于SSM和微信小程序的球馆预约系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

因子分析讲解

一、定义 因子分析&#xff08;Factor Analysis&#xff09;是一种常用于多变量统计分析的方法&#xff0c;主要用于数据降维、识别潜在的结构、理解变量间的关系。它通过将一组观察变量&#xff08;通常是高度相关的变量&#xff09;转化为一组较少的、互不相关的因子&#x…

从 JVM 源码(HotSpot)看 synchronized 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…

Metal学习笔记十一:贴图和材质

在上一章中&#xff0c;您设置了一个简单的 Phong 光照模型。近年来&#xff0c;研究人员在基于物理的渲染 &#xff08;PBR&#xff09; 方面取得了长足的进步。PBR 尝试准确表示真实世界的着色&#xff0c;真实世界中离开表面的光量小于表面接收的光量。在现实世界中&#xf…