文件上传漏洞详解(CTF篇)

article/2025/10/13 0:49:47

需要了解的前置知识:

1.什么是文件上传:

  • 文件上传就是通过流的方式将文件写到服务器上
  • 文件上传必须以POST提交表单
  • 表单中需要 <input type="file" name="upload">

2.一句话木马

<?php eval($_POST['a']) ?>

其中eval就是执行命令的函数,**$_POST[‘a’]**就是接收的数据。eval函数把接收的数据当作PHP代码来执行。这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意PHP语句。这便是一句话木马的强大之处。详解参考文章
3.文件上传漏洞的类型
在这里插入图片描述

实例:

1 前端验证:
将一句话木马写进php文件里,然后上传,弹出:
在这里插入图片描述
这是前端JavaScript控制的,按F12可以看到

function checkfilesuffix() { 
var file=document.getElementsByName('file')[0]['value']; 
if(file==""||file==null) { 
alert("请添加上传文件"); return false; } 
else { var whitelist=new Array(".jpg",".png",".gif");var file_suffix=file.substring(file.lastIndexOf(".")); if(whitelist.indexOf(file_suffix) == -1) {alert("该文件不允许上传"); return false; } } } 

我们可以在前端把JavaScript关掉,这里我用的是火狐的JavaScript switch插件 ,关掉浏览器的JavaScript,然后重新提交:
在这里插入图片描述
成功上传,我们打开蚁剑连接
在这里插入图片描述
找到FLAG
2.文件头检查:
文件头检查是指当浏览器上传到服务器的时候,白名单进行的文件头检测,符合,则允许上传,否则不允许上传。我们可以自己造一个图片木马,打开电脑画图,画一条直线,保存然后打开方式选为记事本,将一句话木马插入进去,我们在进行上传:
在这里插入图片描述
上传成功,但是使用蚁剑无法连接,因为上传进去的是PNG文件,不是PHP文件,所以无法解析,这时候我们用brupsuit抓包:在这里插入图片描述
我们把filename改成1.php然后再上传:
在这里插入图片描述
这时候已经上传成功,我们连接蚁剑查看在这里插入图片描述
我们上传的两个文件,然后在上一级就可以找到FLAG了

  • .htaccess
    .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,通过.htaccess文件可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。详细请参考文章连接
    需要写进.htaccess文件里的代码
<FilesMatch >Sethandlerapplication/x-httpd-php
</Filesmatch >

也可以直接写 Sethandlerapplication/x-httpd-php意思是将文件都按照PHP文件来执行,这样插进去一个PNG的文件也可以作为PHP文件执行,从而控制网站
在这里插入图片描述
第一步先将.htaccess文件传输进去,然后再传含一句话木马的PNG文件:
在这里插入图片描述
然后再上传一张含有一句话木马的图片:
在这里插入图片描述
使用蚁剑进行连接:在这里插入图片描述
可以看到我们上传的两个文件,返回上一级可以拿到flag
4.MIME绕过(关于MIME的详解)
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
我们先上传一张图片,抓个包:
在这里插入图片描述
可以看到类型是 image/png
然后我们上传一个PHP文件,将Content-Type改为 image/png 从而进行绕过:
在这里插入图片描述然后成功上传,用蚁剑连接拿到flag:
在这里插入图片描述
5.%00绕过()

  • www.xxx.com/qq.jpg
  • www.xxx.com/qq.php%00.jpg => www.xxx.com/qq.php
    %00就是截断符号,%00后面的直接舍弃掉,如果用get提交,直接加%00阶段即可,若是用POST提交,则需要对%00进行编码,这是因为 %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改 hex 值为 00 (URL decode)进行截断。
    这里我没有操作成功,点击可以参考大佬文章
    6.双写绕过:
    先看代码:
if(file_exists(UPLOAD_PATH)){
$deny_ext=array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name=trim($_FILES['upload_file']['name']);//去除空格
$file_name=str_ireplace($deny_ext,"",$file_name);
$temp_file=$_FILES['upload_file']['tmp_name'];
$img_path=UPLOAD_PATH.'/'.$file_name;
if(move_uploaded_file($temp_file,$img_path)){$is_upload=true;}
else{$msg='上传出错!';}}
else{
$msg=UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}

