web安全之文件上传漏洞攻击与防范方法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


一、 文件上传漏洞与WebShell的关系

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。

文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。

这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。

1 Webshell简介

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。

WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员不容易发现入侵痕迹。攻击者可以将WebShell隐藏在正常文件中并修改文件时间增强隐蔽性,也可以采用一些函数对WebShell进行编码或者拼接以规避检测。除此之外,通过一句话木马的小马来提交功能更强大的大马可以更容易通过应用本身的检测。<?php eval($_POST[a]); ?>就是一个最常见最原始的小马,以此为基础也涌现了很多变种,如<script language="php">eval($_POST[a]);</script>等。

2 文件上传漏洞原理

大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过Web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在远程服务器上执行任意PHP脚本。

当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。

上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接自动运行;

上传文件是WebShell时,攻击者可通过这些网页后门执行命令并控制服务器;

上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击;

上传文件是恶意图片时,图片中可能包含了脚本,加载或者点击这些图片时脚本会悄无声息的执行;

上传文件是伪装成正常后缀的恶意脚本时,攻击者可借助本地文件包含漏洞(Local File Include)执行该文件。如将bad.php文件改名为bad.doc上传到服务器,再通过PHP的include,include_once,require,require_once等函数包含执行。

此处造成恶意文件上传的原因主要有三种:

文件上传时检查不严。没有进行文件格式检查。一些应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查。一些应用虽然在服务器端进行了黑名单检查,但是却可能忽略了大小写,如将.php改为.Php即可绕过检查;一些应用虽然在服务器端进行了白名单检查却忽略了%00截断符,如应用本来只允许上传jpg图片,那么可以构造文件名为xxx.php%00.jpg,其中%00为十六进制的0x00字符,.jpg骗过了应用的上传文件类型检测,但对于服务器来说,因为%00字符截断的关系,最终上传的文件变成了xxx.php。

文件上传后修改文件名时处理不当。一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。

使用第三方插件时引入。好多应用都引用了带有文件上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。如著名的博客平台WordPress就有丰富的插件,而这些插件中每年都会被挖掘出大量的文件上传漏洞。

3 文件上传攻击实例

前文已经提到造成文件上传漏洞的原因有多种,下面以其中的第二种为例,选取 LibrettoCMS文件上传漏洞(漏洞exploit-db编号为60560)详解整个漏洞的利用过程。

Libretto是一款使用PHP语言和MySQL语言开发的内容管理系统。LibrettoCMS 2.2.2版本允许未验证的用户上传文件,并且可以对已上传的文件进行后缀名修改。虽然系统限制用户只能上传doc和pdf格式的文件,但修改文件名时处理错误,导致用户可修改文件后缀名。攻击者可以将恶意文件后缀改为doc或者pdf,上传成功后再将后缀修改为php即可执行。

l 上传doc后缀的WebShell

访问该系统的文件管理页面/plugins/pgrfilemanager/PGRFileManager.php,上传一个正常的doc文件,发现可以上传成功。编写一个PHP语言的WebShell后门,也可以从网上下载已有的WebShell,并将WebShell文件的后缀修改为doc,此处将myshell.php后门修改为myshell.doc。

准备好WebShell以后访问PGRFileManager.php文件管理页面将myshell.doc上传到服务器,如图1所示,doc后缀的myshell已经成功上传。此时通过浏览器访问该doc格式的myshell是无法正常执行的。

 

图1 mybshell.doc成功上传

l 将WebShell后缀改为php

在文件管理页面右键点击mybshell.doc并选择rename进入修改文件名称页面,将mybshell.doc改为mybshell.php并点击Ok按钮提交修改结果(如图2所示)。此时myshell文件的后缀已被成功修改了php,受该应用编码实现影响文件管理页面已经无法读取myshell.php文件,但我们在系统服务器的文件上传目录里可以看见修改后的文件(如图3所示)。

 

