文件上传漏洞及upload靶场详细思路wp

  • Post author:
  • Post category:其他




文件上传漏洞及upload靶场详细思路wp



一、(非必需可跳过)upload-labs靶场搭建(本地)

1.百度网盘链接:https://pan.baidu.com/s/1ShTXhlhFvdCvAekZgsAXsA?pwd=slh9

提取码:slh9

解压到phpstudy_pro的WWW文件夹下

在这里插入图片描述

2.phptudy启动!

在这里插入图片描述

3.访问http://localhost/upload-labs

在这里插入图片描述



二、文件上传漏洞

先来看看该漏洞的几种常见防御手段,对该漏洞有个初步的了解

防御手段首先是可以分为在客户端的防御和在服务端的防御(即本地和远程)

1.客户端防御:主要就是js检查

2.服务端防御:可以分为三类,检查后缀、检查内容、条件竞争

具体来看张思维导图:

在这里插入图片描述

接下来将会针对每种类型配合靶场例题讲解。



三、详解文件上传漏洞



Pass-01 js检查

在这里插入图片描述

1.查看源码注意到是用var声明变量,发现是js风格的代码,确定是考查客户端防护中的js检查,客户端防护特点是反应速度快,但是很容易绕过。

2.解决方法:bp抓包

3.原因:首先来明确一下我们的目的—-给该网页所在服务器上传一个木马(如php文件)以获得权限。接着来模拟一下当我们上传一个文件时会发生哪些事件,当我们选好木马文件点击上传后,首先会面对我们客户端网页本身的一层js检查,当通过js检查后被放行进入网络,传到服务端后,如果查得严的话服务端还会再进行一次检查,确定无误后存储到服务器的某文件夹中。对于本题仅有js检查,我们只需欺骗过js检查即可,很容易想到可以把php文件伪造成合法的jpg文件上传,但是要注意绕过js检查之后要改回来,否则它肯定不会被当作php文件发挥原本的效果,这也是要抓包的原因。

4.过程:将写好的php马改后缀为合法的jpg,然后点击上传,此时成功骗过js检查,文件被放行准备进入网络,因为挂着bp代理所以文件被抓包,我们趁现在把它改回php的后缀,接着发送给服务器就完成了。

5.具体过程:

在这里插入图片描述

将php马通过重命名伪造成jpg文件

在这里插入图片描述

选择好伪造文件上传,抓包

在这里插入图片描述

改回php格式,放包

在这里插入图片描述

发现上传成功(因为本身是php格式,所以会出现那个加载不出图片的东西)

看看服务端有没有接收:

在这里插入图片描述

上传成功

PS:我这边做演示就不传木马了,也不蚁剑连了 (绝对不是懒QWQ)

6. 后话:如果是在做ctf题,有时你甚至可以略过以上步骤,直接从源码中删掉js检查的代码(一般都会关联在上传按键上)



Pass-02 MIME绕过

在这里插入图片描述

查看源码发现是MIME类型绕过

解决方法:抓包

在这里插入图片描述

发现可以修改MIME类型,改为合法的jpg的MIME类型image/jpg,放包

在这里插入图片描述

在这里插入图片描述

确实传了上去,本关结束。



Pass-03 黑名单绕过之php3,php5

1.当把php等可执行类型后缀加入黑名单时,可以尝试使用一些冷门可执行文件(如php3.php5)

2.原因:虽然Apache服务器本身默认不会把php3,php5当作php文件解析,但存在一些配置不当的Apache服务器启用了该功能。当遇到黑名单绕过时可以先尝试一下题目是否过滤完全。

在这里插入图片描述

上传一个php3文件

在这里插入图片描述

上传成功

在这里插入图片描述

打开f12找到该文件存储路径,访问

