文件上传漏洞简介
文件上传漏洞就是利用某些代码缺陷来上传恶意木马等恶意文件到服务器进行资源获取或者控制
攻击者主要对文件上传漏洞的主要方式是:
- 前端JS过滤绕过
- 文件名过滤绕过
- Content-Type恶意绕过
等等
上传漏洞类型
前端JS绕过
前端JS代码漏洞绕过的原理是:应用程序是在前端通过JS代码进行验证的,而并不是在后端进行验证,绕过前端的JS验证可以有效利用文件上传漏洞,进行木马的上传
构建环境
文件上传HTML界面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS 文件绕过</title>
</head>
<body>
<form action="upload.php" enctype="multipart/form-data" method="post" name="upload" onsubmit="return checkfile();">
<input type="hidden" name="MAX_FILE_SIZE" value="2044444">
<br /> 请选择你要上传的文件:
<input type="file" name="upfile">
<input type=submit name="submit" value="submit" />
</body>
</html>
文件上传PHP代码:
<?php
echo "<meta charset=‘utf-8‘>";
$uploaddir=‘uploads/‘;
if(isset($_POST[‘submit‘])){
if(file_exists($uploaddir)){
if(move_uploaded_file($_FILES[‘upfile‘][‘tmp_name‘],$uploaddir.‘/‘.$_FILES[‘upfile‘][‘name‘])){
echo "文件保存成功。\n保存于:".$uploaddir.$_FILES[‘upfile‘][‘name‘];
}else{
exit("文件保存失败,请重新上传文件再试");
echo "<a href=upload.html>回到上传页面</a>";
}
}
}
?>
文件上传js代码:
function checkfile() {
var file = document.getElementsByName(‘upfile‘)[0].value;
if (file == null || file == "") {
alert("您选择的是空文件,请重新上传");
return false;
}
var allowed_ext = ".jpg|.png|.gif|.bmp";
var ext_name = file.substring(file.lastIndexOf("."));
if (allowed_ext.indexOf(ext_name + "|") == -1) {
var msg = "该文件类型不允许上传";
alert(msg);
return false;
}
}
$_FILES()函数说明
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
- $_FILES["file"]["name"] - 上传文件的名称
- $_FILES["file"]["type"] - 上传文件的类型
- $_FILES["file"]["size"] - 上传文件的大小,以字节计
- $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
- $_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。
漏洞分析
由于JS判定只发生在前端,有两个方法可以实现:
禁用浏览器的JS执行
在浏览器的设置里面可以禁用JS:
禁用之后,我们选择一个特殊格式的文件:
上传成功:
使用抓包软件修改拓展名传参
我们在传参的时候将文件的参数设置成允许上传的文件后缀
具体做法如下:
- 将木马1.php文件的后缀名改成.jpg
- 上传文件
- 抓包
- 将文件名改回成1.php
这样,我们的PHP代码就可以在服务器端执行了
修改前端JS代码绕过
我们修改前端js代码,即可上传PHP文件了(使用firebug等软件即可):