0x00前言
指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
文件上传漏洞条件:
- 上传的文件能被Web服务器当做脚本来执行
- 我们能够知道并且访问到上传文件的路径
一般我们会利用文件上传漏洞上传一句话木马,然后用菜刀,蚁剑连接获取 webshell。但是这里有两个问题:
- 第一你的文件能上传到web服务器
- 第二你的文件能被当成脚本文件执行,所以要想让上传文件被当成脚本执行,我们经常会和文件包含漏洞和文件解析漏洞一起利用
0x01测试流程
0x02防御手段
1前端绕过
1.js校验 》》修改源代码/禁用js
也可以使用抓包工具绕过。
2后端校验
1.内容校验
1.MME类型检测
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件 用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,其实可以理解为多媒体类型,jpg图 片 -- image/jpeg png image/png 浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打 开方式。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的 种类。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
2. 代码注入绕过--getimagesize()
方法一:直接伪造头部GIF89A
方法二:CMD方法,copy /b test.png+1.php muma.png
2.后缀校验
就是对文件后缀名进行判断,那么我们采取两种方式绕过,黑名单和白名单。 黑名单指的是程序员在写代码的时候,有时候会将一些php、jsp等脚本或者代码加入黑名单。白名单是指运行只允许那些通过。
如果是后端黑名单过滤的话,我们可以想尽任何办法绕过黑名单进行上传。比如如果目标服务器是windows系统的话,我们可以利用windows系统的解析漏洞,用burpsuite抓包,将文件名后缀改为 .php. 或者空格.php ,因为在windows系统内是不允许文件以 . 或者空格结尾的。所以在绕过上传之后windows系统会自动去掉 点和空格。所以,该文件最终还是会被解析成 .php 。或者还可以将php三个字母变换大小写,因为在windows系统里面是不区分大小写的。
如果是白名单检测的话,我们可以采用00截断绕过。00截断利用的是php的一个漏洞。在 php<5.3.4 版本中,存储文件时处理文件名的函数认为0x00是终止符。于是在存储文件的时候,当函数读到 0x00(%00) 时,会认为文件已经结束。
例如:我们上传 1.php%00.jpg 时,首先后缀名是合法的jpg格式,可以绕过前端的检测。上传到后端后,后端判断文件名后缀的函数会认为其是一个.jpg格式的文件,可以躲过白名单检测。但是在保存文件时,保存文件时处理文件名的函数在遇到%00字符认为这是终止符,于是丢弃后面的 .jpg,于是我们上传的 1.php%00.jpg 文件最终会被写入 1.php 文件中并存储在服务端
0x03服务器解析漏洞
条件有限,这里只能简单列举一下了。
1.iis5.x-6.x解析漏洞
1.目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpgxx.asp为目录名。
原理: 服务器默认会把.asp目录下的文件都解析成asp文件。2.文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。
3.解析文件类型IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa
/test.cer
/test.cdx
2.apache
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把 xx.php.owf.rar解析成php。
www.xxxx.xxx.com/test.php.php123 就会被解析成php
nginx
当php.ini配置文件中开启了cgi.fix_pathinfo,该值默认为1,表示开启。看名字大概知道是处理路径用的配置。
比如我们上传了一个木马文件web.jpg,因为web.php不能上传,现在我们想执行这个web.jpg,可以访问如下路径访问
http://192.168.2.104/pikachu/web.jpg/aaa.php
而目标服务器上没有aaa.php文件,本来如果nginx.conf的配置没有问题的话,nginx会先去找下这个文件是否存在,如果存在,在找php解释器来解释执行代码,如果不存在,nginx会直接返回错误信息,说找不到该文件,但是如果nginx.conf配置不当会导致nginx把以’.php’结尾的文件交给fastcgi处理,也就是说首先nginx看到你路径中要找aaa.php,哦,原来是php文件,nginx不去找这个文件了,而是就直接交给了fastcgi,fastcgi又去找php解释器去处理该路径,而php开启了cgi.fix_pathinfo,那么php解释器处理这个路径的时候,发现没有aaa.php文件,那么他会找路径中上一层路径的文件作为aaa.php来运行,如是
乎就找到了web.jpg,将web.jpg当作aaa.php来运行了,所以代码被执行,看到如下效果
0x04文件上传靶场
其他绕过姿势请 移步下方链接
upload-labs靶场通关详解(1-15)_uploadlab-CSDN博客