文件上传漏洞

上传验证绕过分类

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文件夹里设置成没有执行权限

 

 

 

 

 

 

 

  

   

 

 

 

 

 

 

 

 

    

 

 

 

 

 

 

         

  

 

posted @ 2015-10-15 14:26  平何去何  阅读(218)  评论(0)    收藏  举报