php 上传文件触发,PHP文件上传漏洞浅析

article/2025/9/29 5:54:35

PHP文件上传漏洞的浅析。

文件上传简介

在一个正常的网站中,通常都会存在一些允许用户上传文件的地方。但是有一些上传功能的地方没有对用户上传的内容进行过滤,导致会上传木马到服务器并执行命令,甚至控制服务器的权限。

文件上传实现

前端代码。

File uploads

请选择上传的文件:

服务器端代码。<?php

// 通过$_FILES文件上传变量接收上传文件信息

header('content-type:text/html;charset=utf-8');

$fileinfo = $_FILES['myfile'];

$filename = $fileinfo['name'];

$type = $fileinfo['type'];

$tmp_name = $fileinfo['tmp_name'];

$size = $fileinfo['size'];

$error = $fileinfo['error'];

//判断错误号

if($error==UPLOAD_ERR_OK){

if(move_uploaded_file($tmp_name,"uploads/".$filename)){

echo '文件'.$filename.'上传成功';

}else{

echo '文件'.$filename.'上传失败';

}

}

上面是实现文件上传的测试代码,对上传文件没有进行任何的限制,可以进行任意文件的上传,比如以下上传一个php文件。

25e902b3441d1636eb7a1aea44ad573b.png

上传一个php文件,会显示文件test.php上传成功。然后访问该文件。

e817d889b2e830aff177e4d03a2744b3.png

上面是只是一个理想的测试环境,来实现一下由于文件上传存在的一些漏洞。可能在实际环境中有多种的限制,比如对上传文件黑/白名单的限制、上传后文件名的重命名、可写目录没有执行权限等。

接下来复现phpCollab 2.5.1任意文件上传的漏洞,学习一下其中的原理。

phpCollab 2.5.1 - Arbitrary File Upload

8fe9ee9b9d3d01cbe6cb80715f20edaa.png

下载对应的版本,安装。登录后台里面。在客户–>客户组织–>标志处,上传文件的地方存在任意文件上传漏洞。

e86701ffdf55e318161769111bb4c694.png

在标志处可以进行任意文件上传,我们上传一个php后缀的文件,然后通过前端调试分析,可知上传后的文件路径以及名字。

f9df65e04838910775daa7aeaa296448.png

最后,可以访问到上传后的文件。

0c522fa50bd83fd8df64e036ab4fc3ec.png

其中漏洞点在/clients/editclient.php文件的第63~70行。$extension = strtolower( substr( strrchr($_FILES['upload']['name'], ".") ,1) ); // 后缀名字 substr(string,start,length)

if(@move_uploaded_file($_FILES['upload']['tmp_name'], "../logos_clients/".$id.".$extension"))

//move_uploaded_file() 函数将上传的文件移动到新位置。

{

chmod("../logos_clients/".$id.".$extension",0666);

$tmpquery = "UPDATE ".$tableCollab["organizations"]." SET extension_logo='$extension' WHERE id='$id'";

connectSql("$tmpquery");

}

从代码中可以看到没有对上传的文件进行任何的验证,直接通过move_uploaded_file来完成上传操作,并保存在logos_clients文件夹下。

接下来翻译一篇关于文件上传安全测试的文章,来具体学习一下如何来进行测试。

Web应用程序中的允许用户上传文件的函数处,有时候没有对上传内容其进行严格的过滤和验证,可能会导致攻击者利用此漏洞进行攻击。本文进行概述利用文件上传的功能进行渗透测试,将会介绍一些小技巧来绕过黑名单的过滤和一些实用的检测方法。

寻找上传点

文件上传功能非常容易验证和利用,一般在个人信息图片、文件上传和文件导入处。当你测试的时候,Burp被动扫描也会去验证存在上传功能的入口。

测试文件上传类型

一般的Web应用程序都会设置一个黑名单来过滤和验证用户上传的内容,但是有时候百密一疏,一些其他的后缀名会绕过黑名单。另外一种是白名单,只允许用户上传特定的文件。

这个时候需要测试一下允许上传的文件后缀名。使用Burp 测试文件上传类型手工测试一个请求,该请求会收到拒绝上传此类型之类等错误响应。发送这个请求到Burp intruder模块清除其中默认的选项

选择文件上传类型的点

