`
aroundworld2008
  • 浏览: 45931 次
  • 性别: 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()一类的函数来生成,相信程序员们这点意识还是有的,不再赘述了。
分享到:
评论

相关推荐

    基于Python+Django简单实现文件上传下载功能源码.zip

    基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于...

    基于SpringBoot的文件上传系统,前后端分离,单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传

    采用前后端分离的方式进行开发,实现了几种常用的文件上传功能。 前端采用 vue.js + plupload + element-ui 实现了文件在浏览器端的发送, 后端采用 spring boot + spring + spring mvc + mybatis 实现了文件在服务器...

    JSP 实现文件上传功能

    本代码主要应用的是jsp技术,而实现的文件上传功能,这个功能也是比较常见的,也是比较常用的,更是在网络中比较流行的。 技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是...

    文件批量上传功能

    在公司做的一个文件批量上传工具,用swfupload组件+ flash ,嵌入javascript ,在eclipse调试通过,正确运行,由于一些隐私原因,需求说明书,功能设计规格书就不上传了,内涵帮助文档,供参考

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

    实现文件上传功能,实现网络硬盘的设计与实现

    基于Spring Boot的文件上传下载功能模块的设计与实现.zip

    加上做学校用得系统,不断地调研,分析需求,所以做的比较慢,一直上线测试,然后就调式改BUG,最后系统能基本实现学校的要求,文件上传下载这个模块功能也是很好地实现,我将系统中的文件上传和下载的功能模块抽...

    VB实现FTP上传文件功能

    可以实现文件上传功能,并能检索到FTP目前的目录

    多文件上传和展示

    bootstrap-fileinput-master多文件上传,多文件预览,网页的代码地址为https://mp.csdn.net/postedit/84098479

    PHP设计经典文件上传类

    文件上传是项目开发常见的功能,为了在每次开发中降低开发难度,节省时间,我们把处理文件上传的代码封装入一个类中,使得使用简单的几条代码就实现复杂的文件上传。

    MediaWiki使用MSUpload扩展上传文件功能

    而且一次只能有一个文件上传。设计的时候估计是希望一个文件可以被多个页面所引用。但实际情况通常不会这样。 针对以上问题,查询并测试了很多方法,网上的介绍五花八门,很多还过时了。把我的经验和大家分享一下,...

    swfupload多文件上传组件

    * 在文件上传的同时能够发送额外的POST数据 * 针对每一个文件上传发送POST/GET数据 * 更直观的事件回调 * 动态修改实例设置 * 接收服务端返回的数据 * 非取消形式的停止文件上传 * 自定义上传的顺序 * 支持...

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

    PHP设计 云网盘,用户注册时会自动分配一定的云空间,在云盘给该用户分配的空间内实现文件向服务器上传,下载,删除,查看等功能,包含PHP、js、css、html、md5加密、mysql等技术,

    基于Springboot2.x的文件上传下载管理系统设计源码

    本项目是一个基于Springboot2.x的文件上传...系统设计旨在为用户提供一个高效、便捷的文件上传下载服务,支持大文件分片上传、断点续传和秒传功能,同时提供了一个美观的前端页面,以满足用户在文件管理方面的需求。

    jsp的文件上传下载模块

    jsp的文件上传下载功能

    Axure实现文件上传效果

    效果实现教程地址:https://blog.csdn.net/qq_27884377/article/details/88718048

    基于Vue和Java的断点续传与大文件上传系统设计源码

    本项目是一个基于Vue和Java的断点续传与大文件上传系统设计源码,共包含563个文件,其中包括258个Java文件、82个SVG文件等。系统采用了Vue-uploader和若依框架,为用户提供了一个便捷的文件上传解决方案。系统支持多...

    基于Java的FastDFS大文件上传与断点续传设计源码

    本源码项目是基于Java的FastDFS大文件上传与断点续传设计,包含36个文件,主要使用Java、JavaScript和CSS编程语言。该项目旨在实现h5与fastdfs之间的高性能断点续传、秒传、大文件上传以及使用redis文件锁。系统提供...

    SWFUpload大文件文件上传c#源码(整合flash)

    SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 SWFUpload的主要特点  * 可以同时上传多个...

    文件上传、文件下载时序图(使用Visio专业绘图软件专业绘制).rar

    该资源中包含两个“时序图”...这两个时序图都很详细,是针对代码进行绘制的,可以用于计算机毕业设计的论文中对于“系统详细设计”部分中时序图,总之是很好的一个资源!建议需要的朋友下载学习使用,仅限学习使用哈!

    WLONG3D全功能无组件文件上传系统

    WLONG3D全功能无组件文件上传系统wlup3.4使用说明: 新版本的功能更新: 1、对操作版面作出全面调整,使功能更贴尽用户; 2、后台管理中增加了设置管理员、管理系统用户、管理存储文档、管理上传文件等功能,使...

Global site tag (gtag.js) - Google Analytics