【Web安全】文件上传漏洞

目录

1. 文件上传漏洞概述

1.1 FCKEditor文件上传漏洞

1.2 绕过文件上传检查功能

2. 功能还是漏洞

2.1 Apache文件解析

2.2 IIS文件解析

2.3 PHP CGI路径解析

2.4 利用上传文件钓鱼

 3. 设计安全的文件上传功能


1. 文件上传漏洞概述

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。

应用:例如上传一张图片、分享一段视频、论坛发帖时附带附件、发邮件时附带附件……

文件上传后导致的安全问题一般有:

  • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行
  • 上传文件时Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
  • 上传文件时病毒、木马文件,黑客诱骗用户下载执行
  • 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
  • 将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块
  • 上传一个合法的文本文件,其内容包含PHP脚本,再通过本地文件包含漏洞执行该脚本
  • ……

要实现webshell,要满足以下几个条件:

  1. 上传的文件能被Web容器解释执行,文件上传后的目录是Web容器所覆盖到的路径
  2. 用户能从Web上访问这个文件
  3. 文件不会被安全检查、格式化、图片压缩等功能改变内容而导致攻击不成功

1.1 FCKEditor文件上传漏洞

FCKEditor是一款非常流行的富文本编辑器,其上传文件的功能能将用户上传的文件保存在/UserFiles/all/目录下

在有漏洞的版本中,通过黑名单来确认文件的安全性

以上述黑名单为例,当我们上传后缀为php2、php4、inc、pwml、asa、cer等文件时就能绕过

1.2 绕过文件上传检查功能

  • %00截断

在 C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符,因此在文件名后添加一个%00字节,可以截断某些函数对文件名的判断

例如只允许上传JPG图片,可以构造文件名xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断,但对于服务器端来说,此文件因为0x00字符截断,会变成xxx.php

  • 伪造文件头

有的应用会通过文件头验证文件类型

 常见的攻击技巧是伪造一个合法的文件头,将真实的PHP等脚本代码附在文件头之后

但仍需要通过PHP来解释此图片文件才行,若上传的文件后缀是JPG,则Web Server可能会将此文件当作静态文件解析,不会调用PHP解释器,也就无法进行攻击 

2. 功能还是漏洞

2.1 Apache文件解析

Apache对于文件名的解析是从后往前解析的,直至遇见一个Apache认识的文件类型为止

例如:

phpshell.php.rar.rar.rar.rar.rar

Apache不认识.rar文件类型,会一直遍历到.php,认为这是一个PHP类型的文件

黑客就可以利用该特性绕过对后缀名的限制,实现php脚本的执行

(在Apache的mime.types文件中定义了它所认识的文件)

2.2 IIS文件解析

  • 分号“;”是截断字符

当文件名为abc.asp;xx.jpg时,IIS 6 会将此文件解析为abc.asp,从而导致脚本被执行

  • 曾经出现过因处理文件夹扩展名出错,导致将/*.asp/目录下的所有文件都作为ASP文件进行解析
  • PUT方法允许用户上传文件到指定目录下,结合MOVE方法可以将原本只允许上传文本文件改写为脚本文件,从而执行webshell

2.3 PHP CGI路径解析

Nginx作为代理把请求转发给fastcgi Server,PHP在后端处理。(使用Nginx作为Web Server时,一般使用fastcgi的方式调用脚本解释器。)

当访问

http://www.xxx.com/path/test.jpg/notexist.php

时,会将test.jpg当作PHP解析。notexist.php是不存在的文件。

如果在任何配置为 fastcgi的PHP应用里上传文件,其内容是PHP文件,则将导致代码执行。

原因:

PHP的配置文件中 cgi.fix_pathinfo=1默认开启

在上面的例子中,PATH_INFO=notexist.php,因为notexist.php不存在,会往前递归查询路径确认文件的合法性。此时SCRIPT_FILENAME检查文件是否存在,其值为/path/test.jpg,而此时PATH_INFO还是notexist.php,在最终执行时,test.jpg会被当作PHP解析。

2.4 利用上传文件钓鱼

利用文件上传功能,钓鱼者可以先将包含了HTML的文件(例如一张图片)上传到目标网站,然后通过传播这个文件的URL进行钓鱼,该URL中不会出现钓鱼地址。

 png是伪造的文件头绕过上传时的文件类型检查,后面的脚本控制浏览器跳向指定的钓鱼网站,骗子在传播钓鱼网站时,只需要传播合法图片的URL

 

 3. 设计安全的文件上传功能

  • 文件上传的目录设置为不可执行
  • 判断文件类型时可以结合MIME Type、后缀检查等方式,使用白名单
  • 对于图片的处理使用压缩函数或resize函数,在处理图片的同时破坏其中可能包含的HTML代码
  • 使用随机数改写文件名和文件路径
  • 单独设置文件服务器的域名
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RexHarrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值