什么是文件上传漏洞
文件上传漏洞指用户通过上传一个恶意的可执行文件,例如木马、病毒、webshell、恶意脚本等等在服务器中执行,配合其他工具,获得网站控制权或达到一些其他效果。
文件上传漏洞原理
由于对上传文件的格式限制不够严格,或者服务器的处理逻辑不够严谨,对上传文件的解释和应用限制不够充分,导致用户可以通过操作上传的文件进行一些开发者没预想到的操作,做一些用户权限之外的事情。
文件上传漏洞的前提
一、有文件上传的功能。这里不是指必须要网站给你提供严格文件上传的路径,文件上传可以通过传参一些恶意代码来完成等等。
二、文件要在程序中能被执行,例如网站时php环境的,我们上传的恶意代码是java的,那显然执行不了。
三、上传文件的目录要有执行的权限,我们上传文件都会存在一个网站规定的目录里面,如果该目录没有解析脚本执行的权限,那么传进去文件执行不了,也就构不成文件上传漏洞。
四、文件上传之后,我们要能用web访问到这个文件,以此来进行后续的操作。
文件上传漏洞的类型
文件上传漏洞的类型很多,只讲理论也是晦涩难懂,我们使用updoad-labs来了解文件上传漏洞类型
pass01(前端js验证)
判断前端js验证的方法:网站有限制上传文件的格式,对于一些非法发文件格式不予上传,我们可以看一下这关的源码

可以看到是建立了一个白名单,只能上传名单中三种格式的文件。那么我们上传一个非法格式的文件php抓包看看

在打开抓包环境的条件下,可以看到直接弹窗显示上传失败,去抓包软件看也没抓到包,说明服务器没有接收到上传的文件,他在前端进行验证,如果通过就把文件发送到后端服务器里面。
所以我们只能先通过前端验证,让文件能到达后端才能进行后续的操作。我们上传一个图片马或者直接改php文件后缀上传也可以

没有显示上传成功或失败,说明已经通过前端的验证了,我们在抓包软件可以看到详细的信息

因为他验证在前端,所以后端应该没有验证,此时我们把文件后缀改成php也不会出问题

发送之后关闭拦截,看看页面的回显

可以看到上传成功了一张图片,我们在新网页打开图片即可获得上传文件的地址,尝试用蚁剑连一下
pass02(content-type绕过)
这一关就不再验证验证是前端还是后端了,这关是后端验证
在一些文件上传模块中,服务器会通过判断content-type来判断上传文件的类型,所以我们可以上传一个想要的文件类型,然后将他的content-type改成合法的类型以此绕过验证
我们试着上传应该php文件,抓包看看

图片型的content-type是image/jpeg,直接修改,发送看看网页回显

可以看到我们成功将这个php文件上传了,之后就是和上面一样的操作而已
pass03(特殊后缀绕过php3、php5、php7、phtml......)
apache对于一些特殊的后缀也会使用php的解析方法来解析,当然这也受限于版本
这一关是通过检验后缀来检验上传文件类型的,是黑名单验证,它禁止我们上传php文件,所以我们上传一个php文件之后去改他的后缀来实现绕过是可行的

如图将后缀改成php3,返回网页看回显,可以看到上传成功了

pass04(.htaccess绕过)
htaccess文件全称Hypertext Access,是Apache服务器中的一个配置文件,它允许在目录级别上改变服务器配置。它可以改变文件解析规则以此来绕过验证,apache会先加载主配置文件httpd-conf之后去目录里面搜索有无htaccess文件,若有则接着加载
htaccess文件的优先级很高,比主配置文件httpd-conf要高,所以能修改解析类型。
这里介绍两种类型的htaccess文件
它使用apache服务器里面的<FilesMatch>指令块,功能是匹配到456.jpg这个正则表达式,将他以php的形式解析。

这个代码的功能是增加两种解析方式,将格式为txt和jpg的文件以php的形式解析
所以我们先上传这个上面介绍的第一个htaccess文件再上传一个456.jpg的图片马即可实现绕过。
pass05(user.ini绕过)
先介绍一个文件.php.ini文件,这是PHP 的主要配置文件,用于定义 PHP 的各种设置和选项。它在 PHP 启动时被读取,对于服务器模块版本的 PHP,仅在 Web 服务器启动时读取一次,它跟.user.ini文件的关系和上面说的httpd-conf和.htaccess文件的关系类似,这边就不赘述了。我们可以通过phpinfo()来找到这个文件

接着看到里面如果有CGI/FastCGI这个字样,就说明.user.ini可以使用。
.user.ini和.htaccess文件一样是一种配置文件,相当于我们自己定义的.php.ini文件,可以用来读取目录中的php文件,.user.ini的使用范围很广,不仅适用于apache也适用于nginx服务器,只要开了FastCGI模式就可以用,下面介绍一个.user.ini文件

auto_prepend_file是php配置中的一个指令,它可指定一个文件,在 PHP 解析任何脚本文件之前,先自动包含并解析指定的文件,像图中我们指定文件是456.jpg,那么.user.ini文件在解析任何脚本文件之前会先包含456.jpg文件,我们使用.user.ini的环境是php环境,那么我们指定文件时要先在目录中找一个php文件.user.ini才能执行,找到php文件后会先引入我们指定的文件到目录中的php文件中,因为我们指定的文件格式是jpg,jpg文件当作php文件来执行时会出现解析错误的问题,但是如果jpg文件中有php代码,那么还是能顺利解析执行,所以.user.ini使用的前提是目录下有至少有一个php文件。
那么接下来就试试看,我们先看一下这个网站上传的目录中的文件

可以看到是有一个php文件的,所以我们不需要自己上传一个php文件。我们先上传.user.ini文件,再上传456.jpg图片马,此时456.jpg被包含到readme.php文件中了,我们访问一些readme.php文件

看前缀应该是成功了,我们尝试连接一下
