文件上传漏洞是指用户上传了一个可执行的脚本文件,并经过此脚本文件得到了执行服务端命令的能力。这种攻击方式是最直接和有效的,并且互联网中咱们常常会用到文件上传功能,它自己是没有问题的,正常的业务需求,但是文件上传后服务器若是不能安全有效的处理或解释文件,每每会形成严重的后果。javascript
常见的安全问题:php
上传的文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,致使代码执行;html
上传的文件是flash的策略文件crossdomain.xml,黑客用以控制flash在该领域下的行为;java
上传的文件是病毒、木马文件,黑客用以诱骗用户或管理员下载执行;web
上传的文件是钓鱼图片或者包含了脚本的图片,在某些版本的浏览器中会被做为脚本执行,被用于钓鱼和欺诈。shell
大多数状况下文件长传漏洞通常都是值值指第一点(webshell问题),完成该攻击的条件以下:浏览器
上传的文件可以被web容器解释执行;安全
用户可以从web访问该文件;服务器
上传的文件不被安全检查、格式化、图片压缩等改变内容。dom
1) 富文本编辑器FCKEditor 上传文件的漏洞,在存在漏洞的版本中,其文件检查的部分以下:
$Config['AllowedExtensions']['File'] = array(); $Config['DeniedExtensions']['File'] = array('php','php3','php5','phtml','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg','cgi');
这是以黑名单的方式限制文件上传的,设计思想就是很差的,就该例而言,上传后缀为php2 php4等等文件,就可能致使安全问题发生. 可采用表名单的思想会好不少.
2) 经过某些手段绕过文件上传检查 以下:
应用本来只容许上传JPG图片,若是构造文件名(修改POST包)为xxx.php.[\0].JPG 其中 [\0]为十六进制的0x00字符, .JPG
知足绕过了上传文件类型判断,但对于服务器来讲,文件由于0字节的截断关系,作种却成了xxx.php
3)Apache 文件解析问题
Apache1.x 2.x 中文件解析是从后往前解析的,直到遇到一个Apache认识的文件类型为止。Apache所认识的文件类型定义在Apache的mime.types文件中。 好比:上传文件phpshell.php.rar.rar ,文件.rar是合法的上传需求,应用中判断文件类型也只判断了后缀是否为.rar 用户上传成功,但Apache不认识.rar 一直遍历后缀到.php 认为是个php文件,致使脚本执行带来安全问题。
4)IIS文件解析问题
IIS 6 处理文件解析时,因 ‘;’ 截断符是文件名别截断更改。如:xxx.php;ab.jpg IIS 6会将此文件解析为xxx.php从而执行脚本。
5)PHP CGI(fastcgi)路径解析问题
此问题与 fastcgi方式下,PHP获取环境变量的方式有关。PHP配置文件中一个关键选项 cgi_pathinfo 该选项默认开启 : cgi.fix_pathinfo = 1 。在映射URL时两个环境变量很重要:PATH_INFO SCRIPT_FILENAME.如:
当访问 http://www.xxx.com/path/test.jpg/notexist.php
PATH_INFO = notexist.php 这cgi_pathinfo个选项为1的时候,在映射URL时,将递归查询路径确认文件的合法性。notexist.php是不存在的,因此递归查询路径,此时出发的逻辑是:
/** * if the file not exist,try to extract PATH_INFO out of * it by stat'ing back through the '/' this file url's like /info.php/test */ if(script_path_translated && (script_path_translated_len = strlen(script_path_translated)) > 0 && (script_path_translated[script_path_translated_len-1] == '/') || .....
这个往前递归的功能本来是想解决 /info.php/test 这种路径URL 能正确解析到info.php.此时的SCRIPT_FILENAME 须要检查文件是否存在,因此会是/path/test.jpg 而PATH_INFO 此时仍是notexidt.php 在最终执行的时候 test.jpg会被当作PHP进行解析,从而致使安全问题。PHP官方建议 将cgi.fix_pathinfo 设置为 0
6) 利用上传文件钓鱼
钓鱼网站传播时,会利用XSS、服务器302跳转等功能从正常网站跳转到钓鱼网站,这种钓鱼会暴露真是的钓鱼地址在URL中。而利用文件上传,钓鱼者能够先将包含了html的文件上传至目标网站,再经过传播这个文件进行钓鱼,这种方式,URL中不会出现钓鱼网址,更具欺骗性。以下:
http://test.com/upload/2018/02/item.jpg?1_148
实际内容为:
png <script lsngusge='javascript'> var c = window.location.todtring(); if(c.indexof("?") != -1{ var i=c.split("?")[1]; if(i.split("_")[0]==1){ location.href = 'http://47.95.216.98/images/items.asp?id='+i.split("_")[1]; }else{ location.href = 'http://47.95.216.98/images/items.asp?id='+i.split("_")[1]; } } </script>
其中png为伪造的文件头,用于绕过上传时的文件检查,接下来一段脚本,如执行,将控制浏览器跳转到钓鱼网站,此时只须要传播合法URL的图片就会进行钓鱼传播。
a 文件上传的目录设置为不可执行
只要web容器没法解析该目录下的文件,及时供给者上传了脚本文件,服务器自己也不会受到影响.
b 判断文件类型
在判断文件类型时,能够结合使用MIME Type 后缀检查等方式.文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证实是不可靠的.此外对图片的处理可使用压缩函数等,在处理图片的同时破坏图片中可能包含的html代码.
c 使用随机数改写文件名和路径
文件上传若是要执行代码,则须要能过访问到上传的文件,若是应用使用随机数改写了文件名和路径,将极大的增长攻击的成本.某些特定文件名的文件也将应为文件名的更改而没法成功实施攻击.
d 单独设置文件服务器的域名
因为浏览器同源策略的关系,一系列客户端攻击将失败,如:上传crossdomain.xml 上传包含JavaScript的XSS利用等问题将获得解决.
总之,文件上传每每与代码执行联系在一块儿,所以对于业务中要用到的上传功能,都应该有安全工程师进行严格检查。同时文件上传又可能存在诸如钓鱼、木马、等危害到最终用户的业务风险问题,所以这一领域咱们也要充分考虑。