`
wangdei
  • 浏览: 374375 次
社区版块
存档分类
最新评论

深度剖析 Web上传文件的原理及实现

阅读更多

深度剖析上传内幕,我们可以通过分析数据包获取web上传漏洞,假如我们再合法的文件明后面跟一个\0之后是什么情况,我们可以构造数据包实现木马上传,也可以作为避免木马侵扰的基本功

 

现在有很多 Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于 java Commons FileUpload 、还有 Struts1.x Struts2中带的上传文件功能(实际上, Struts2在底层也使用了 Commons FileUpload)。在 asp.net中也有相应的上传文件的控件。

虽然现在有很多上传组件可以利用,但是了解 Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理。在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了。

众所周知,在客户端代码中需要使用 来选择要上传的文件,并上传,代码如上:

<!---->< html >
    
< head >
        
< title > upload <!---->title >
        
< meta  http-equiv ="description"  content ="this is my page" >
        
< meta  http-equiv ="content-type"  content ="text/html; charset=GB18030" >
    
<!---->head >

    
< body >
        
< form  action ="servlet/UploadFile"  method ="post"
            enctype
="multipart/form-data" >
            
< input  type ="file"  name ="file1"  id ="file1"   />
            
< input  type ="file"  name ="file2"  id ="file2"   />
            
< input  type ="submit"  value ="上传"   />
        
<!---->form >
    
<!---->body >
<!---->html >


从上面的代码可以看出,有两个文件选择框( file1 file2),在上传文件时,

标签必须加上 enctype="multipart/form-data",否则浏览器无法将文件内容上传到服务端。下面我们来做个实验。在 Servlet doPost方法中编写如下的代码,如果想使用 asp.net或其他的语言或技术,也可以很容易实现相应的功能。

 

<!---->    public   void  doPost(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    {
        java.io.InputStream is 
=  request.getInputStream();
        java.io.FileOutputStream fos 
=   new  java.io.FileOutputStream( " d:\\out.txt " );
        
        
byte [] buffer  =   new   byte [ 8192 ];
        
int  count  =   0 ;
        
while ((count  =  is.read(buffer))  > 0 )
        {
            fos.write(buffer, 
0 , count);
        }        
        fos.close();
    }

    上面的功能非常简单,只是通过 request 获得一个 InputStream 对象,并通过这个对象从客户端获得发送过来的字节流(注意,一定要用字节流,因为,上传的文件可能是二进制文件,如图象文件,因此,使用字节流会更通用)。并将这些字节流保存在 D 盘的 out.txt 文件中。然后我们打开 out.txt ,文件的内容如图 1 所示:
                                                                                                 


                                                                                   图1

    由于 out.txt是使用文本形式打开的,并且 file1上传的是 a.jpg(一个图象文件 ),因此,显示的是一些乱码。我们可以不用管它们。只需要看看这些内容的头部。我们很快就可以找到规律。每一个文件内容的头部都由“ -----------------------------30514443229777”分隔,然后是这个文件的属性,如下:

Content-Disposition: form-data; name="file1"; filename="a.jpg"

Content-Type: image/jpeg

其中包含了文件选择框的 name属性,还有上传的文件名( filename字段),要注意的, firefox在上传时,这个 filename属性值只是文件名,如果使用 IE,就是带路径的文件名,如 D:"a.jpg

接下来的规则就和 HTTP的头一样了,以一个空行( "r"n)分隔。后面就是文件的具体内容。现在最关键的文件的结尾,从图 1可以看出,文件的结尾也是“ -----------------------------30514443229777”,因此,可以断定,第一个上传的文件(包括文件头)是夹在两个“ -----------------------------30514443229777”之间的。而“ -----------------------------30514443229777”就是 multipart/form-data协议的分隔符。但这里还有一个最关键的问题。这个分隔符每次上传都不一样,服务端是如何知道每次上传的这个分隔符的呢?

实际上,这个分隔符是通过 HTTP请求头的 Content-Type字段获得,可通过下面的代码输出这个字段值:

System.out.println(request.getHeader("Content-type"));

输出的内容如下:

multipart/form-data; boundary=---------------------------106712230227687

只要在服务端获得 boundary后面的值即可。经过测试, Content-Type中的分隔符号中的“ -”比实际上传的“ -”少两个,不知是怎么回事。不过这没关系,我们可以认为每一个文件块是以 ""r"n—“结尾的,或是直接将从 boundary获得的分隔符加两个“”。而最后结尾的分隔符是“ ---------------------------106712230227687—”,后面多了两个“”。

综合上述,也就是说,一个文件块是以“ ---------------------------106712230227687”开头,以“”结尾,从图 2可以看出这一切。


                                   
                                         图

2    

至于剩下的工作,就是按着上面的规则来分析这些字符流了。分析的方法很多。在这里就不详述了。

 

分享到:
评论

相关推荐

    Web安全深度剖析(张柄帅)

    《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...

    Web安全测试:《Appscan用户指南》《Web安全深度剖析》

    在给定的资源中,《AppScan用户指南》和《Web安全深度剖析》为我们提供了深入理解这一领域的关键知识。 《AppScan用户指南》聚焦于IBM的AppScan工具,这是一个强大的静态和动态应用安全测试解决方案。AppScan允许...

    Spring MVC源码深度剖析开源架构源码2021.pdf

    本知识点将围绕Spring MVC的源码深度剖析展开,详细介绍Spring MVC的源码结构、工作原理以及如何进行源码分析。 首先,要理解Spring MVC是如何启动和配置的。在web.xml文件中配置了DispatcherServlet,这是Spring ...

    Java进阶之SpringMVC源码深度剖析共12页.pd

    本资料“Java进阶之SpringMVC源码深度剖析共12页.pdf”是对SpringMVC核心原理的深入探讨,通过分析源码来帮助开发者更深入地理解其工作原理。 1. **SpringMVC概述** SpringMVC是Spring框架的一个模块,主要负责...

    smartupload 源代码

    《SmartUpload源代码详解——深度剖析Java Web文件上传机制》 SmartUpload是Java Web开发中一个广泛使用的文件上传组件,它为开发者提供了便捷的文件上传和下载功能,尤其在JSP应用中,其强大而灵活的特性使得文件...

    商业编程-源码-Csharp文件共享系统.zip

    《C#文件共享系统:商业编程的深度剖析》 在当今信息化社会,文件共享系统已经成为企业和个人日常工作中不可或缺的一部分。本资源"商业编程-源码-Csharp文件共享系统.zip"提供了一个基于C#语言实现的文件共享系统...

    CTF-WEB入门DOC-2019版1

    4. 书籍:《白帽子讲Web安全》、《Web安全攻防渗透测试安全指南》、《Web安全深度剖析》、《内网安全攻防渗透测试安全指南》等。 四、基础漏洞学习: 1. SQL注入:使用sqliabs-wp、PayloadsAllthetThings等资源进行...

    PHP 开发实例完全剖析

    《PHP开发实例完全剖析》是一本深度探讨PHP编程实践的专著,旨在帮助读者通过具体的实例深入理解PHP的原理和应用。PHP作为一种广泛使用的服务器端脚本语言,尤其在Web开发领域占据着重要地位。本篇文章将围绕PHP开发...

    PHP+SQL考勤系统安全性实现(源代码+论文+答辩PPT+指导书).rar

    综上所述,《PHP+SQL考勤系统安全性实现》是一个全面的实战项目,不仅提供了实际的源代码,还通过论文和指导书深度剖析了系统的设计理念和安全策略,对于学习和研究Web应用开发,尤其是PHP和SQL结合的安全实践,具有...

    AWVS AcuSensor功能分析1

    《AWVS AcuSensor功能深度剖析》 AcuSensor,作为Acunetix Web Vulnerability Scanner的核心组件,致力于实现交互式应用安全检测(IAST),它以创新的方式检测Web应用程序中的漏洞。本文将深入探讨AcuSensor的功能...

    guest3 guest3guest3guest3guest3guest3guest3

    7. **静态文件和媒体文件管理**:Django区分静态文件(如CSS、JavaScript)和用户上传的媒体文件。静态文件在开发时通常由开发服务器处理,而在生产环境中则由Web服务器负责。 8. **数据库操作**:Django的ORM...

    Spring源码解析Xmind思维导图

    这份"Spring源码解析Xmind思维导图"是对Spring框架源码深度剖析后的精华提炼,涵盖了Spring的核心模块和重要机制。 首先,让我们来探讨一下Spring的IoC容器。IoC,也称为依赖注入,是Spring的核心特性。它管理着...

    Spring in action 加随书源代码

    《Spring in Action》是一本深度剖析Spring框架的权威著作,其随书源代码包含了书中所有示例项目的实现,为读者提供了实践和学习Spring框架的宝贵资源。这本书详细讲解了Spring框架的各种核心特性和应用场景,包括...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    9-13 3.http协议深度剖析④-http响应详解(文件下载) 9-13 4.http协议深度剖析⑤-http响应详解(作业评讲) 9-13 5.php数据库编程①-使用mysql扩展库 9-13 6.php数据库编程②-使用mysql扩展库 9-13 7.php数据库编程③-...

    史上最全传智播客PHP就业班视频课,8月份视频

    9-13 3.http协议深度剖析④-http响应详解(文件下载) 9-13 4.http协议深度剖析⑤-http响应详解(作业评讲) 9-13 5.php数据库编程①-使用mysql扩展库 9-13 6.php数据库编程②-使用mysql扩展库 9-13 7.php数据库编程③-...

    php开发培训最全学习大纲.docx

    八、HTTP协议深度剖析 1. HTTP协议原理:理解HTTP请求和响应的工作流程。 2. 防盗链技术:防止资源被非法引用。 3. 302和304状态码:了解重定向和缓存响应的使用。 4. 禁用缓存设置:控制HTTP缓存策略,确保数据实时...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    9-13 3.http协议深度剖析④-http响应详解(文件下载) 9-13 4.http协议深度剖析⑤-http响应详解(作业评讲) 9-13 5.php数据库编程①-使用mysql扩展库 9-13 6.php数据库编程②-使用mysql扩展库 9-13 7.php数据库编程③-...

    (全)传智播客PHP就业班视频完整课程

    9-13 3.http协议深度剖析④-http响应详解(文件下载) 9-13 4.http协议深度剖析⑤-http响应详解(作业评讲) 9-13 5.php数据库编程①-使用mysql扩展库 9-13 6.php数据库编程②-使用mysql扩展库 9-13 7.php数据库编程③-...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    9-13 3.http协议深度剖析④-http响应详解(文件下载) 9-13 4.http协议深度剖析⑤-http响应详解(作业评讲) 9-13 5.php数据库编程①-使用mysql扩展库 9-13 6.php数据库编程②-使用mysql扩展库 9-13 7.php数据库编程③-...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

Global site tag (gtag.js) - Google Analytics