首页 >> 知识 >> 文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案

文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案

文件上传漏洞简单总结+白名单+黑名单+内容、头+解析漏洞/修补方案 问题什么是文件上传漏洞?危害?防御措施?文件上传(验证/绕过)措施?前端js类绕过? 后端黑名单绕过特殊解析后缀.htaccess解析大小写绕过点绕过空格绕过::$DATA绕过配合解析漏洞(*待补充)双后缀名绕过 白名单绕过MIME绕过%00截断0x00截断0x0a截断 内容及其他绕过?文件头检测二次渲染条件竞争突破getimagesize突破exif_imagetype 漏洞/修补*解析漏洞IIS 6.0/7.XIIS6.0目录解析IIS6.0文件解析IIS6.0默认解析IIS7.0/7.5 PHP FastCGI解析 ApacheApache后缀名解析 NginxNginx PHP CGI解析

问题

之前在学习文件上传漏洞时,只是粗略的了解了一下并没有详细深入去思考问题,这篇博客是自己最近对文件上传漏洞的简单总结和整理,方便自己以后查看,因为文笔较差、技术比较菜,内容引用了多位大佬的文章,外加时间跨度有点长,部分内容有可能没有将大佬原文博客附加,所有希望大佬多多包涵告知,好及时添加;如果内容有错误的地方,还请麻烦指出,万分感谢!

什么是文件上传漏洞?

如果对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。

所以一般需注意:

在开发网站及应用程序过程中,需严格限制和校验上传的文件,禁止上传恶意代码的文件 限制相关目录的执行权限,防范 webshell 攻击

危害? 上传网站后门文件(获取webshell) 防御措施? 上传文件的存储位置与服务器分离;上传的文件重新修改文件名、文件后缀名;(如何确定后缀名防止修改:前端传递,后端再校验)文件上传的上传保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载; 文件上传(验证/绕过)措施? 前端 js类绕过? 页面直接修改js上传文件方法(添加类型等);抓包改包,将上传的文件后缀进行修改;(例如:a.jsp.jpg ——抓包修改为——a.jsp)复制页面,重新构建新页面,获取方法,并修改; 后端 黑名单绕过

Web系统可能会采用黑名单的方式进行过滤。而过滤的方式存在一定的缺陷,比如存在过滤的黑名单不全,未考虑大小写,以及要上传文件的名称存在敏感字符。

基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。

使用黑名单过滤方式,肯定会存在缺陷;【对上传文件名称进行敏感字符清除。】

特殊解析后缀

很多语言都存在,有多个可以解析后缀。当目标站点采用黑名单时,往往包含不全面;

例如:

语言默认(服务器)可解析后缀盲猜绕过可解析后缀asp.net【IIS】asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cErphp.php .html .htm【apache】php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtmljsp*.jsp,*.jspx【tomcat】jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

Tomcat添加可解析后缀名:

路径: apache-tomcat-x.x.xconfweb.xml

文件: web.xml

修改位置: *.*

jsp *.jsp *.jspx

Apache添加可解析后缀名:

路径:Apache24confhttpd.conf

文件:httpd.conf

修改位置:AddType application/x-httpd-php .php .html .htm

AddType application/x-httpd-php .php .html .htm .htaccess解析

什么是.htaccess?

前提条件:Apache开启.htaccess文件功能

开启方式:

路径:Apache24confhttpd.conf

文件:httpd.conf

位置1:如下代码↓

Options Indexes FollowSymLinks AllowOverride None (将None改为ALL) Require all granted

位置2: 去掉注释

#LoadModule rewrite_module modules/mod_rewrite.so

实际操作:

web站点架构为:php+apache , 保证文件上传到本地 , apache开启对.htaccess支持;

黑名单没有过滤.htaccess;

编辑.htaccess文件,写入

//1.这将把目录下的shell.jpg的文件当做可执行的php脚本进行解析并执行。[优先] SetHandler application/x-httpd-php //2.上传后缀为.aaa的文件,让其做为php类型文件进行解析AddType application/x-httpd-php .aaa

上传一句话木马并以.jpg结尾, 写入

菜刀或蚁剑连接,完成!

参考:

参考连接-文章 大小写绕过

背景原因:

后缀名黑名单过滤不全面导致!

虽然设置了黑名单对常见的后缀进行过滤,但并未对后缀名大小写进行统一。可以利用大小写进行绕过。例如:.phP

示例:

代码只对后缀名为.php的文件进行了拦截,并未对.pHp后缀名的文件拦截上传后缀名为.pHp的文件 点绕过

背景原因:(windows特性)

Windows 系统下,文件后缀名最后一个点会被自动去除。

Linux 系统下,文件后缀名最后一个点不会被自动去除。

利用 BurpSuite 工具截断 HTTP 请求,上传文件后缀名加 . 绕过上传。

