浅析文件上传漏洞

 

0x01简介

文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识。俗话说,知己知彼方能百战不殆,因此想要研究怎么防护漏洞,就要了解怎么去利用。此篇文章主要分三部分:总结一些常见的上传文件校验方式,以及绕过校验的各种姿势,最后对此漏洞提几点防护建议。

0x02文件上传检测

(一)客户端检测

1. JavaScript本地验证

在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式

 

判断方法:1.响应迅速

                  2.查看网页源代码

 

(二)服务器端检测

1.MIME类型校验(Content-Type字段)

代码:

 1 php
 2 
 3 if($_FILES['userfile']['type'] != "image/gif") {//获取Http请求头信息中ContentType
 4 
 5     echo "Sorry, we only allow uploading GIF images";
 6 
 7     exit;
 8 
 9 }
10 
11 $uploaddir = 'uploads/';
12 
13 $uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
14 
15 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)){
16 
17     echo "File is valid, and was successfully uploaded.\n";
18 
19 } else {
20 
21     echo "File uploading failed.\n";
22 
23 }
24 
25 ?>

 

2.文件扩展名校验(白名单、黑名单)

代码:

 1 php
 2 
 3 $blacklist = array(".php", ".phtml", ".php3", ".php4");
 4 
 5 foreach ($blacklist as $item) {
 6 
 7 if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
 8 
 9     echo "We do not allow uploading PHP files\n";
10 
11     exit;
12 
13 }
14 
15 }
16 
17 $uploaddir = 'uploads/';
18 
19 $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
20 
21 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)){
22 
23     echo "File is valid, and was successfully uploaded.\n";
24 
25 } else {
26 
27     echo "File uploading failed.\n";
28 
29 }
30 
31 ?>
32 
33  

 

 

3.文件头内容检验(eg:jpg文件头为FFD8)

 

4.自定义正则表达式

 

0x03绕过上传检测

(一)绕过客户端检测

1.使用firebug插件删除验证函数或者浏览器禁用JS,直接上传脚本文件

2.抓包改包。上传图片马,抓包改后缀为脚本文件后缀

 

(二)绕过服务器端检测

1.绕过 MIME类型校验(Content-Type字段)

使用BurpSuite抓包,修改Content-Type字段为允许上传的类型

 

2. 绕过文件扩展名校验

(1)绕过黑名单校验:①找黑名单中的漏网之鱼

                                      ②大小写绕过

(2)白名单:①%00截断

                       ②配合Web容器的解析漏洞

3.绕过文件头内容校验

使用图片马      

生成图片马: copy  /b 1.jpg+1.php  2.jpg

 

0x04文件上传漏洞防御

1.文件上传目录设置不可执行

2.检查文件类型(后缀、MIME)

3.使用随机数改写文件名

4.单独设置文件服务器的域名

你可能感兴趣的:(浅析文件上传漏洞)