【web安全】- 文件上传漏洞


编	写:袁	亮
时	间:2014-10-27
说	明:文件上传、下载漏洞的研究

一、上传漏洞原理
	1、用户上传了非法的文件
	2、存储的目录有执行脚本权限,且非法文件能被解析
	3、可以通过web方式访问该文件

二、上传验证攻防手段:
	1、防御:客户端js坚持文件类型和大小是否合法
	   攻击:直接修改浏览器的js或者使用burpsuite等工具修改提交的数据
	
	2、防御:服务端后缀名检测
	   攻击:直接修改脚本后缀名上传即可,后缀名判断采用白名单形式,不要用黑名单
		2.1 结合服务器端的解析漏洞
		2.2 IIS的解析漏洞:可以采用类似webshell.asp;test.jpg 的文件,会被IIS解析为webshell.asp
		2.3 apache解析漏洞:webshell.php.rar.rar a.php.123
			2.3.1 AddHandler php5-script .php 危险文件:test2.php.jpg
			2.3.2 AddType application/x-httpd-php .jpg jpg也能作为脚本执行
			2.3.3 配置了php2 php4等也作为脚本执行
		2.4 nginx解析漏洞:/test.jpg/webshell.php (0.87版本以下)
		2.5 windows下:webshell.asp_ webshell.asp.等形式,windows自动会把asp后面的去掉
		2.6 linux下:webshell.php0x00.jpg 0x00在C里是终结符,会被截断为webshell.php
	
	3、防御:服务端MIME类型检测
	   攻击:修改请求包中的Content-Type字段即可绕过

	4、防御:服务端根据文件内容进行类型检测
		4.1 文件头头检测,比如getimagesize等,检测的就是文件头不10个字节左右
		4.2 文件加载测试,比如图片渲染,或者二次渲染
	   攻击:修改上传文件的内容
		4.1 在正常的图片文件头之后,加入可执行脚本
		4.2 使用GIMP工具,在图片的空白区域,填充代码,可以绕过渲染检测

三、上传之后攻击
	1、服务器配置不当,导致webshell被执行
		1.1 上传目录可执行
		1.2 非法文件名被解析
	2、程序不当,导致webshell执行
		1.1 引用了上传的文件(很多开源的框架都有这种漏洞,比如UCenter的js.php等等)
		1.2 直接使用了源文件的后缀名等,导致成功使用了解析漏洞,如果生成的文件都重命名了,那么文件名解析漏洞肯定不存在
	3、得到webshell之后,基本上,可以说这个站点已经沦陷了,后面可以做的事情太多了
		3.1 有个很出名的webshell叫中国菜刀,大家可以下过来玩下
四、安全防范
	说明:具体看各种攻防手段,感觉要完全解决上传漏洞是件非常麻烦,而且有技术含量的事情
	但是从本身的原理上来看,只要遵循规范,其实是一件很容易规避的问题(开源框架例外,太多不可控)
	1、服务器方面:
		1.1 【最重要】上传文件的目录,设置为不可执行(就算所有判断都没加,只要这点做了,基本上就成功了)
		1.2 apache、nginx不要配置一些奇怪的解析
		1.3 上传的图片可以采用统一的域名进行访问,不与web服务器一起
	2、程序方面
		2.1 根据文件头,判断文件类型,并采用白名单过滤,只允许有限几种类型
		2.2 重写文件名,并且文件名与用户输入的数据无关
		2.3 如果是图片的话,可以进行图片压缩等操作,一般来说,非法代码都会被干掉

五、容易遗漏的过滤
	1、引用了富文本编辑器,但是没做任何更改,一般富文本编辑器会自带了上传功能,包括服务器端的,很多人会忘了该这个,从而导致webshell被上传执行
	2、开源框架本身的有include一些生成文件的,这个只能多关注开源框架的一些最新安全消息,进行升级

六、文件下载
	1、文件下载遵循一个原则,所有要下载的文件名,都不允许是通过参数传递进来的
	2、将可下载的文件,通过后台等形式记录到数据库中,并给与编号
	3、只允许根据编号来进行相应的文件下载
	4、导出数据的,根据取到的数据库,生成文件下载需要防范的是sql注入等问题,与文件下载本身没什么管理,参考其他防范措施

附录:
1、在图片里写入一句话木马
	copy /b tangwei.jpg+yijuhua.php tangweiyijuhua.jpg
2、二次渲染
	就是重新生成图片,然后删除原图

发表评论