使用条件:

只能在Windows系统下方能生效;

利用示例:

demo.php.【demo(点)php(点)】 空格绕过

背景原因:(windows特性)

Windows系统下,对于文件名中空格【demo.php(空格)】会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单。解释: 文件上传功能过滤不完善,没有考虑到空格的情况,将文件【demo.php(空格)】认为是以(空格)结尾的特殊文件,允许上传,当文件成功上传到windows系统下时,因为Windows系统特性会被作为空处理,也就是删除文件最后的空格,结果为【demo.php】

利用示例:

通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加空格。点绕过和空格绕过结合示例如下:↓ 例如: a.php[空格](点)[空格] a.php . a.php(点)[空格](点)Windows下:a.php

a.php(点)+空格+(点)

deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为1.php. 利用Windows自动去除最后一个点,导致成功上传1.php;

::$DATA绕过

背景原因:(windows特性)

在window系统下,如果上传的文件名为a.php::$DATA,它会在服务器上生成一个a.php的文件,其中内容和所上传内容相同,并被解析。

例如:phpinfo.php::$DATAWindows会自动去掉末尾的::$DATA变成phpinfo.php

利用示例:

通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加::$DATA。

a.php::$DATA

特别说明:

在windows下,无法直接测试::$DATA,因为windows不允许后缀名中存在特殊字符;

配合解析漏洞(*待补充) 双后缀名绕过

背景原因:

文件上传过滤代码,会将文件名称进行敏感字符清除。

文件上传过滤代码,后缀名黑名单过滤不全面导致!

例如:如果上传的代码后缀名为.php,那么就将后缀名舍弃;如:a.php——>a;

利用示例:

对要上传的文件添加重复后缀名,如:a.php——>a.pphphp过滤掉php后,会重新拼接为新的php

防御措施:

使用递归循环过滤,不使用一次过滤 白名单绕过

基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。

MIME绕过

MIME绕过,又叫HTTP请求头中的Content-Type属性绕过;【Response 、Request Headers都存在】

可能很多人不知道什么是MIME?不过没关系,那你一定听说过文件内容类型或者说通过抓包你一定听说过 Content-Type: text/html 这种类似的,其实,这就是MIME。下面再给大家简单说说吧!

MIME((Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式每个MIME类型由两部分组成,前面是数据的大类别,例如声音 audio、图象 Image等,后面定义具体的种类。

什么是Content-Type

要知道什么是Content-Type,首先要了解什么是Internet Media Type。Internet Media Type即互联网媒体类型,也叫做MIME类型,使用两部分标识符来确定一个类型。在HTTP协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息,意思就是说,Content-Type是Internet Media Type在HTTP协议中的别称。

Content-Type的格式

type/subtype(;parameter)? type

上面是Content-Type的格式,可以拆解为三个部分,分别是主类型(type)、子类型(subtype)和参数(parameter)。

主类型(type)

主类型可以是任意的字符串,比如text。如果是*号则代表所有类型。

/子类型(subtype)

子类型可以是任意的字符串,比如html。如果是*号则代表所有类型。

;参数(parameter)

参数是可选的,可以在Content-Type中加入一些特殊的参数,比如Accept请求头的参数,常见的有用于设置字符编码的charset参数。

Content-Type: */*;q=0.8, text/html;charset:utf-8;

Content-Type中常见的媒体格式类型:

以text开头的媒体格式类型:

text/html: HTML格式。

text/plain:纯文本格式。

text/xml: XML格式。

以image开头的媒体格式类型:

image/gif:gif图片格式。

image/jpeg:jpg图片格式。

image/png:png图片格式。

以application开头的媒体格式类型:

application/xhtml+xml:XHTML格式。

application/xml: XML数据格式。

application/atom+xml:Atom XML聚合格式 。

application/json: JSON数据格式。

application/pdf:pdf格式 。

application/msword: Word文档格式。

application/octet-stream: 二进制流数据(如常见的文件下载)。

application/x-www-form-urlencoded: 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。

另外还有一种常见的媒体格式是上传文件之时使用的:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。

以上就是草莓视频在线观看APP在日常的开发中,经常会用到的若干Content-Type的内容格式。

MIME拦截代码样例:

@Controller @RequestMapping(value = "/users", method = RequestMethod.POST, consumes="image/*") @ResponseBodypublic List addUser(@RequestBody User userl) { return List users;}//consumes:指定处理请求的提交内容类型(Content-Type),例如application/json、text/html;等。如果不是指定的类型不响应;//上面这个方法【仅处理】请求Content-Type为【image/*】类型的请求。

MIME利用示例:

通过抓包的形式,修改Content-Type类型,将类型指定为:image/*Content-Type类型位于HTTP Request 中,要以网站为中心,request表示获取数据,response表示返回数据;

参考

网站地图