选择不同的文件名,比如php.jpg,asp.jpg等

在选项中,配置grep匹配在第一步中响应出现的字符串。

开始进行测试,那些没有匹配到错误响应字符串的后缀,需要进一步的验证和测试,是否可以上传成功。关键点

使用Burp Intruder测试所有的后缀,使用Grep功能处理结果

一些不常见的后缀名可能会绕过黑名单,比如.php,.php5,.phtml

使用Burp测试文件上传的Content-Type

识别那些文件上传的Content-Type能被应用程序接受

和测试上传文件后后缀一样,同样是使用Burp Intruder进行爆破。这次修改的是Content-Type字段。参考上面的7个步骤即可。关键点

使用Burp Intruder测试所有的Content-Type,使用Grep功能处理结果

尝试将Content-Type更改为支持的文件类型,但是其中包含Web服务器/Web应用程序要处理的后缀名

一些不常见Content-Type可能会绕过黑名单

文件名和扩展模糊测试

文件名和扩展应该在输入验证时测试,当文件的名字为XSS,SQLi,LDAP或者一个命令注入载荷的时候会发生什么。

还是使用Burp Intruder进行测试,原理和测试文件上传类型类似,可以参考上面的七个步骤。

文件上传黑名单绕过

Windows IIS 文件上传黑名单绕过1:配合服务器解析漏洞,在黑名单加一个分号以及正常的文件名,例如shell.asp;.jpg

2:目录解析。folder.aspfile.txt,其中asp文件夹里面的任何扩展名文件都被IIS当作asp文件来执行。

3:环境是IIS,PHP时,< > 和 . 可以转换为 ? * .

4:使用可以替换文件的字符。比如>>可以替换 web.config

5:尝试在文件名后面使用空格或点。比如 foo.asp…. .. . . . .

6:file.asax:.jpg

7:尝试在文件名中加入禁止的字符,| %< * ? “,来得到错误信息。

Windows Apache 环境黑名单绕过1:Windows8.3 一个特征允许短文件名替换已经存在的文件。比如web.config可以被web~config.con替代,或者.htaccess可以被HTACESS~1替代。

2:尝试上传a.file,如果上传函数的根目录在www/uploads,将会创建一个uploads文件在上述目录。

其他绕过技术1:确定那些字符被过滤了。使用Burp在特定位置插入元字符表。

2:确保你的列表中包括一些不常见的扩展名,比如.php5,.php3,.phtml

3:测试防御机制。如果是过滤一些文件名,可能会被绕过。比如shell.ph.phpp,如果是过滤了php,之后名字后缀可能会变成.php

4:使用%00截断。比如shell.php%00.jpg, shell.php%0delete0.jpg。

5:双扩展名:如果应用程序过滤或者重命名扩展名。如果给它两个扩展名会发生什么?比如shell.php.php或者shell.txt.jog.png.asp。

6:尝试上传一个超长文件名,比如supermassivelongfileeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeename.php

7:尝试上传test.asp,test.asp.。

8:上传flash XSS攻击载荷,然后命名a.jpg

9:尝试以前的技术,但使用PDF或Silverlight代替

10:同样,尝试滥用crossdomain.xml或clientaccesspolicy.xml文件。

11:尝试使用编码绕过。比如URL,HTML,Unicode或者双重编码

12:结合以上所有的绕过技术。

13:尝试替换HTTP请求方法。使用POST替换PUT或者GET(反之亦然)。

14:确保所有的输入点进行模糊测试。

绕过文件上传白名单1:枚举出白名单并测试允许的扩展名来利用

2:测试文件内容正在验证中

3:测试扩展重命名技术,如shell.php.png

绕过文件大小上传机制

恶意文件内容

测试上传任何文件上传的内容是否被应用程序处理。比如你可以将XSS载荷写入到Excel,CSV,txt文件中,稍后看是否会由应用程序呈现。使用Burp repwater和intruder尝试在文件导入和上传功能函数中注入各种的载荷,测试应用程序的响应。

图像数据

可以在图像EXIF数据内注入反向shell吗?

在Kali安装apt-get install exiftool

在图像文件中注入代码后,只需上传文件,并使用校验和验证文件是否相同(以下是详细步骤)

用Burp注入请求

