`
aroundworld2008
  • 浏览: 48391 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

设计安全的文件上传功能

阅读更多
源文网址,http://www.05112.com/Article/200808/19700.html

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2008-8-6 10:35:56

这两天我们的老朋友PDP在BlackHat 08上做了一个关于GIFAR的演讲。和往常一样,PDP的东西基本上都很猥琐,这个也是。主题是关于是如何把GIF或者 JPG文件和JAR文件捆绑在一起,然后欺骗服务器以为是GIF或JPG文件,结果却是在客户端的JVM中执行JAR的例子。

他还举了些欺骗的例子,比如在office2007中,doc文件实际上就是zip格式了,里面都是些xml,那么他把jar文件打包在zip文件里,再把后缀改成doc,来达到欺骗的目的。

在这里是客户端的问题,我想到的则是其他的问题,比如安全上传。

根据以往的经验看来,我们可能会设计如下文件上传的安全规则:
1. 文件上传的目录设置为不可执行
2. 判断文件类型
3. 单独设置文件服务器的域名
4. 改写文件名,文件路径不可预测

第一点规则是显而易见的,是为了减小执行动态语言脚本的风险。如果被成功上传了一个webshell,但是不能执行,还是能够起到深度防御的作用。

第二点,在判断文件类型的时候,我们一般要求使用白名单,而不是黑名单,因为黑名单可能会列不全,还可能会造成一些bypass的风险。

比如以前老版本的 FCKEditor就出过这种问题,只做了黑名单的控制,最后被bypass。

而apache有个特性,是解析第一个“ . ”后的文件后缀作为文件类型,比如 fvck.php.rar.rar.rar 会被apache当作 fvck.php解析。 我最近看了下php的手册,在安装文档里,针对这个问题,专门有一个指导:
15. Tell Apache to parse certain extensions as PHP. For example, let's have
Apache parse .php files as PHP. Instead of only using the Apache AddType
directive, we want to avoid potentially dangerous uploads and created
files such as exploit.php.jpg from being executed as PHP. Using this
example, you could have any extension(s) parse as PHP by simply adding
them. We'll add .phtml to demonstrate.

<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
IIS6也有这种类似的特性,即在文件夹名字为 fvck.asp 时(fvck可替换为任意值),该文件夹下任何文件都会被当作asp来执行,
至今似乎也未见到微软有把这个特性当作bug来fix的迹象。
所以如果不熟悉这些webserver的特性,你可能会觉得漏洞来的如此神奇:我明明做了充分限制,为什么还是被“做俯卧撑”了?

在判断文件类型的时候,大多数程序都是使用的采用检查文件后缀的方法,这里主要需要注意的hacking trick是某些检查函数是否会以0字节作为结束的判断,以前动网就出过类似的漏洞,上传 fvck.jpg%00.asp即可绕过文件类型检查。

我也见过只检查文件头部的,这种也很好欺骗,构造一个合法的gif文件头部,然后将webshell贴在后面,在后缀合法的情况下,一样能够被浏览器解析:

GIF89a ?
<? phpinfo(); ?>

比较高级一点的是做更多的文件格式检查,比如检查图片里像素的长宽等,然后再对图片做一次压缩,这样出来的图片基本都变形了,有啥webshell也被破坏了。

而检查文件格式时候一般会用到一些网上已经封装好的类,在扫描文件格式方面还是比较有优势的。但是在检查大文件的时候效率显然是一个需要考虑的问题,很多程序员出于效率原因可能不太会愿意选择这种方式。

但是今天从PDP的这个绑定文件的猥琐方法看来,详细检查文件格式的方法还是非常有必要的,因为攻击者的目标可能不光是服务器,还是客户端,如果要对客户端有所保证,就必须要详细检查文件格式,使之落在白名单中。

第三点,单独设置文件服务器域名,也是一种针对客户端的保护。这样可能会避免许多跨域的问题。如果发生了XSS,攻击者可能还需要突破跨域的限制才能进一步扩大战果。再比如如果被上传了crossdomain.xml,可能就会导致flash的跨域问题,这些都是实实在在的风险。

第四点,改写文件名,随机文件路径。这是把风险藏起来,现在基本上尽职一点的程序员都会这么设计,这也是最大程度减小风险的非常切实有效的手段。

需要注意的是构造随机文件名或路径的算法需要足够“随机”,而不要从比如cookie之类的地方直接取一段hash出来。比较好的做法是在server上用类似random()一类的函数来生成,相信程序员们这点意识还是有的,不再赘述了。
分享到:
评论

相关推荐

    多文件上传和展示

    【标题】:多文件上传和展示 在网页开发中,多文件上传功能是常见的需求,尤其是在数据管理和资源共享的场景下。Bootstrap-fileinput 是一个流行的...同时,配合后端服务器的处理,能够实现安全、高效的文件上传功能。

    uniapp实现移动端上传文件功能

    4. **后端接口设计**:在实现文件上传功能时,后端需要提供一个接收文件的接口,这个接口通常会接受multipart/form-data类型的请求,并处理上传的文件。 具体步骤如下: 1. **调用uni.chooseFile**:在用户触发...

    功能强大的文件上传组件

    【标题】"功能强大的文件上传组件"涉及到的核心技术是HTML5中的文件上传API,这是一个现代Web应用中不可或缺的功能,尤其在交互丰富的网站和应用程序中。HTML5的File API提供了更灵活、更强大的文件处理能力,使得...

    SSH整合并实现文件上传功能

    在本项目中,SSH被用来构建一个功能完善的Web应用程序,实现了文件上传功能,并且对上传文件的大小进行了检查,确保了系统的稳定性和安全性。下面我们将深入探讨SSH整合及其文件上传的实现。 首先,Spring框架作为...

    文件上传,jsp限定后缀名的文件上传功能

    本节将深入探讨如何在JSP中实现一个限定后缀名的文件上传功能。 首先,我们需要了解JSP的基本原理。JSP是一种动态网页技术,它结合了HTML和Java代码,使得开发者可以在页面上嵌入Java逻辑。在文件上传场景下,我们...

    jsp实现文件上传功能

    总结来说,使用JSP实现文件上传功能涉及到前端交互设计、后端Servlet处理、文件解析与保存以及安全性控制等多个环节。虽然相比Struts等MVC框架,直接使用JSP可能会稍显复杂,但掌握这一过程有助于理解Web应用的核心...

    Struts+swfupload实现文件上传功能

    Struts和SwfUpload是两种在Web开发中用于构建强大功能的应用工具,它们结合使用可以实现高效的文件上传功能。在本文中,我们将深入探讨这两个组件以及如何将它们整合以实现文件上传。 首先,Struts是一个基于MVC...

    java多文件上传实现

    通过以上步骤,可以实现一个完整的Java多文件上传功能,包括使用Flash显示上传进度条,并将文件信息存储到MySQL数据库。在实际开发中,根据具体需求进行调整和优化,确保功能的稳定性和安全性。

    struts实现的文件上传下载功能

    总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。

    PHP设计经典文件上传类

    【PHP设计经典文件上传类】在项目开发中,文件上传是一项常见且重要的功能。为了提高开发效率,将文件上传的处理代码封装成一个类是非常实用的策略。这个类,我们称之为`FileUpload`,旨在简化复杂的文件上传操作,...

    文件上传功能的实现 (课程设计)

    在这个课程设计中,我们将深入探讨如何使用ASP(Active Server Pages)来实现文件上传功能,以及如何构建一个网络硬盘系统。 首先,让我们了解一下ASP。ASP是微软开发的一种服务器端脚本环境,用于创建动态交互式...

    Web 开发实现文件上传功能

    在Web开发中,实现文件上传功能是常见的需求,特别是在构建交互性强、用户参与度高的网站时。本篇文章将深入探讨如何在不同的Web框架下实现这一功能,并提供一个名为"smartUpload"的工具作为示例。 文件上传是允许...

    基于bootstrap.3的文件上传效果, 可拖拽上传、预览的HTML5文件上传插件.zip

    标题中的“基于Bootstrap.3的文件上传效果, 可拖拽上传、预览的HTML5文件上传插件.zip”指的是一个使用Bootstrap 3框架和HTML5技术实现的高级文件上传功能。这个插件允许用户通过拖放操作上传文件,并且在上传前可以...

    JavaWeb文件上传功能

    综上所述,JavaWeb文件上传功能涉及到前端交互设计、后端处理逻辑、文件存储策略以及安全性和性能等多个方面,开发过程中需要综合运用多种技术和最佳实践,以确保功能的完整性和安全性。在Spring MVC框架中,文件...

    C#实现了多文件上传功能

    本示例详细介绍了如何使用C#与ASP.NET技术实现多文件上传功能,包括前端界面的设计、动态添加文件输入框以及后端处理逻辑。这一功能的实现极大地简化了文件上传的过程,并提高了用户体验。开发者可以根据实际需求...

    多文件上传设计

    Uploadify提供了一系列配置选项和事件,可以帮助开发者轻松集成多文件上传功能。它的核心特性包括选择多个文件、自定义上传按钮样式、上传进度条显示、错误处理以及支持各种服务器端技术(如PHP、ASP.NET等)。 ...

    python web开发,基于flask的练手项目-文件上传下载的管理系统的设计与实现

    python web开发,基于flask的练手项目---文件上传下载的管理系统的设计与实现python web开发,基于flask的练手项目---文件上传下载的管理系统的设计与实现python web开发,基于flask的练手项目---文件上传下载的管理...

    文件上传和下载文件上传和下载文件上传和下载

    文件上传和下载是Web应用程序中的核心功能之一,无论是用户向服务器提交个人资料、分享文档,还是从服务器获取资源,如软件更新、电子书籍等,都离不开这一操作。在这个过程中,前端与后端的交互以及数据的安全传输...

    Java多线程设计模式上传文件

    本项目旨在利用Java的多线程机制和设计模式来实现高效的文件上传功能。下面将详细介绍这两个方面的知识点以及如何在上传文件中应用。 一、Java多线程 1. **线程创建方式**:Java提供了多种创建线程的方式,包括...

    PHP 简单实现文件上传、保存、下载的功能(云盘)

    在本项目中,"PHP 简单实现文件上传、保存、下载的功能(云盘)",我们主要关注的是如何利用PHP构建一个基本的云存储服务,让用户能够在自己的账户空间内进行文件的操作。以下是对涉及的技术点的详细解释: 1. **PHP*...

Global site tag (gtag.js) - Google Analytics