图2 将mybshell.doc修改为mybshell.php

 

图3 服务器里myshell后缀已改为php

l 执行Webshell

此时服务器上传目录里的WebShell已经是php后缀,服务器环境已可以正常解析,通过浏览器直接访问该文件:http://192.168.20.174/vlun/Mylibretto/userfiles/myshell.php,输入WebShell中我们设置的密码即可登录到该WebShell页面(如图4所示)。从图中我们可以看到,仅通过该WebShell文件攻击者就可以在服务器上进行文件管理,数据库管理,执行系统命令,执行任意PHP代码。借助该WebShell,攻击者可以将其他WebShell文件放置到更深层的目录中,或者将PHP后门代码直接添加到系统中已有的很少用的php文件中以防止被系统管理员发现。

 

图4 成功访问WebShell后门

4 文件上传漏洞防御

首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。

防范文件上传漏洞常见的几种方法。

1、文件上传的目录设置为不可执行

只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。

2、判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

3、使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

4、单独设置文件服务器的域名

由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。

 

l 系统开发阶段的防御

系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统。在系统开发阶段应充分考虑系统的安全性。对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。

l 系统运行阶段的防御

系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。

l 安全设备的防御

文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。目前华三通信公司发布的SecPath IPS系列产品经过长期的积累,不但可以基于行为对网络中大量文件上传漏洞的利用进行检测,同时还能基于内容对恶意文件进行识别。

二、 结束语

对攻击者来说,文件上传漏洞一直都是获取服务器shell的重要途径。对系统维护人员来说,文件上传漏洞的巨大危害也无须赘述,积极学习,深入了解漏洞的相关知识可以更从容的面对这类攻击

 

转载自:http://www.h3c.com.cn/About_H3C/Company_Publication/IP_Lh/2014/05/Home/Catalog/201408/839582_30008_0.htm

 

 

转载于:https://my.oschina.net/u/3477605/blog/3057669

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rabbit and Grass【博弈】

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4728 Accepted Submission(s): 3592 Problem Description 大学时光是浪漫的&#xff0c;女生是浪漫的&#xff0c;圣诞更是浪漫的&#xff…

苹果可弯曲屏幕新专利获准,折叠iPhone最快2020年现身?

当三星Galaxy Fold、华为Mate X等折叠手机陆续问世时&#xff0c;所有果粉都想问一个问题折叠iPhone在哪里&#xff1f;就在最近有报导指出&#xff0c;苹果获得一项关于折叠屏幕的新专利。新专利出炉&#xff0c;但折叠iPhone还要再等等。本周二&#xff0c;美国专利与商标局授…

Brave Game【博弈】

Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14813 Accepted Submission(s): 10086 Problem Description 十年前读大学的时候&#xff0c;中国每年都要从国外引进一些电影大片&#xff0c;其中…

Google File System 学习笔记

GFS翻译&#xff1a;https://www.cnblogs.com/cxxjohnson/p/4984309.html 一、GFS架构&#xff1a; 二、保存文件的方式 1、保存小文件&#xff1a;磁盘中分块&#xff0c;每个block大小为1024Byte,每个文件的索引由块号偏置组成 2、保存大文件&#xff1a;把block换成chunk,每…

探讨奇技淫巧

2019独角兽企业重金招聘Python工程师标准>>> 探讨奇技淫巧 起源 在工程实践中&#xff0c;我们常常会遇到一些奇技淫巧。所谓奇技淫巧&#xff0c;就是官方在设计或者实践中并未想象出的代码风格或者使用场景。其实也就是类似于 react 的 hoc,本来源自于社区&#x…

悼念512汶川大地震遇难同胞——选拔志愿者【博奕】

悼念512汶川大地震遇难同胞——选拔志愿者 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11716 Accepted Submission(s): 7537 Problem Description 对于四川同胞遭受的灾难&#xff0c;全国人民纷纷伸出援…

