简介
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。
形成原因:服务器对用户上传的文件处理逻辑做的不够安全,导致脚本文件被执行。
常见利用方式
文件上传后常见安全问题:
- 上传文件是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、单独设置文件的服务器域名