当前位置: 首页 > news >正文

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

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

相关文章:

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

目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况&#xff1a;非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...

【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大

基于ICImapping构建遗传图谱的常见问题与解答 问题一&#xff1a;染色体两端标记间遗传距离gap较大 答疑一 标记密度不足&#xff08;如芯片设计时分布不均&#xff09;重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Windows下sql server2012安装流程

准备工作 确认系统要求&#xff1a;确保 Windows 系统为 Windows 7 或更高版本&#xff0c;且为 64 位操作系统&#xff0c;CPU 在 2GHz 以上&#xff0c;内存 4GB 或更高。 下载安装包&#xff1a;从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...

css之英文换行样式

在 CSS 中&#xff0c;要实现英文文本自动换行但不从单词中间断开的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...

文件解析: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解析&#xff1a; import te…...

计算机网络基础:VLAN(虚拟局域网)

1. VLAN 虚拟局域网&#xff1a;可以用来隔离广播 广播和广播域&#xff1a; arp 出不了路由器&#xff0c;只能攻击内网 路由器可以隔离广播&#xff08;物理隔离&#xff09;缺点是成本高、不灵活 2. VLAN 隔离广播 静态VLAN&#xff1a;基于交换机端口号划分 动态VLAN&am…...

C++学习笔记(十一)——循环结构

循环结构的作用 循环结构用于重复执行某一代码块&#xff0c;直到满足特定条件后退出循环。 C 提供了以下三种循环结构&#xff1a; for 循环&#xff08;确定次数的循环&#xff09;while 循环&#xff08;条件控制的循环&#xff09;do-while 循环&#xff08;至少执行一次的…...

【C++】二叉树相关算法题

一、根据二叉树创建字符串 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有…...

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 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 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

自学Java-JavaSE基础加强(多线程)

自学Java-JavaSE基础加强&#xff08;多线程&#xff09; 一、创建线程1、方式一&#xff1a;继承Thread类小结 2、方式二&#xff1a;实现Runnable接口小结 3、方式三&#xff1a;实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...

数字后端培训实战项目六大典型后端实现案例

Q1:请教一个问题&#xff0c;cts.sdc和func.sdc在innovus用如何切换&#xff1f;在flow哪一步切换输入cts.sdc&#xff1f;哪一步切换到func.sdc&#xff0c;具体如何操作&#xff1f; 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的&#xff1f;针对时…...

安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求

软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的&#xff0c;完全免费&#xff0c;无需破解和激活就能使用。 此前&#xff0c;我们分享过它的桌面端&#xff0c;收获了大家的一致好评。今天要着重介绍的手机APP版本&…...

diffuser库使用本地模型生成图像

实验目的 使用diffuser库生成图像的文章是很多的&#xff0c;使用方法也并不复杂&#xff0c;安装库后调用现成的模型和接口即可&#xff0c;但是因为网络原因&#xff0c;模型下载总会遇到问题&#xff0c;对于使用服务器的研究者来说&#xff0c;挂梯子并不可行&#xff0c;…...

递归—基础算法

#基线条件和递归条件 #每个递归函数都有两部分&#xff1a;基线条件和递归条件。递归条件指的是函数调用自己&#xff0c;而基线条件则指的是函数不再调用自己&#xff0c;从而避免形成无限循环。 #栈&#xff1a;栈是一种数据结构&#xff0c;它是一种线性数据结构&#xff0c…...

全面复习回顾——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 案例分析&#xff1a;5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析&#xff1a;卫星通信系统实例…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...