owasp文件上传漏洞简析

0x01:

文件上传漏洞起因于,上传程序没有对上传文件格式进行正确判断,导致可执行程序上传到网站目录。

常见的验证上传文件有两种:1.js本地验证,通过js获取上传文件后缀名,并和白名单比较,匹配则上传成功。由于js代码是本地验证,存在绕过风险(去除js代码,构造表单数据,直接绕过)。

2.后端程序验证,通过post数据到file_upload()函数,$_FILES[‘file‘][‘type‘]判断上传程序后缀名.

function file_upload(){

  $file_name = $_FILES[‘file‘][‘name‘];

  $file_type = $_FILES[‘file‘][‘type‘];

  $file_tmp = $_FILES[‘file‘][‘tmp_name‘]; //临时文件存放位置

  //判断文件后缀

 问题1. if($file_type === ‘image/jpg‘ || $file_type === ‘image/jpeg‘){ //jpg和jpeg类型,详见wiki  

 问题2.     $file_new_type = ‘.jpg‘;

    }

问题4.      $file_name = substr(md5(time()),0,10);

   move_uploaded_file($file_tmp,$file_name.$file_type) ;

}

关于PHP处理文件流,详见w3chool php file

问题1.$file_type获取文件后缀名,正常上传jpg时,$file_type =‘image/jpg‘ 文件格式,上传php文件时,$file_type =‘application/octet-stream‘(任意二进制流)。这里的image/jpg,application/octet-stream属于MIME(Multipurpose Internet Mail Extensions),在浏览器里上传抓包时,有个content-type:image/jpg,值得就是header里MIME类型(问题3).

通过获取$file_type里的值,和白名单(image/jpg,image/jpeg)比较,如果值相同,说明后缀名是jpg(不考虑问题3)。

问题3(MIME头欺骗).既然获取MIME里的文件类型和白名单比较,通过修改数据包中Content-type:image/jpg(修改MIME类型),上传文件。

上传a.php,burpsuite截断数据包,修改content-type:application/octet-stream => image/jpg,然后转发。这时,$file_type=‘image/jpg‘,本来上传的php文件,获取的文件类型为二进制流,现在修改MIME后变成image/jpg。如果直接用$file_type作为文件的后缀名,就会造成a.php文件直接存储到网站目录中,造成getshell。

问题2.获取MIME类型为image/jpg,并不代表无法解决MIME欺骗问题,这里采用文件重命名,$file_type = jpg,那么$file_new_type = ‘.jpg‘;通过拼接文件名,即使上传的php文件,最后存储到网站目录里的也是jpg文件类型。

0x02:

文件上传漏洞产生来源于过滤不严,很多人采用strpos($str,‘.‘)这种方式截取文件后缀名,然后就出现了xx.php;.jpg之类的畸形文件名(问题4)。最简单防护方式就是直接重命名文件名(全部),可能有人觉得问题2里,写多个判断语句会很麻烦,代码能安全一点,多写点不费事。

swicth($file_type){

  case ‘image/jpg‘:

  $file_new_type =‘.jpg‘;break;

  case ‘image/jpeg‘:

  $file_new_type =‘.jpeg‘;break;

  ....

  default:

  $file_new_type = false;  

}

这里获取文件后缀名之后,重命名文件,有人担心,含有一句话代码的图片存储到网站里,不用考虑上传的是什么文件,当程序判断文件属于白名单里的后缀时,直接使用白名单里后缀写法,这样即使这个文件含有一句话,但服务器会把它当作图片处理,并不会执行里的代码(问题5)

文件名重命名一般采用:upload/时间/时间种子的MD5.后缀名

具体代码:

$file_save_directory = ‘upload‘.date(‘Y-m-d‘,time()); //命名存储文件夹名

if(!file_exists($file_save_directory)){

  mkdir($file_save_directory); //如果不存在 创建文件夹

}

$file_new_name = substr(md5(time()),0,10).$file_new_type; //重命名文件名字

$result = move_uploaded_file($file_tmp,$file_save_directory.‘/‘.$file_new_name);

if($result){echo "upload success"}

0x03

php上传文件漏洞已经有很多年历史了,大牛前几天发出了个CVE-2006-7243的php空字符处理问题(webshell.cc),由于php处理a.php\x00.jpg时,会保存成a.php文件,导致畸形文件名的php文件能上传成功,有兴趣的可以搭环境测试下。

文件上传的同时伴随着文件名解析漏洞。IIS/Apache/Nginx,对畸形文件名处理错误,导致a.php;jpg/a.php .jpg(0x00截断)上传成功并解析

参考:wooyun php安全编码

 http://zone.wooyun.org/content/1910 php上传缺陷