![在这里插入图片描述](https://img-blog.csdnimg.cn/998a0e305d354e6d9c342af59e530124.png

在这里插入图片描述

本题结束。注意:该方法条件过于苛刻,一般能不用这个方法就不用,走投无路再尝试



Pass-04 黑名单绕过—-.htaccess解析漏洞

1.htacess文件漏洞:针对apache,若黑名单没有过滤掉.htaccess,那么可以利用这个方法攻击。.htaccess是apache的一个配置文件,可以更改apache配置,形成解析漏洞。如:

<FilesMatch " ">
SetHandler application/x-httpd-php
</FilesMatch>

在这里插入图片描述

题:

在这里插入图片描述

先传一个图片马上去,这里先补充一点图片马的生成:copy的时候必须 .jpg/b在前

在这里插入图片描述

访问一下刚上传的图片马:

在这里插入图片描述

明显不能访问到,因为不是按php文件读取的

那么接下来上传配置文件.htaccess:

在这里插入图片描述

之后再访问图片马,即可看到apache将该jpg文件按php解析了



Pass-06 大小写混合绕过

在这里插入图片描述

查看源码,发现.htaccess被ban,但注意到没有使用strtolower转小写比较这一方法,我们可以使用对后缀名大小写混合绕过,如1.PHP

在这里插入图片描述

在这里插入图片描述



Pass-07/08 空格/点绕过

windows会把文件名最后的.去掉,且忽略空格,所以改包为”1.php .”或者”1.php. ”



Pass-09 基于文件流特性::$DATA绕过

在这里插入图片描述

查看源码,发现未过滤::$DATA

::$DATA:依据是windows下的nfs文件(可以理解为一种文件存储的底层格式)流特性,在解析时windows服务器把文件中的数据当做文件流加载到给定的文件中,写入后会自动删除::$DATA

在这里插入图片描述

绕过成功:

在这里插入图片描述



Pass-10 还是点/空格绕过

姿势:“1.php. .”



Pass-11 双写绕过替换

在这里插入图片描述

分析:传个php文件后访问,发现被网页以php代码形式加载,未被执行(或者查看源码),发现使用了替换后缀方法防御,同时注意到被替换部分是php而非.php,所以对php构造双写绕过,如pphphp

原理:当服务器读到第一个略过第一个p,发现php时替换为空,继续往后读,再未读到php,结束

在这里插入图片描述

成功:

在这里插入图片描述



Pass-12 %00截断

在这里插入图片描述

分析:查看源码,发现这个题对我们的上传文件不仅有检查机制,甚至还有改名后再保存的机制(可以避免上传的文件名冲突的问题,还可以确保其他人即使上传了恶意文件也不知道它的存储路径)。

详细代码分析:

$_FILES[‘myFile’][‘name’] :客户端文件的原名称,通过全局变量获取到我们上传的文件默认的名字

strrpos函数:查找字符串在另一字符串中最后一次出现的位置(区分大小写)

#所以该处strrpos()+1是选中了我们上传文件的后缀部分

substr(string string, int a):从第a个字符开始截取后面所有的字符串

#所以整句话的意思就是取出我们上传文件的后缀名

在这里插入图片描述

所以最终的保存路径就是$save_path / 一个随机数 . 当前时间戳 . 文件原后缀

接着尝试一下抓包:

在这里插入图片描述

发现突破点:save_path在url中且可以修改。类似于sql注入时对url的操作,我们修改save_path,让它成为我们想要的文件路径,并在这里就截断,后面一大堆加密也就都不需要考虑了。

绕过方法:你原来的save_path只是…/upload,那我就给你后面加一个我想要访问的文件名(如webshell.php),并在这里用对于url的%00截断,那么最终的存储路径就变成了我们之前设定的目标文件(webshell.php)

在这里插入图片描述

特别注意:只有拿GET请求接收时才可用%00截断,因为服务器会对GET请求进行解码,而POST请求只会原封不动拿出来

其他注意:(1) php版本需低于5.3.4 (2) ini文件中magic_quotes_gpc为OFF状态



Pass-13 0x00绕过

在这里插入图片描述

抓包发现save_path不在url中了,而且还是使用的POST请求,这时就要用十六进制的0x00截断

类似%00截断,在上传位置后加自定的文件名,接着打个空格当标记(转Hex之后好认,即20),修改后缀和MIME

在这里插入图片描述

点Hex转为十六进制,找到我们刚刚加的空格(即20),修改为00,这样在服务端就可以达成截断的效果

在这里插入图片描述

放包后成功上传



Pass-14 绕过文件头检查

在这里插入图片描述

查看源码发现是在上一题的基础上对文件头进行检查,那么就添加GIF的文件头GIF89a绕过检查,或者使用copy命令做图片马(代码不全的话人工补全)。需要注意的是,上传后我们不知道路径且图片马不能被解析成php代码执行,所以拿不到shell,实战中通常要配合00截断或者文件包含或者解析漏洞使用。本题给了自带的文件包含漏洞,点击提示中的文件包含漏洞即可得到漏洞信息,最后利用文件包含漏洞即可解决

在这里插入图片描述

在这里插入图片描述



Pass-15 / Pass-16 绕过getimagesize()和exif_imagetype()

15关使用了getimagesize()函数,尝试读取上传文件(图片)的大小,如果该函数能够成功读取上传文件的大小,就说明该文件是一个图片;如果不能成功读取,那么就说明该文件不是一张图片,是一个恶意文件。

同理16关使用了exif_imagetype()函数,尝试判断上传图片的格式类型,如果成功判断就是图片,失败不是图片。

解决方法:(1)给伪造jpg文件抓包添加文件头GIF89a,并配合解析漏洞或者文件包含漏洞或者00截断 (2)上传图片马配合以上漏洞



Pass-17 二次渲染绕过

判别点:imagecreatefromjpeg函数

二次渲染:目前很多网站都会对用户上传的图片再次压缩、裁剪等渲染操作(如PHP中的imagecreatefromjpeg()等函数),所以普通的图片马都难逃被渲染的悲剧

imagecreatefromjpeg:挨个读取上传文件的每个字节,并判断是否复合jpeg的数据格式,不符合的直接删掉。最后生成一个新的图片

解决方法:初学可简单的认为可以靠上传大量的图片马,总有一个是在检测盲区。

准确的解决方法参考 https://www.cnblogs.com/1ink/p/15115240.html



Pass-18 时间竞争

产生原因:服务端的并发处理

并发处理:当客户端接受到文件后先暂时存储下来,等积累了一定量的文件后再统一的一次性处理

原理:上传和处理存在时间差,只要在服务端没反应过来前执行即可。需要注意的是,若只这样上传木马,即使可以有一瞬间上传上去,但是随后马上便会被删除。所以需要用木马生成木马,通过访问第一个马自己生成一个新马,而新生成的马并非用户上传的所以不会被检测删除。

绕过方法:在发大量上传文件的同时发送大量请求访问发送的文件。具体来说,抓两个包(上传和访问),发到intruder设好参数,同时暴力攻击。

注意上传的php文件是能生成新马的文件!

因为只需要不断的上传,所以清除掉所有的payload

在这里插入图片描述

在有效载荷这里选择没有负载(null payload),输入发送次数(如3000)

在这里插入图片描述

在新版bp中的资源池面板中选择好最大并发数(5左右)和请求间隔(100ms左右建议开启随机变化)。再准备一个请求的包,即访问上传的php文件后抓包。注意:因为服务端对上传文件的重命名操作在对文件的处理阶段,即访问时直接用原本的名字就可以(如1.php)

在这里插入图片描述

接着就是同样的操作发给intruder…开始攻击,然后就是凭运气了,不断调整参数多试几次,碰上了就过了:(



Pass-19 重命名竞争

原理:apache2之前的低版本的解析漏洞。

不重要,不做演示了



Pass-20 仍然是0x00截断



Pass-21 代码审计(随机应变)

原文链接:https://blog.csdn.net/elephantxiang/article/details/120693323

本关代码如下,从//check filename往下看,是检查文件名的部分。

首先判断save_name是否为空,如果为空,则$file等于filename的值,否则等于save_name的值;

接着判断$file是否为数组,如果不是数组,则以点号分割为数组,且分割之前将$file转换为小写;

然后取数组$file的最后一个元素,与后缀白名单对比,如果不在白名单中,则禁止上传,如果在白名单中,则允许上传,并且文件保存在服务器上的名称为$file[0].$file[元素个数-1]

根据以上对代码的分析可知,要想绕过后缀白名单过滤,save_name就不能让后端代码以点分解为数组,而需要自己本身是数组,并且要使$file[元素个数-1]不是最后一个元素。

根据本关拼接最终文件名的方法,由于服务器是windows系统,文件名最后加个点号并没有关系,系统会自动去掉,所以可以save_name[0]=sh.php,save_name[2]=png,这样$file[2]=png,可以绕过后缀白名单检查,而count($file)为2,count($file)-1为1,而$file[1]根本不存在,因此组合成的最终的文件名是sh.php.,而windows系统会将其保存为sh.php。

那现在只剩一个问题了,怎么发送save_name[0]=sh.php,save_name[2]=png?

把save_name整块复制一份,一份name=“save_name[0]”,值为sh.php,另一份name=“save_name[2]”,值为png就行。

所以具体请求报文构造如下,这会儿filename是啥已经不重要了,主要是Content-Type: image/png(或者其他两种图片格式),以及save_name[0]和save_name[2]

在这里插入图片描述



四、总结及做题思路

1.先判断存不存在客户端防护(js检查),有的话之后所有步骤都需注意不能直接传php文件

2.如果把做题流程比作一棵树,那么其中的主体方法就是树干,细节上的附加绕过就是树叶

主体的做题方法(树干)有:解析漏洞,包含漏洞,00截断,条件竞争,二次渲染



细节的树叶有:特殊后缀上传,大小写绕过,” . / 空格”绕过,::$DATA绕过,双写绕过,MIME绕过,GIF89a文件头绕过



而在做题时就是要以树干为主体,为树干补充好树叶,最后达成完美绕过

3.本文仅展现了常见的文件上传漏洞情况和利用方法,还有更多的情况需要不断学习继续积累



版权声明:本文为2301_77004573原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。