文件上传漏洞基本概述以及防范步骤

 一. 文件上传漏洞基本概述

  由于程序员在对用户文件上传部分的控制不足或者处理缺陷,从而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件(即利用服务器端的文件操作语句写成的动态网页,可以用来编辑服务器上的文件)。打个比方来说,如果你使用windows服务器并且以asp作为服务器端的动态网站环境,那么在你的网站的上传功能处,就一定不能让用户上传asp 类型的文件,否则他上传一个webshell,服务器上的文件就可以被他任意更改了。

 二. 如何防范

  代码层面,需要做什么操作来防范文件上传漏洞?

  • 检查是否判断了上传文件类型及后缀
  • 定义上传文件类型白名单,即只允许上传的文件类型
  • 文件上传目录禁止脚本解析

  操作步骤前端JS代码限定用户选择文件--->后台代码重新校验文件类型--->IIS取消文件上传目录执行脚本的权限。

 三. 实例演示

  现在就以如何防范图片上传漏洞做个演示过程,采用技术是:一般处理程序(ashx)+静态页面(html)。

  首先,新建一个解决方案,项目结构如下图所示:

                           文件上传漏洞基本概述以及防范步骤_第1张图片

  根据上述列举的防范文件上传漏洞的3条操作步骤,我们来实现上传图片的代码:

  第1步:前端用JavaScript对上传文件的扩展名进行判定,不符合格式的文件禁止上传。需要明白一点,用户可通过禁用或修改JS代码依然可以上传各种类型的文件,所以JS代码在这的功能也只是辅助用户正确选择文件。 

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
    <title></title>
     <script type="text/javascript">
         function showImgPath() {
            var fileName = document.getElementById("fileImg").value;
             var ext = fileName.substr(fileName.lastIndexOf('.'));
             if (ext == ".jpeg" || ext == ".jpg" || ext == ".png" || ext == ".gif") {
                 return true;
             }
            else {
                alert("请选择.jpeg/.jpg/.png/.gif/格式图片");
            }
         }
     </script>
 </head>
 <body>
     <form method="post" enctype="multipart/form-data" action="FileUploadHandler.ashx">
        <input type="file" name="image" id="fileImg" onchange="showImgPath()" />
         <input type="submit" value="提交" />
     </form>
 </body>
 </html>
FileUpload.html 代码

  第2步:后台接收到前端传来的图片文件后,同样是对文件扩展名进行检测。格式如果不符合要求就结束此次请求,相反就把图片保存到存储目录中。利用Guid的目的是随机生成文件路径,防止重名。

     public class FileUploadHandler : IHttpHandler
     {
 
         public void ProcessRequest(HttpContext context)
         {
             context.Response.ContentType = "text/html";
             //获取表单上传的文件
             HttpPostedFile file= context.Request.Files["image"];
             //获取文件扩展名
             string ext= Path.GetExtension(file.FileName);
             if (ext == ".jpeg" || ext == ".jpg" || ext == ".gif" || ext == ".png")
             {
                 //设置文件的储存路径
                 string path = "/Image/" + Guid.NewGuid().ToString() + file.FileName;
                 //保存文件到Image目录
                 file.SaveAs(context.Request.MapPath(path));
                 context.Response.Write("Upload Success!");
             }
             else
             {
                 //结束此次上传请求
                 context.Response.Write("Upload Failure!");
                 context.Response.End();
             }
         }
 
         public bool IsReusable
         {
             get
            {
                 return false;
             }
         }
     }
FileUploadHandler.ashx 代码

  第3步:完成前两步也并不是万事大吉,黑客可能还是会有方法将木马上传到IIS服务器。接下来要做的一步是在IIS上把文件上传目录Image的权限设置成只读模式,这样在该目录下木马程序就不能被执行。操作步骤如下:

文件上传漏洞基本概述以及防范步骤_第2张图片

文件上传漏洞基本概述以及防范步骤_第3张图片

效果演示说明:

  当上传文件符合类型要求时,服务器将图片文件保存至Image文件夹下,浏览器就会响应上传成功;

  当上传文件不符合类型要求时,前端会提示用户文件选择错误,假如用户继续上传,后台代码会再次校验文件并阻止,响应上传失败。

文件上传漏洞基本概述以及防范步骤_第4张图片

你可能感兴趣的:(文件上传漏洞基本概述以及防范步骤)