文件上传漏洞分析和防御

简介

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

形成原因:服务器对用户上传的文件处理逻辑做的不够安全,导致脚本文件被执行。

常见利用方式

文件上传后常见安全问题:

  • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
  • 上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为;
  • 上传文件是并病毒、木马文件,黑客用以诱骗用户或管理员下载执行;
  • 上传文件是钓鱼图片或包含了脚本的文件,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈;
  • 配合本地文件包含漏洞执行上传文件等。

前端绕过

JS绕过

1、js代码检验文件后缀,一般是通过白名单、黑名单进行限制

绕过方法:直接删除或禁用js代码,重新上传即可绕过。

MIME检测

后端通过检测Content-Type来对上传文件进行处理
常见Content-Type类型:菜鸟教程

常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

绕过方法:通过bp抓包拦截改包即可绕过。

后端绕过

文件头绕过

后端通过对上传文件的文件头进行检测是否合法(例如要求上传PNG图片,则检查文件的头格式是否是PNG)

绕过方法:在正常的图片后面添加脚本文件,copy /b test.png + test.php test.png 即可绕过。

绕过后缀限制

黑名单限制绕过:采用别名后缀进行绕过,上传.htaccess文件绕过(apache配置文件,低于2.3.8版本可用,上配置文件)、上传.user.ini文件(局限性很大)
php文件后缀有:

.php
.php2
.php3
.php4
.php5
.phtml
.pht等
windows下可尝试 php::$DATA、php.、大小写等

asp文件后缀:

.asp
.asa
.aspx
.cdx
cer 等

jsp文件后缀有:

.jsp
.jspx
.jspf 等

白名单限制绕过
1、\0截断,在很多语言中,%00被认为是终止符
例如上传:test.php[\0].png

2、转换字符集造成的截断
适合场景:PHP版本低于5.4;后端获取上传的文件后缀后对文件名进行字符集转换。
原因:PHP在实现字符转换时通常使用iconv()函数,UTF-8在单字节时允许的字符范围是0x00~0x7F,如果转换的字符不在该范围内,则会造成PHP_ICONV_ERR_ILLEGAL_SEQY异常,低版本PHP在发生异常后不在处理后面字符,造成截断问题;5.4以上版本会返回false。

test.php\x99.png

3、web服务器解析漏洞
1、IIS解析漏洞
IIS 6存在两个解析漏洞:

  • /*.asp/目录下的所有文件都作为ASP文件解析
  • 当文件名为test.asp;xx.jpg 会被解析为test.asp,”;“为截断符

IIS7.0和IIS7.5
php配置问题:一个文件路径后面加上/xx.php会将原来的文件解析为php文件。a.jpg/a.php

2、Apache文件解析漏洞
Apache对于文件名的解析是从后往前解析的,直到遇见一个Apache认识的文件类型为止。(apache1.x /2.x)
例如:test.php.rar.rar.rar 被解析成test.php

3、Nginx fastcgi
Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

fastcgi在处理’.php’文件时发现文件并不存在,这时php.ini配置文件中cgi.fix_pathinfo=1
发挥作用,这项配置用于修复路径,如果当前路径不存在则采用上层路径。为此这里交由fastcgi处理的文件就变成了’/test.jpg’。
最重要的一点是php-fpm.conf中的security.limit_extensions配置项限制了fastcgi解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许fastcgi将’.jpg’等文件当做代码解析。

防御

1、文件上传目录设置为不可执行
2、判断文件类型
3、使用随机数改写文件名和文件路径
4、单独设置文件的服务器域名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值