mall整合SpringBoot+MyBatis搭建基本骨架

本文主要讲解mall整合SpringBootMyBatis搭建基本骨架&#xff0c;以商品品牌为例实现基本的CRUD操作及通过PageHelper实现分页查询。 mysql数据库环境搭建 下载并安装mysql5.7版本&#xff0c;下载地址&#xff1a;dev.mysql.com/downloads/i…设置数据库帐号密码&#xff1a;r…

Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)...

摘要&#xff1a; Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse、render、redirect) 一、Web框架概述&#xff1a; Python三大主流Web框架&#xff1a; Django&#xff1a;大而全&#xff0c;自带了很多功能模块&#xff0c;类似于航空母舰&am…

Bone Collector【01背包】

F - Bone Collector HDU - 2602 Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag wit…

Gamma阶段第八次scrum meeting

每日任务内容 队员昨日完成任务明日要完成的任务张圆宁#91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91&#xff08;持续完成&#xff09;#91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91牛宇航#86 重置密码的后端逻辑https:/…

【动态规划】多重背包

问题 Q: 【动态规划】多重背包 时间限制: 1 Sec 内存限制: 64 MB 提交: 112 解决: 49 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼&#xff1a;“魔法石矿里每种魔法石的数量看起来是足够多&#xff0c;但其实每种魔法石的数量是有限的。” 李旭琳&#xff1a;…

【动态规划】完全背包问题

问题 O: 【动态规划】完全背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 151 解决: 71 [提交] [状态] [讨论版] [命题人:admin] 题目描述 话说张琪曼和李旭琳又发现了一处魔法石矿&#xff08;运气怎么这么好&#xff1f;各种嫉妒羡慕恨啊&#xff09;&#xff0c;她们有…

springboot超级详细的日志配置(基于logback)

前言 java web 下有好几种日志框架&#xff0c;比如&#xff1a;logback&#xff0c;log4j&#xff0c;log4j2&#xff08;slj4f 并不是一种日志框架&#xff0c;它相当于定义了规范&#xff0c;实现了这个规范的日志框架就能够用 slj4f 调用&#xff09;。其中性能最高的应该使…

【动态规划】简单背包问题II

问题 J: 【动态规划】简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB 提交: 127 解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼&#xff1a;“为什么背包一定要完全装满呢&#xff1f;尽可能多装不就行了吗&#xff1f;” 李旭琳&#xff1a;“你说得…

Vue组件通信

前言 Vue组件之间的通信 其实是一种非常常见的场景 不管是业务逻辑还是前段面试中都是非常频繁出现的 这篇文章将会逐一讲解各个传值的方式 不过在此之前 先来总结一下各个传值方式吧 1.父组件向子组件传值 > props2.子组件向父组件传值 > $emit3.平级组件传值 > 总线…

【动态规划】0/1背包问题

问题 H: 【动态规划】0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭琳有一个最多能用m公斤的背包&#xff0c;有n块魔法石&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;…&a…

猫哥教你写爬虫 005--数据类型转换-小作业

小作业 程序员的一人饮酒醉 请运用所给变量&#xff0c;使用**str()**函数打印两句话。 第一句话&#xff1a;1人我编程累, 碎掉的节操满地堆 第二句话&#xff1a;2眼是bug相随, 我只求今日能早归 number1 1 number2 2 unit1 人 unit2 眼 line1 我编程累 line2 是bug相…

索引失效

转载于:https://blog.51cto.com/11009785/2406488

棋盘问题【深搜】

棋盘问题 POJ - 1321 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放k个棋子的所有可行…

python isinstance()

isinstanceisinstance(object, classinfo) 判断实例是否是这个类或者object是变量 classinfo 是类型(tuple,dict,int,float) 判断变量是否是这个类型 举例&#xff1a; class objA: pass A objA() B a,v C a string print isinstance(A, objA) #注意该用法 print isinst…