编 写:袁 亮 时 间: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、二次渲染 就是重新生成图片,然后删除原图