之前在学习文件上传漏洞时,只是粗略的了解了一下并没有详细深入去思考问题,这篇博客是自己最近对文件上传漏洞的简单总结和整理,方便自己以后查看,因为文笔较差、技术比较菜,内容引用了多位大佬的文章,外加时间跨度有点长,部分内容有可能没有将大佬原文博客附加,所有希望大佬多多包涵告知,好及时添加;如果内容有错误的地方,还请麻烦指出,万分感谢!
什么是文件上传漏洞?如果对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 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,jHtmlTomcat添加可解析后缀名:
路径: apache-tomcat-x.x.xconfweb.xml
文件: web.xml
修改位置: *.*
jsp *.jsp *.jspxApache添加可解析后缀名:
路径: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.phpa.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表示返回数据;参考
