关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

如何防范PHP文件上传漏洞?

发布时间:2021-03-19 14:17:01

一、什么叫文件上传漏洞


文件上传是WEB开发中一项基本的功能,是指将本地文档、视频、音频、图片等文件上传到服务器上,以便自己或其他用户下载或浏览的过程,如论坛发图片、发微信朋友圈、发微博等都用到了上传功能。


文件上传漏洞是指程序员在WEB应用中利用客户端上传功能控制、检测、处理的不足,通过向WEB服务器上传特定的可执行文件(如木马、Web⁃Shell、病毒、恶意脚本等)以达到获取关键数据操控主机的目的。


文件上传漏洞的危害


WEB应用开发人员在实现文件上传功能过程中,如果没有对文件格式、后缀严格校验,WEB中存在文件上传漏洞,攻击者可能利用此漏洞直接上传病毒、木马、钓鱼图片、包含了脚本的图片、恶意脚本文件、WebShell等,再通过访问这些恶意的脚本中的恶意代码,最终可能会导致用户信息泄露,被钓鱼、欺诈,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限,最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统,在服务器系统中为所欲为。

二、文件上传漏洞检测技术分析


目前,针对文件上传漏洞WEB开发和服务,管理人员也加入了文件上传检测机制,大致有客户端脚本检测、服务器端文件扩展名检测、服务器端内容检测、服务端Content-Type类型检测、服务端path参数检测等。


1、客户端脚本检测


这类检测通常是在上传页面里添加特定的检测上传文件扩展名的代码,通过判断扩展名是否合法,从客户端检测控制上传文件的安全性。但对于这种检测方法,专业的攻击者可以通过将需要上传的恶意代码文件类型改为允许上传的类型,很轻松地躲过文件上传的检测。例如:将hack.php改为hack.jpg上传,配置BurpSuite代理进行抓包,然后再将文件名hack.jpg改为hack.php。


2、服务器端文件扩展名检测


在服务器端对文件扩展名进行检测就是设置黑名单或白名单[6,7],即黑名单是禁止特定扩展名的文件上传,白名单是仅允许指定扩展名的文件上传。服务器端检测包括了Content-Type检测、黑名单检测、白名单检测等。


Content-Type检测是在用户提交上传文件时验证是否为要求的文件类型,如果是允许上传,如果不是则禁止上传。这种检测方法可以通过抓包来修改Http开头的Content-Type轻松绕过。


服务器端的黑名单检测往往是把常见的危险文件的扩展名放在一个文件中(如exe\com\bat\dll\js\vbs\php\html\asp\cer等等),当客户端上传文件时,对上传文件的扩展名进行过滤,如果上传的文件扩展名在黑名单中则不允许上传。这种检测方式看似可以有效地防止危险文件上传,但限制不够全面(如IIS默认支持解析asp\cdx\asa\cer等文件类型),攻击者通常还可以利用扩展名的大小写(如上传.Php)、特殊文件名(如“.exe空格”)、名单列表绕过(如上传黑名单中不存在的扩展名文件)等方式完成攻击。


白名单检测是在服务器端指定允许上传文件的扩展名,如果上传文件的扩展名在指定的范围内,允许上传,否则禁止上传。显然,白名单检测要比黑名单过滤安全性高。在白名单检测中,攻击者可以使用%00、0x00、0x0a等截断绕过白名单检测(如上传photo.jpg,BurpSuite抓包,将文件名改为photo.php%00.jpg,选中%00,进行urldecode),或使用双写扩展名绕过白名单检测(如photo.php.jpg)。


3、服务器端文件内容检测


服务器端文件内容检测是指当服务器接收到用户上传文件后,通过检测文件函数、文件相关信息、文件渲染等方式验证文件的合法性,如果合法则允许上传,否则禁止上传[8,9]。针对文件内容检测,攻击者可以通过制作的图片马进行绕过(burp⁃suit改包或者copy1.jpg/b+2.php/a3.jpg生成图片马或者直接用别人做好的图片马)。


4、服务器解析漏洞


(1)IIS解析漏洞


