浅析文件上传漏洞
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.单独设置文件服务器的域名