文件上传漏洞
上传验证绕过分类
1. 客户端检测
i.使用firebug直接删除javascript验证
ii.使用burpsuite拦截抓包并修改
2.服务端检测
a.白名单与黑名单验证
可能服务器会做后缀名检查
(1)像针对php对抗黑名单的方法就是更php2,php3,php4,php5
(2)像针对asp对抗黑名单的方法就是asa,cer
(3)在windows的情况下,如果文件名以"."或者空格结尾的话,windows服务器在接受文件名后写操作时会自动去除
b.MIME验证
修改MIME类型:通过burp
1.有可能目的网站会对文件的MIME类型进行限制
2.MIME类型没有做限制的时候,可以进行如下突破--先上传一句话txt或者图片,但是在
content-type里改为application/php
c.目录验证
有些情况下我们会在上传的表单下,我们会看到有hidden字段,里面有可能就是目录,如果不存在则建立
d.截断上传

可以看到报文里有一个uploadimg/
我们猜测这个为保存后的目录
于是我们这样办

打开hex模式
将20更改为00,上传
或者是程序直接指定了filename:
如这种情况

.jpg用来通过验证,但是通过00截断让其最终解释为php

连接x.php文件
e.文件内容检测
对于文件内容检测,我们一般采取发送正常图片,用burp抓包,在报文中增加一句话代码的内容并修改content-length
图片内容和一句话内容中间需要空一行隔开
上传漏洞防御
1.客户端检测,使用JS对上传图片检测,包括文件大小,文件扩展名,
文件类型等
2.服务端检测,文件大小,文件路径,文件扩展名,文件类型,文件内容检测,对文件重命名
3.其他限制,服务器端上传目录设置不可用执行权限
修复上传漏洞
上传漏洞最终的形成原因主要有以下两点:
目录过滤不严,攻击者可以建立畸形目录
文件未重命名,攻击者可能利用web容器解析漏洞
看一段php的代码如何改进,存在什么风险
<?php header("Content-Type:text/html;charset=utf-8"); if (!isset($_POST['submit'])) { exit(); } $arr=Array('jpg','gif','jpeg','png','rar','zip','doc'.'docx','txt'); $imageTempName=$_FILES['file']['tmp_name']; $imageName=$_FILES['file']['name']; $last=strtolower(substr($imageName,strrpos($imageName,".")+1)); if(!in_array($last,$arr)) { exit("不支持的扩展名".$last); } $Extension=$_POST['Extension']; $imageName=md5($imageName).".".$last; move_uploaded_file($imageTempName,"./$Extension/".$imageName); echo ("文件上传成功,path=/$Extionsion/$imageName"); ?>
1.接受文件及其文件临时路径
2.获取扩展名与白名单对比,如果没有命令程序退出
3.对文件夹进行重新命名
可以
1.关闭echo显示
2.在uploaded文件夹里设置成没有执行权限

浙公网安备 33010602011771号