一、文件下载漏洞
1.1 概述
很多网站都会提供文件下载的功能,即用户可以通过点击下载链接,下载到链接所对应的文件。但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感的文件。(又称:任意文件下载)
1.2 演示
1、我们打开pikachu平台上的对应的模块;
2、看到下载提示页面
3、我们为了演示,在名字上我们右击选择在新建标签页中打开。
4、那我们是否可以更改filename的值来获取到后台其他的文件?我们来试一下
5、下面我们来看一下代码。
二、不安全的文件上传及客户端绕过
2.1 概述
因为业务功能的需要,很多web站点都有文件上传的接口,例如:
- 注册时上传头像文件(比如jpg,png,gif)
- 上传文件附件(doc,xls)
但是,如果在后台开发时,并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意的文件(例如:一句话木马),从而通过对该恶意文件的访问来控制整个web后台。
文件上传漏洞测试流程如下:
2.2 客户端验证绕过
1、我们来到对应的模块下。
2、我们查看一下页面源代码。
3、我们可以打开页面控制台选择器,选择对应的组件,取消对checkFileExt()函数的调用。
4、上传我们的system.php文件,文件内容是:<?php system($_GET[x]);?>
5、访问我们的一句话木马文件,获取主机IP地址。
2.3 服务端验证绕过
2.3.1 MIME
1、MIME简介
2、$_FILES()函数简介
3、来到对应额mime模块。我们先看一下源代码。
接着我们看upload函数
4、回到我们的实验平台。打开burp suite。分别上传一次允许被上传的图片文件和不允许上传的其它类型文件(这里我们上传一句话木马文件system.php)
5、通过对比我们发现了不同,我们利用burp suite的重放模块,修改Content-Type的值,达到绕过的目的。
6、通过访问我们上传的文件,就可以进行系统的控制。
2.3.2 getimagesize
getimagesize()会读取图片16进制文件的头几位,从而加以判断,返回的结果中包含了文件的大小和类型,如果用这个函数来获取类型,从而判断是否是图片,会存在问题。
1、我们可以制作一张木马图片,首先我们准备一张图片和一个php文件,在文件里写入:<?php phpinfo();?> 用来获取数据库信息。
2、在命令窗口执行:copy /b kb.png + system.php result.png
3、我们将刚刚生成的图片木马上传至我们的站点。
4、现在我们有一个问题,虽然我们绕过了后台的防护机制,由于我们上传的是一个图片,我们访问这个文件也只会显示一张图片,并不会执行我们嵌入到里边的PHP代码,那么我们该如何利用呢?我们可以结合文件包含漏洞进行测试。
回车后我们可能看不到结果,这说明我们的文件定位还不完全,那么我们累加../直到有结果输出为止。