文件上传漏洞与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 案例分析:卫星通信系统实例…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...