这是与上述EXIF方法类似的技术,但是你要将代码直接粘贴到打包请求中。1:使用burp上传一个合法的图片,且验证上传成功

2:发送之前的请求到repeater模块

3:在请求中的合法图像数据之后,尝试注入有效载荷(注入有效载荷或反向shell)

4:提交这个请求

5:从目标服务器上下载上传的我呢件,验证它是否包含有效的载荷。是否在目标服务器上能成功执行。

68395031ede4806d80746c2ed38116f5.png

验证上传文件

不管你在上一步使用什么方法(EXIF或修改Burp请求),校验一个本地上传的和上传到目标服务器的文件,是否匹配。

服务器端命令执行技术

如果能成功上传一个shell到目标的web服务器上,你可以尝试以下技术来执行上传的shell。1:Apache MIME Types: 尝试上传重命名文件,比如shell.php.jpg或者shell.asp;.jpg,并且评估一下Web服务器是否会利用Apache MIME types。

2:空子节:使用一个空子节%00在文件名末尾,或者这样,shell.php%0delete0.jpg。观察应用程序的响应。

3:可以上传点文件。如果可以上传.htaccess文件,利用AddType:AddType application/x-httpd-php .foo 。

4:注意上传文件的任何处理 比如:可以在稍后由后端备份脚本,处理的文件名中使用命令注入?

5:注意服务器处理的上传文件。如果压缩文件允许上传,应用程序是否会提取其中的内容。反之亦然。

6:服务器防病毒是否处理上传了文件?尝试上传压缩文件类型如.zip,.rar等,如果服务器端防病毒易受攻击,可以利用并获得命令执行。

任意文件上传防御对上传文件格式限制,只允许某些格式文件上传。使用白名单

对文件格式进行校验,前端和服务器端都需要校验。

将上传文件的目录,设置权限。一般上传的都是静态文件,所以需要对其目录设置禁止执行权限。

将上传的文件的名字进行随机命名。

参考


http://chatgpt.dhexx.cn/article/iSF875Pf.shtml

相关文章

文件上传漏洞

文件上传漏洞 1. 文件上传功能 文件上传功能是大部分WEB应用的必备功能&#xff0c;站点常见文件上传点有&#xff1a;用户头像上传、社交类网站允许用户上传照片、服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而&#xff0c;看似…

java fckeditor 上传图片_java下FCKeditor上传图片问题

展开全部 先到tomcat->webapps里建立一个文件夹叫mysite。把FCKeditor里的/editor和fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文件copy到mysite文件夹里&#xff0c;因为别的文件对我32313133353236313431303231363533e58685e5aeb931333239303264们…

Consider defining a bean of type ‘com.course.server.mapper.TestMapper‘ in your configuration.

问题 Description:A component required a bean of type com.course.server.mapper.TestMapper that could not be found.Action:Consider defining a bean of type com.course.server.mapper.TestMapper in your configuration.解决 我用了mybatis&#xff0c;在mapper层忘记…

@ManyToMany mappedby

学生和老师就是多对多的关系。一个学生有多个老师&#xff0c;一个老师教多个学生。多对多映射采取中间表连接的映射策略&#xff0c;建立的中间表将分别引入两边的主键作为外键。jpa 对于中间表的元数据提供了可配置的方式&#xff0c;用户可以自定义中间表的表名&#xff0c;…

MapDB简单用法

MapDB提供了Java映射、集、列表、队列和其他由非堆或磁盘存储支持的集合。它是java集合框架和嵌入式数据库引擎之间的混合。它是Apache许可下的免费和开放源码。 如果处理GB级数据&#xff0c;请考虑使用非缓存存储容器&#xff0c;比如本篇提到的MapDB&#xff0c;而不要把庞大…

BaseMapper

* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句 * 2.通过userMapper查找父级接口BaseMapper * 3.根据BaseMapper查找泛型对象User对象 * 4.根据user对象查找指定的注解TableName,获取表明 * 5.根据user对象的属性,动态获取…

MappedBy

对于mappedBy复习下&#xff1a; a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性&#xff0c;ManyToOne不存在该属性&#xff1b; b) mappedBy标签一定是定义在the owned side(被拥有方的)&#xff0c;他指向the owning side(拥有方)&#xff1b; c) mappedBy的含义…

Data Mapper