IIS7.0后对之前版本的漏洞进行了修复,但在IIS7.0后的服务中开启Fast-CGI状态,服务器在解析URL地址时,会将xxx.jpg/xxx.php解析为PHP文件。这也会使攻击者用此绕过服务器的检测。同时,在Windows操作系统中,文件名不能以空格或“.”开头,也不能以空格或“.”结尾。当把一个文件命名为以空格或“.”开头或结尾时,会自动地去掉开头和结尾处的空格和“.”。利用此特性,也可能造成“文件解析漏洞”。


(2)Apache解析漏洞


Apache解析文件的规则是从右至左开始判断解析,如果遇到不可识别文件后缀时,Apache解析就再往左判断。例如:hack.php.cde.abc,“.cde”和“.abc”这两种后缀是apache在解析时不可识别的,apache在解析时就会把hack.php.cde.abc解析成为hack.php。


Apache解析漏洞(CVE-2017-15715),在Apache2.4.0到2.4.29版本配置文件中的php解析表达式存在可以匹配字符串结尾的换行符漏洞,攻击者可以利用"%0A"绕过上传黑名单上传文件。


(3)nginx解析漏洞

在nginx8.03以下的版本也存在和IIS7一样的漏洞,Nginx默认也是以CGI的方式支持PHP解析的,服务器在解析URL地址时,会将xxx.jpg/xxx.php解析为PHP文件。还有一种方法是上传一个名字为hello.jpg,文件内容为:<?php fputs(fopen('hack.php','w'),'<?php eval($_POST[cmd])?>');?>。然后访问hello.jpg/.php,在这个目录下就会生成一个木马文件hack.php。


三、文件上传漏洞防御策略


针对以上可能出现的文件上传漏洞,应该从WEB应用的开发、WEB容器、服务平台的配置管理、WEB服务器运维、网络安全设备运维等多方面打造立体式的文件上传漏洞防御体系,如图1所示。

PHP文件上传漏洞防范策略


1、WEB应用开发阶段防御

WEB应用开发过程中虽然在客户端对上传文件进行JS检测可以被专业的攻击者很容易突破,但对一般的攻击者而言,还是可以对基础性的试探起到一定的防御效果。在服务器端对文件类型的检查可以使用MIMEType、后缀检查等多种方式结合,在检查过程中强烈推荐使用白名单方式进行过滤,黑名单的方式已经无数次被证明是不可靠的。同时还需对%00截断符、对HTTP包头的Content-Type和上传文件的大小进行检查。


此外,对于图片的处理,可以使用resize函数或压缩函数对图片进行预处理,在处理图片的过程中破坏图片中可能包含的恶意代码。在服务器接收文件时,使用随机数改写文件名和文件路径。攻击者要么执行上传文件中的代码,首先他要访问到这个文件,通过使用随机数改变上传后的文件名和路径,会导致攻击者找不到上传的文件,而无法进行攻击。


2、WEB服务器端防御


在WEB服务器端文件上传的目录应设置为不可执行。通过对WEB容器设置不可执行权限,即使攻击者上传了含有恶意的脚本文件,也会因为不能解析执行而无法发动攻击。在WEB服务器端为文件服务器单独设置域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题都将得到解决。在服务器端增加安全设备WAF。WAF是专门的WEB应用安全设备,可以对WEB应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,通过对漏洞的上传利用行为和恶意文件的上传过程检测,从而达到有效防御的目的。


3、WEB运维人员防御


随着技术的不断进步,隐藏的攻击手法不断推陈出新,恶意文件也在千变万化,WEB服务运行后,WEB的运维人员就变得尤为重要。运维人员应有较强的安全意识,在平时的运维过程中,经常使用安全检测工具对WEB系统进行安全扫描,及时发现潜在漏洞并修复。定时查看系统日志,通过查看WEB服务器日志以发现入侵痕迹。


定时关注WEB系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。定时关注WEB服务搭建平台版本及补丁的更新,特别是漏洞修复补丁,应做到及早更新修复。


文件上传漏洞的危害性无须赘述,对攻击者来讲,文件上传漏洞一直是攻击WEB甚至服务器的一种重要利用手段,随着技术的不断更新,对WEB开发人员和WEB运维人员来说,唯有不断地学习,深入了解掌握漏洞相关知识,才可以更加从容地应对这类攻击。



/../template/Home/Databay/PC/Static