不安全的文件下载概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
你可以通过“Unsafe file download”对应的测试栏目,来进一步的了解该漏洞。
不安全文件下载
我们以pikachu当中的unsafe filedownload为例
我们可以点击图片下的名字下载图片,试一试这一个功能。
我们通过图片当中URL可以知道,这和本地文件包含一样的,通过get请求发送到后台,
后台会根据提交的filename内容查找文件,然后读取后再响应输出到前端,这样文件就下载下来了。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png
如果后台的代码不够严格这样就会出现漏洞
比如我们修改相应的URL下载hosts的信息,我们可以输入多个“../”这样可以跳到根目录来寻找对应的文件进行下载,对应的URL如下。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../../../../../Windows/System32/drivers/etc/hosts
我们可以成功下载hosts文件。
我们可以看一下后端代码
我们可以看到当我们点击一个图片的时候,实际上传一个a标签,通过a标签传一个参数,传给后台execdownload
我们看看execdownload代码
首先获取这个文件名然后直接拼接到download目录下,但是没有做任何处理,获取文件后台进行读取,然后计算他的长度,
然后放到Header响应回来,最后循环读取文件字节流后返回到前端。最根本的原因就是后台没有对传进来的参数进行判断,然后就直接读取了
防范
不安全的文件上传漏洞概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
一般来说测试流程有以下几步
我们可以通过pikachu里面的Unsafe fileupload进行相关操作。
首先我们通过客户端check进行测试
我们尝试上传PHP文件
这个时候会弹窗说你上传的文件不符合要求
这个弹窗是通过前端返回,我们都知道所有在前端进行的操作只能起到辅助性的作用并不能起到实际性的作用,他都可以绕过的。
我们继续测试
首先点开F12看看源码。
这里有对应的判断,说input标签进行onchange,就是说当他状态发送改变的时候就会调用checkFileExt(this.value)
我们来看checkFileExt(this.value)源码
代码的意思就是通过JavaScript判断上传文件类型,但只允许上传"jpg","png","gif"三种类型的文件。
如果不是就会弹出对应的框,但是它全部都是通过前端JavaScript进行限制,还是那一句话所有在前端进行的操作只能起到辅助性的作用并不能起到实际性的作用
比如说我们可以在前端,通过控制台修改代码就是删除checkFileExt(this.value)
我们再进行上传
可以看出来我们已经上传成功
其实在实际操作当中我们可以通过在PHP文件里面写自己的木马,通过猜测上传路径来执行该木马,当然在这个案例前端已经告诉我们上传文件路径。实际
操作当中不会告诉我们的,这个需要我们自己猜测。
MINE概述
MIIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩 展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本.html,.html texthtml
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.ipeg,jpg image/jpeg
我们来分析一下MINE相关源码
首先先获取前端的请求然后定义一个数组,数组里面定义三个它指定的类型,
然后将上传的文件通过upload_sick,进行相关的检查。
我们可以通过pikachu上传php和图片,上传php文件则显示上传失败,上传图片正确。
打开burp suite抓包工具,查看上传成功与上传不成功包。
我们可以看到上传成功的Content-Type是image/png类型
没有上传成功的Content-Type是 application/octet-stream类型
接下来我们可以把上传失败的包发送到Repeater并且把Content-Type修改成image/png类型
这时我们可以发现原本不能上传成功的文件上传成功了。
Getimagesize概述
Getimagesize ( )函数返回结果中有文件大小和文件类型,如果用这个函数来获取类型,
从而判断是否是图片的话,会存在问题。因为图片头是可以被伪造的,所以可以绕过限制。
我们在pikachu对应的靶场上传文件的后缀名不能为空,且必须是jpg,jpeg,png中的一个
我们怎么绕过呢,我们可以上传有恶意代码的图片。
上面是有恶意代码的图片,我们可以通过图片和木马文件,来制作图片木马,这个图片可以正常上传。
我们可以通过恶意代码图片来进行绕过。
在Windows系统中,可以通过cmd来生成图片马,在cmd中输入以下代码从而生成图片马(注:cmd在输入生成图片木马代码前,要先跳转到图片和木马文件保存的目录下)
我们上传
可以发现我们可以上传
如果在浏览器URL输入图片的路径,可以看到浏览器显示这张图片,但图片里面的代码并没有执行
include函数会包含上传的文件执行任意代码,我们可以利用它的这个漏洞执行木马。
我们应该如何执行这木马呢。
我们可以结合文件包含漏洞来利用
../../unsafeupload/uploads/2020/07/17/9017195f11d80619983108237945.png
这样我们就可以正常执行图片当中的木马
防范措施