绕过方法
这里我们可以看到将文件名替换为空,我们可以采用双写绕过:1.pphphp

7.空格绕过 点绕过 ::$DATA绕过
• 在上传文件的时候用bp抓包 ,在filename后面加入一个空格即可,不会被吞噬掉

• 在上传文件的时候用bp抓包 ,在filename后面加入一个点即可,不会被吞噬掉

• 在window的时候如果文件名+“:: D A T A " 会 把 : : DATA"会把:: DATA"::DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: D A T A 之 前 的 文 件 名 , 他 的 目 的 就 是 不 检 查 后 缀 名 例 如 : " p h p i n f o . p h p : : DATA之前的文件名,他的目的就是不检查后缀名 例如:"phpinfo.php:: DATA:"phpinfo.php::DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php”

  • 有时候也是点加空格然后再加点进行绕过

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

相关文章

web漏洞——文件上传漏洞(upload-labs)

一、文件上传漏洞简介、原理、高危触发点、防御 文件上传漏洞简介&#xff1a; 由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向 服务器 上上传可执行的动态脚本文件。这里上传的文件可以是木马&#xff0c;病毒&#xff0…

Python中OpenCV+Numpy安装配置

1.安装OpenCV Numpy 安装OpenCV 下载地址&#xff1a;http://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装Numpy 下载地址&#xff1a;https://pypi.python.org/pypi/numpy 根据python版本选择相应的opencv版本&#xff0c;例如在Windows64操作系统下python3.7.1…

python中numpy模块安装_numpy安装,python中怎样安装numpy模块

python中怎样安装numpy模块 1.在python官网https://pypi.python.org/pypi/numpy中找到安装的python版本对应的numpy版本。 例如: python版本是 下载的对应numpy版本是 2.将numpy下载到 python的安装目录下的scripts文件夹中 3.然后在cmd中执行以下命令 ip3.6 install D:j…

python之Numpy 安装

1、在windows下&#xff0c;ctrlR&#xff0c;进入运行&#xff1b; 2、进入到Python所在的目录&#xff0c;默认为c&#xff1a;\\Python27 3、运行命令 python -m pip install numpy 4、系统显示如下&#xff1a;collecting numpy,开始自动进行安装&#xff1b; 5、显示进…

numpy的安装与使用

文章目录 前言 一、numpy是什么&#xff1f; 1、Numpy的数据结构 1.1 元数据&#xff08;metadata&#xff09; 1.2 实际数据 2、ndarray数组对象的特点 3、Numpy的优点 二、安装numpy 三、开始使用 3.1 引入库 3.2 查看numpy安装版本 3.3 牛刀小试 3.4 numpy VS list 总结 前言…

【Numpy学习笔记1】numpy安装、维度、基本运算、改变数据形态

1.Numpy使用场景 需要批量处理数据的时候机器学习&#xff0c;人工智能这些需要进行海量数据运算处理的地方写游戏里面的物体运行逻辑时&#xff0c;经常涉及到矩阵、向量运算机器人模拟环境&#xff0c;背后的环境反馈信息&#xff0c;全是靠批量数据算出来的任何需要做统计的…

pythonnumpy官网_Numpy安装

问题引入&#xff1a;电脑里安装了从官网下载的python3.8.0,。先使用了菜鸟教程的方法2安装。https://www.runoob.com/numpy/numpy-install.html 发现产生错误。先是提示我的pip工具没有更新到最新版本&#xff0c;于是根据提示更新后&#xff0c;发现仍有错误&#xff0c;于是…

numpy的安装

安装 1.以管理员身份打开cmd 2.输入命令安装numpy插件 pip insatll numpy 3.使用以下命令查看是否安装成功 pip list 出现numpy就安装成功

如何在matlab坐标轴上输入希腊字符和开根号符号

1.以输入\mu为例&#xff0c;要将解释器选择为 tex&#xff0c;不过matlab默认的就是tex. xlabel(\mum,FontName,Arial,fontsize,24,Interpreter,tex); 效果如下图所示&#xff1a; 2.输入开根号&#xff0c;需要把解释器改为latex. clear,clc ylabel($Z_{0} \sqrt {\epsilo…