时间: 2024-10-21 11:42:08

owasp文件上传漏洞简析的相关文章

OWASP Top 10之文件上传漏洞简析(二)

0x01. 在问题一(详见上文)中,获取文件后缀名$file_type = $_FIELS['file']['type'],通过和白名单比较,假如相同,则取上传文件的后缀名.上文说过,MIME头欺骗问题(这里不考虑重命名文件名问题),如果上传数据包修改Content-type的类型,$file_type就获取修改后文件类型. 如:上传1.php=>burpsuite拦截修改数据包中的Content-Type为:image/jpg=>$file_type="image/jpg"

Web应用安全之文件上传漏洞详解

什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这样的攻击.文件上传为什么会是漏洞呢?文件上传本身是没有问题的,问题是文件上传后看服务器怎么来处理,怎么来解析这个文件.如果说服务器处理的模式不够安全,那么就会导致严重的后果,也就是上传了恶意的可执行文件以后,服务器端对此文件进行执行. 文件上传后导致的安全问题 上传的文件是web脚本语言,服务器的w

文件上传漏洞攻击与防御

前言 从一年前开始学习web安全以来,一直都是在吸收零碎的知识,不断地看书与一些前辈的文章,中间也经过一些实践,学习相关的工具,但是却没真真正正地在脑中形成一套完整的体系.从不久前就想着要写一些博客,趁着这个机会,便好好梳理一下所学的知识,只是这些文章所写大部分内容也是搬运前辈的文章,鲜有自己所想所悟. 关于文件上传漏洞,百度一下便有许多文章出来,在这里我也稍稍做整理. 0x00 文件上传漏洞所需满足的条件 一是文件可上传(感觉这一句是废话).二是上传文件路径可知,如果路径不可知就没法访问,亦无

《白帽子讲WEB安全》学习笔记之第8章 文件上传漏洞

第8章 文件上传漏洞 8.1 文件上传漏洞概述 文件上传漏洞是指用户上传一个可执行的脚本文件,并通过此脚本文件活动执行服务器端的能力. 原理:由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件. 文件上传漏洞安全问题: q  上传文件是WEB脚本文件,服务器的WEB服务器解释并执行了用户上传的脚本,导致代码执行: q  上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行

PHP漏洞全解(九)-文件上传漏洞

本文主要介绍针对PHP网站文件上传漏洞.由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP解释器,就可以在远程服务器上执行任意PHP脚本,即文件上传漏洞. 一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件. 下面是一个简单的文件上传表单 <form action="upload.php" method="post" encty

文件上传漏洞原理与实例测试

0x00 什么是文件上传 为了让用户将文件上传到网站,就像是给危机服务器的恶意用户打开了另一扇门.即便如此,在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率.企业支持门户,给用户各企业员工有效地共享文件.允许用户上传图片,视频,头像和许多其他类型的文件.向用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的. 0x01 为什么文件上传存在漏洞 上传文件的时候,如果服务器脚本语言

【原创】JEECMS v6~v7任意文件上传漏洞(1)

文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定.安全.高效.跨平台等多方面的优点:采用SpringMVC3+Spring3+Hibernate3+Freemarker主流技术架构.广泛应用于政府(部委和省级政府部门.市.县.乡及委办局).教育科研(大.中.小学及各地方教育局).电信运营商.金融(证券.保险及银行).企业(矿业.煤炭.旅游.石油集

文件上传漏洞原理以及防范

1. 什么是文件上传漏洞 程序员由于没有对上传的文件进行严格限定,导致黑客可以通过工具上传其他格式的程序文件(比如:webshell),这样黑客就会拿到一个可执行环境,在服务器上搞破坏. 一个常见的例子,很多网站存在上传图片的功能,如果不对上传图片的扩展名进行检测.过滤就会造成上传漏洞. 2. 如何防范上传漏洞 步骤:前端JS代码限定--->后台代码检测--->取消文件目录执行脚本的权限. 以如何防范图片上传漏洞做个过程分析: 新建一个解决方案: 2.1 第一步前端用JavaScript对上传

PHP任意文件上传漏洞CVE-2015-2348浅析

昨晚安全新闻爆出一个“PHP任意文件上传漏洞”,CVE编号为:CVE-2015-2348. 当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多版本!如果漏洞属实,看来今晚又要通宵打补丁了啊. 不过经过简单分析后,发现漏洞的利用条件相当苛刻(很多人好奇到底有多苛刻),楼主简单记录自己的分析过程和大家分享一下,如有不当,请多多指正. 一.漏洞概述 漏洞报告者说php的上传函数 move_uploaded_file的目的路径参数可以使用空字符截