Pikachu靶场之文件上传漏洞详解
时间:2022-12-21 01:00:00
Pikachu靶场文件上传漏洞详细说明
- 前言
- 上传漏洞简述文件
-
- 文件上传的漏洞是什么?
- 上传文件的原理
- 文件上传的漏洞有什么危害?
- 如何找到和判断文件上传的漏洞?
- 如何防御文件上传
- 绕过文件上传漏洞的方法是什么?
- 第一关 client check
-
- 绕过方法
- 问题分析
- 第二关 MIME type
-
- 绕过方法
- 问题分析
- 第三关 getimagesize
-
- 绕过方法
- 问题分析
前言
本文用于巩固自己文件上传漏洞的学习总结,部分内容借鉴以下博客。
链接: pikachu Unsafe Fileupload 上传不安全文件(皮卡丘漏洞平台通关系列)
上传漏洞简述文件
文件上传的漏洞是什么?
? 任何有文件上传的地方都可能有文件上传漏洞。上传文件时,对方代码是否完整、安全,一旦忽略某个地方,可能会导致文件上传漏洞。
上传文件的原理
? 网站Web当上传功能实现时,应用程序具有文档、图片、头像、视频等文件上传功能上传文件的后缀和上传文件的后缀和类型,此时攻击者可以上传一个webshell到一个Web可访问目录,并将恶意文件传递给如PHP解释器执行,之后,可以在服务器上执行恶意代码、数据库执行、服务器文件管理、服务器命令执行等恶意操作。有些是攻击者通过Web分析服务器的漏洞来突破Web保护应用程序
文件上传的漏洞有什么危害?
?文件可以自定义,可以成为Webshell,通过文件上传来上传后门,直接获取网站权限,属于高危漏洞。上传漏洞和SQL注入或者XSS相比,其风险更大。可以获取数据库信息,可以对服务器提权,获取内网权限。
如何找到和判断文件上传的漏洞?
1.黑盒查找
文件后台
?? 进入网站后台可能无法获得网站权限,但可以从后台获得网站权限
会员中心
?? 上传图片
文件扫描
?? 用工具扫描后台路径
2.白盒查找
通过代码分析上传漏洞
搜索文件上传功能
如何防御文件上传
- 上传文件web服务隔离
- 过滤白名单,限制上传文件的类型
- 文件上传路径设置为不可执行权限
- 上传上传路径的文件
- 自定义函数检测自带函数检测
- 图片渲染 重命名上传文件
- 压缩文件内容,重生文件内容 检查文件内容
绕过文件上传漏洞的方法是什么?
- 文件包括绕过
- 绕过前端限制
- 绕过文件扩展名
- ashx上传绕过
- 绕过特殊文件名
- 绕过上传
- htaccess解析漏洞
- 突破MIME限制上传
- 绕过漏洞进行分析
- 绕过了条件竞争
- CONTENT-LENGTH绕过
第一关 client check
进入文件上传的第一关按钮
先看直接上传php文件的效果是什么?
如下图所示,刚选好的文件还没有点 开始上传 当提示弹出时,提示弹出 上传的文件不符合要求
绕过方法
一般两种绕过客户端验证的方法
(1)禁用浏览器javascript
(2)burpsuite抓包改后缀
方法一:禁用浏览器javascript
firefox有个插件叫JS Switch启用和禁用控制非常方便JS(有时候好像有点慢,可以多试几次)
先禁用JS,然后上传文件muma.php,内容如下
禁用JS之后可以成功上传,显示保存路径
方法二、burpsuite抓包改后缀
把muma.php文件名改muma.png,上传过程中burpsuite抓包
抓住上图所示的报纸,右键 send to repeater
将文件名改成muma.php,点send,上传成功
问题分析
网页上 右键 查看网页源代码 下图所示的代码可以在较低的地方看到
虽然是白名单过滤,但放在前端。pi用没有。。
第二关 MIME type
进入第二关,发现和上一关一样,也是上传界面
点击上传muma.php检查现象,发现没有弹出窗口。点击开始上传后,会提示上传的图片只能是jpg,jpeg,png格式的!”
绕过方法
关卡名都透题了,直接来吧
说起来是两个想法,但严格来说不能算是两个想法,有点不一样,很快就同归于好
(1)上传muma.php,burpsuite抓包修改MIME type (优点是服务器上没有无用的文件)
(2)上传muma.png,burpsuite抓包修改文件后缀 (优点是只要文件上传成功,MIME type一定是对的)
这里不是两个演示了,反正最后要求的报文都一样,用第二种方法演示。
上传muma.png,burpsuite抓包
把filename改成muma.php,点forward,成功上传文件
问题分析
关于MIME类型介绍可以看到这个网页链接: MIME类型,在HTTP request报文中MIME类型在Content-Type字段体现。
本关防护代码如下图所示
$mime包含合法性的MIME数组的类型,MIME类型白名单;然后将白名单作为参数传入upload_sick()服务器端检测函数。
upload_sick函数的定义如下:
(1)只检查MIME类型抓包修改可以绕过类型。
(2)保存文件时没有重命名文件,所以即使网页没有显示文件的保存路径,攻击者也很有可能猜。
整个关卡还有一个不安全的地方,就是文件保存路径的回显。
成功上传webshell,攻击者知道文件保存路径后,可以连接shell了。
第三关 getimagesize
像以前一样传一个muma.php,上传失败,提示和上一个不同,上传文件的后缀名不能空,因为上传文件有后缀名,也许后端代码会删除原来的后缀名,并根据一些规则更换新的后缀名?还是这里只是一个令人困惑的操作?
传一个名为muma.png,实际内容是第一关中一句话木马的文件,发现服务器可以识别出这是个假图片:
上传名为小白-正常图片.jpeg”的真的jpeg文件回显如下。可以看出,后端代码修改了文件名称,但文件保存路径回显确实是一个大胆的决定。。接下来,让我们看看艺术家是否大胆
绕过方法
这个关的名字看起来像函数,先用搜索引擎搜索试试:
getimagesize() 函数用于获取图像大小和相关信息,并成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
上传一张图片马(图片中间插入一句话木马),返回了文件保存路径
查看上述路径的图片,发现图片中仍保留着一句话木马,也就是说没有对图片内容进行检查和修改。
由于这关对文件后缀的检查是基于白名单的,所以这关后缀名绕过也行不通(这里偷了点懒,直接看代码了,黑盒状态下可以通过burpsuite爆破文件名后缀尝试绕过。
而从burpsuite截获的本关的request报文来看,本关也并不满足00截断的条件。
目前以我的知识面知道的本关的解法就是上传图片马并结合文件包含漏洞了。。如果哪位大神有其他思路,万望告知。(其实还可以利用Nginx解析漏洞,但是我这windows系统+phpstudy 8.1.1.2的环境似乎造不出这个漏洞来。相关知识点可搜索“Nginx解析漏洞”,以及这个链接: phpStudy nginx 解析漏洞通告)
图片马可以是基于真实图片的,也可以只是加个文件头。只加magic number就可以绕过的时候,直接加文件头的方式固然是更方便;但是普遍来说,还是在真实图片基础上制作图片马更保险。比如本关,直接加magic number是难以成功的,推测可能是因为getimagesize()函数检测的东西比较多,不仅仅是magic number。
问题分析
这关是三关里面最安全的了,不能上传php文件,需要结合文件包含漏洞(或者中间件解析漏洞),但是还不够安全。
不够安全的最主要原因是上传的文件中还是可以包含php代码。
先来看一下本关的代码:
本关首先指定了两个白名单,$ _type是文件名后缀白名单,$_mime是MIME type白名单,然后将两个白名单伙同一些其他参数一起送入upload()函数
upload()函数定义如下,主要的过滤动作有:
(1)123~127行,用文件名后缀白名单$type过滤后缀名不在白名单中的文件
(2)130~134行,用MIME type白名单$mime过滤MIME type不在白名单中的文件
(3)136~140行,用getimagesize()函数来判断是否是真实图片(可以通过图片马绕过)
(4)157~161行,修改文件名为随机值(本来是防止攻击者猜测文件路径的,但是由于网页上回显了文件保存路径,所以这个重命名的步骤显得没有什么卵用了。)