1.原理
利用web容器特性和上传过滤不严谨上传含恶意代码的文件。
2. 解析漏洞
学习文件上传漏洞是离不开web容器解析漏洞的,下面介绍一些常见web容器IIS、APACHE、NGINX的解析漏洞
2.1 IIS解析漏洞
2.1.1 IIS 6.0
(1)目录解析
建立*.asp/asa
文件夹时,包含一个1.txt
文件,则访问1.txt
时,因为在 *.asp/asa
文件夹中1.txt
文件会被当做asp脚本执行。
(2)截断
当文件为*.asp;1.jpg
时,也会被当做asp脚本执行。
2.1.2 IIS7/7.5
在Fast-CGI运行模式下,在一个文件路径(/1.jpg)后面加上/2.php会将/1.jpg/2.php 解析为 php 文件。
条件:php.ini里默认cgi.fix_pathinfo=1;
2.2 Apache解析漏洞
Apache在解析文件时,从右往左解析,遇到不认识的扩展名就向前继续解析,直到遇到认识的扩展名,如果都不认识,则暴露其源代码
当一个文件为1.php.rar.ss.aa
,不认识aa
,会一直向前解析,直到遍历到认识的扩展名。
2.3 NGINX解析漏洞
也叫PHPCGI漏洞,实质上是因为php.ini中的cgi.fix_pathinfo
默认是开启的。
在访问1.jpg
这个文件时以这种去访问/1.jpg/1.php
(1.php实际上不存在),会被当做PHP代码去执行。
3. 上传检测类型
3.1 客户端检测
3.1.1 原理
利用javascript对选择的文件后缀进行检测,在没有点击上传前就已做判断。
3.1.2 绕过方法
(1)在firebug更改jsp代码,删除相应代码的函数
(2)关掉浏览器js执行
(3)将脚本文件扩展名改成允许上传的扩展名,上传时抓包,更改为原扩展名即可。
3.2 服务器端类型检测
3.2.1 黑/白名单过滤
- 黑名单:设置过滤器,过滤掉不允许上传的文件类型
- 白名单:列出允许上传的文件类型,不满足则不允许上传
3.2.2 MIME类型检测
MIME类型用来设定某种扩展名文件的打开方式,当文件被访问时,浏览器自动使用指定的应用程序来打开。如GIF图片MIME为image/gif。
- 利用方法:
抓包更改MIME类型。
3.2.3 目录验证
上传文件时,如果指定的目录存在就将文件写入该目录,要是不存在则新建该目录。 - 利用方法:
结合IIS 6.0解析漏洞,自定义文件夹为1.asp,当服务器不存在该目录时创建,上传的1.jpg则会被当做asp脚本执行。
3.2.4 截断上传
%00截断漏洞,在asp程序中最常见
4. 修复方法
- 对文件进行重命名、
- 接收文件时用临时路径存放、
- 获取扩展名与白名单对比,没有则退出