matlab之方程式求根

一.利用syms和solve() 利用syms和sym定义一个标志变量 syms x sym(‘x’) 2.求方程根&#xff1a; 求x-2y5与xy6的联立方程组的根&#xff1a; 3.对函数求微分 4.对函数求积分 5. fsolve()

利用MATLAB对于符号方程进行求解

在数学计算中&#xff0c;我们经常需要对于方程或者是方程组进行求解&#xff0c;对方程的求解是数学中的一个重要的知识点。在MATLAB中提供了solve函数用于对于符号表达式的求解。solve函数有多种调用方式&#xff0c;包括如下所示&#xff1a; solve(equ)&#xff1a;对于等…

利用matlab进行多项式求根——符号解

问题描述&#xff1a;对于一个方程&#xff0c;比如&#xff1a; a x 2 b x c 0 ax^2bxc0 ax2bxc0&#xff0c;我们想要求出关于x的表达式&#xff08;求根&#xff09;。 如果a&#xff0c;b&#xff0c;c是已知的&#xff0c;或者说是某个确定的数值&#xff0c;那么我们…

MATLAB(十)方程式求根

文章目录 前言符号寻根法符号根查找&#xff1a;solve ()解决多个方程用符号表示的方程Exercise练习符号区分&#xff1a;diff ()Exercise练习象征性的集成&#xff1a;int()Exercise练习回顾函数句柄()fsolve()Exercise练习fzero()求多项式的根&#xff1a;roots()二分法(或分…

matlab根号二,matlab根号二怎么打_常见问题解析,matlab,根号二,根号

matlab级数求和的方法_常见问题解析 matlab级数求和使用symsum函数&#xff0c;有4种方式&#xff0c;分别为symsum(expr)、symsum(expr,v)、symsum(expr,a,b)和symsum(f,v,a,b)。 matlab根号二怎么打 matlab中根号使用^来表示&#xff0c;根号二的表示方法为&#xff1a;2^0.5…

matlab 坐标轴根号,Matlab中根号表示怎么操作?根号表示教程分享

最近很多网友表示自己不清楚Matlab中根号表示的操作&#xff0c;而本篇文章就来给大家讲解Matlab中根号表示的教程介绍&#xff0c;大家都来一起学习吧。 Matlab中根号表示的教程介绍 常数根号的表示方法 1、打开matlab&#xff0c;在命令行窗口中输入“9^0.5”&#xff0c;按回…

matlab中根号的表示方法,Matlab中根号表示方法分享

现在许多朋友都已经安装使用Matlab这款软件&#xff0c;但不少伙伴使用过程里还不会根号表示方法&#xff0c;那么究竟是如何操作的呢&#xff1f;今日就来下文看看Matlab中根号表示教程吧。 常数根号的表示方法 1、打开matlab&#xff0c;在命令行窗口中输入9^0.5&#xff0c;…

记Git报错-refusing to merge unrelated histories

环境 系统&#xff1a;win10 git version 2.9.0.windows.1 创建一个新的分支&#xff0c;很久没用了。要重新启用&#xff0c;拉取最新分支的代码&#xff0c;结果报错&#xff1a;refusing to merge unrelated histories fatal: refusing to merge unrelated histories 解…

git: refusing to delete the current branch

最近&#xff0c;不知怎么操作&#xff0c;导致远程test分支无法删除。 原因是&#xff0c;远程仓库里的当前分支是test。进入远程仓库目录&#xff0c;git branch。由于已经解决&#xff0c;所以没有图。在网上找相关资料&#xff0c;都是github里面的操作。但是这个是自己搭建…

fatal: refusing to merge unrelated histories解决

背景&#xff1a;由于公司进行了仓库迁移&#xff0c;同事直接把代码init推进了新的仓库地址&#xff0c;我想在本地代码上切换远程仓库地址进行拉取远端代码时出现报错“fatal: refusing to merge unrelated histories”&#xff0c;大概意思是&#xff1a;“拒绝合并不相关的…