本次漏洞原理用到的靶场环境:pikachu
工具:Burp Suite,Antsword(蚁剑)
前言
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
一·client check 客户端验证
1.进入pikachu漏洞练习平台,选择不安全的文件上传,选择client check,进入如下界面
2.前面介绍到文件上传漏洞是解析了不该执行的脚本文件导致被攻击,这里我们尝试上传个php脚本文件
上传不成功
3.查看页面的源代码,发现这种类型的漏洞采用JS的白名单进行防护(只允许规定的文件类型上传)
这里有两种方法进行绕过:
·第一种 直接使用开发者工具中的设置,禁用页面的JS文件
·第二种 利用BurpSuite抓包修改后缀
方法一:打开Edge浏览器的开发者工具(或者插件)禁用JS
再次上传,就成功绕过了
方法二:打开浏览器中的抓包插件,并且端口和IP设置与BurpSuite一致,抓包(这里我用的火狐)
上传时成功抓包,并且可以看到文件类型为png,此时已经通过了前端的检验,可以在BurpSuite中修改文件类型,就可以执行我们的脚本程序了
两种方法上传成功后,使用Antsword连接就可以对攻击目标的主机进行一系列操作了
可以看到我们php脚本在该主机下的位置,并且可以对该主机下的各盘符的文件进行读写操作
蚁剑使用教程推荐这篇文章:蚁剑使用教程
二·MIME type 服务端验证
前端的检测可以通过禁用JS直接绕过,也可以抓包修改文件后缀进行绕过
MIME type的防护方式是进行后端进行检测,因此我们无法通过禁用JS的方式绕过
后端代码:
从上面代码可以看出,该防护方法是后端检测文件头content-type,判断上传的文件类型是否为白名单中的图片类型,因此我们可以通过BurpSuite抓包的方式,修改文件头中的内容进行绕过
修改为MIME type中允许上传的文件类型后,在BurpSuite中上传,上传成功,通过url和该文件的路径可以执行文件中的木马程序控制目标主机
三·getimagesize
仅检查http头部字段任然不安全,有的网站会使用getimagesize函数在后端进行防护
了解一下getimagesize函数
可以通过将php脚本藏在图片中,绕过getimagesize的检测
在命令行中,用该命令向图片中写入php脚本
copy /b 源图⽚.png + ⽊⻢.php ⽬的图⽚.png
但是web容器无法解析图片中的脚本,我们该如何执行插入在图片中的php脚本呢?
有两种方法:解析漏洞和利用文件包含漏洞,这里我们利用漏洞平台中的文件包含漏洞在此绕过
文件包含漏洞的知识:文件包含漏洞详解
在php语⾔中,提供了⼏种⽂件包含函数,⽐如include(),require(),include_once(),require_once() 这四种。
这⾥我们只介绍第⼀种: include() ,我们直接引⽤php代码来进⾏解释。
<?php
include $_GET['filename'];
?>
因此在上传包含木马的文件后,可以其他目录中解析该图片中的php脚本
先获取上传的图片的路径
结合URL,可以知道该图片的路径为:
http://localhost:8080/pikachu/vul/unsafeupload/uploads/2023/10/17/984098652e83ef18831943671101.png
该平台的文件包含漏洞url为:
http://localhost:8080/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4
从文件包含漏洞的url可以看出,与文件上传漏洞相同的祖先目录是在vul下,也就是当前目录的上两级目录(由于从文件包含漏洞界面去解析文件上传漏洞处刚刚上传的带有php脚本的图片,所以从该目录下去寻找可执行的脚本文件的目录)
由于提交后执行了JS代码,因此没有跳转其他的url,而是当前界面的变化,因此可以判断出file1.php是在fileinculde的文件夹下,所以只需将带有php代码的文件的路径替换file1.php即可执行木马程序
拼接的url为:(shell中的文件操作 ../ 返回上一级目录)
http://localhost:8080/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/10/17/984098652e83ef18831943671101.png&submit=提交
出现这样的情况说明php代码被执行了(其他的乱码是图片中的16进制在此页面中显示乱码了)
在蚁剑中用此url连接,成功(文件目录是在文件包含漏洞中的文件夹下,因为是从此处去解析刚刚的png文件的):
看到有人可能还是一脸懵逼,为什么要这么复杂的从另外一个题目中来解析文件上传漏洞中的带有php代码的图片呢?其实刚刚上面说了,我们利用的是php语言中的include()函数进行解析文件中的php代码(只要文件中含有php代码,include函数都会解析出来),而文件上传漏洞中并没有利用到这个函数,因此无法解析我们图片中的php代码,所以利用一个含有文件包含漏洞的地方(也就是刚刚url中的filename=)替换为我们想要执行的文件(含有php代码),就可以控制目标主机了
漏洞防御
1、文件上传的目录设置为不可执行
将文件上传的目录设置为不可执行后,即使上传成功了php文件,也没有任何作用。
2、判断文件类型。
判断文件类型的方法有MIME type,黑名单和白名单等,黑名单一直都是不可靠的,因为相对拉黑部分文件而言,直接筛选出符合要求的文件会更有效,也就是白名单,但是随着技术的进步,白名单也越来越不可靠了,而MIME type也可以通过修改content-type的值进行绕过。
3、使用随机数改写文件名和文件路径。
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。像上述的getimagesize函数的防御,被绕过就是因为用户访问到了文件中其他路径的文件而执行了php脚本,而随机数改写文件名,路径等这是一种有效的防御方式。
4、单独设置文件服务器的域名。
单独设置文件服务器的域名,和随机改写文件名和文件路径的防御原理差不多,都是让恶意用户无法访问其他文件,从而导致上传的文件无法被执行
5、使用安全设备防御。
使用安全设备防御应该是目前最有效的方法之一,当网页执行了post请求后,电脑中的安全软件就会检测该post请求中的文件是否含有病毒,从而有效的防御文件上传攻击