使用 Data Mapper分离数据源的Model和页面现实的Model&#xff0c;不要因为数据源的增加、修改或者删除&#xff0c;导致上层页面也要跟着一起修改 interface Mapper<I,O> {fun map(input:I):O }data class CarEntity(var no:String) data class CarModel(var num:String…

全网最详细的postman接口测试教程,一篇文章满足你

目录 目录 1、前言 2、接口理论 3、接口实例 一、POST 二、GET 4、总结&#xff1a; 1、前言 之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;…

简单粗暴的PostMan使用说明文档让你一片文章看懂PostMan怎么使用

PostMan功能简单介绍 创建文件夹 点击Collections创建新的文件夹&#xff0c;可以将不同的接口存入不同的文件夹中 点击右边三个点可以进行设置&#xff0c;Rename是重新命名 点击Add request&#xff0c;会在右侧创建一个get请求方式的request。 点击Add Folder&#xff0…

postman基础使用教程

Postman教程大全 - 简书推荐一款接口测试工具&#xff01;POSTMAN&#xff01;简单来说&#xff0c;四个词&#xff0c;简单实用大方美观&#xff01; Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman背景...https://www.jianshu.com/p/97ba64888894 …

不会接口测试?用Postman轻松入门(一)—— Postman实现get和post请求

测试行业现在越来越卷&#xff0c;不会点接口测试好像简历都已经拿不出手了&#xff0c;但很多小伙伴都会头疼&#xff1a;接口测试应该怎么入门&#xff1f;那么多的接口测试工具应该学哪个&#xff1f; 其实&#xff0c;接口测试工具&#xff0c;就像吃饭用的筷子&#xff0…

Postman快速入门(一)

一、基本介绍 postman是一款流程的接口调试工具&#xff0c;其特点就是使用简单&#xff0c;功能强大。使用角色也非常广泛&#xff0c;后端开发&#xff0c;前端人员&#xff0c;测试人员都可以使用它进行接口调试或测试。 下图是基本功能介绍 发送第一个请求 如果你是第一次…

Postman工具介绍以及使用方法教程(一)

Postman工具 1、postman简介 Postman最早是Google浏览器的一个插件存在的&#xff0c;因为Google退出国内市场&#xff0c;现在postman主要是以一个 APP的形式存在。 Postman最初设计上就是为接口测试而设计的&#xff0c;对于测试人员来说主要用来做接口测试。 2、postman的…

使用PostMan上传文件,有图易懂

现在&#xff0c;越来越多的人习惯用postman来测试接口。那么&#xff0c;关于如何使用postman来上传文件&#xff0c;本文进行讲解 1、将请求方式选择为post 2、填写接口地址 3、填写请求头 key&#xff1a;Content-Type value&#xff1a;multipart/form-data 4、填写Body…

postman-使用post请求

一. postman简介 Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上…

Postman全网最详细使用教程

Postman全网最详细使用教程 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「postman」, 获取postman插件和安装程序&#xff1a; http://www.javaman.cn/jszw/postman 一、postman的安装 postman的安装分为两种&#xff0c;通过chrome浏览器插件安装…

Postman-APIs是干什么的?

最近用postman探索接口自动化&#xff0c;发现里面的APIs这个模块&#xff0c;很少用到&#xff0c;平常都是直接在Collections模块创建请求就完事了。但是想做自动化时&#xff0c;发现需要先把接口定义出来&#xff0c;基于接口创建用例&#xff0c;这样直接用Collections就显…

2022最新Postman安装以及基本操作使用教程

一、postman安装 Postman一款非常流行的API调试工具。其实&#xff0c;开发人员用的更多。因为测试人员做接口测试会有更多选择&#xff0c;例如Jmeter、soapUI等。不过&#xff0c;对于开发过程中去调试接口&#xff0c;Postman确实足够的简单方便&#xff0c;而且功能强大。…

接口测试之Postman使用全图文指南(原来使用Postman测试API接口如此简单)

为什么要做接口测试&#xff1f; 接口的由来&#xff1a; 连接前后端以及移动端。 因为不同端的工作进度不一样&#xff0c;所以需要对开始出来的接口进行接口测试。 做接口测试的好处&#xff1a; 1、节约时间&#xff0c;缩短项目成本 2、提高工作效率 3、提高系统的健壮性…