BlBana's BlackHouse.

文件上传漏洞(一)

字数统计: 732阅读时长: 3 min
2016/07/30 Share


### 客户端检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<html>
<head>
<meta charset="UTF-8">
<title>图片上传</title>
<script type = "text/javascript">
function checkFile(){
var flag = false; //是否可以上传的标志位
var str = document.getElementById("file").value; //获取文件名
str = str.substring(str.lastIndexOf('.') + 1); //获取扩展名
var arr = new Array('png','jpg','gif','bmp');
for(var i = 0; i < arr.length; i++){
if(str == arr[i]){
flag = true;
}
}
if (!flag) {
alert('文件不合法!!');
}
else{
alert('文件上传成功');
}
return flag;
}
</script>
</head>
<body>
<form action = "upload.php" method = "post" onsubmit="return checkFile()" enctype = "multipart/form-data"> <!--在onsubmit事件中验证表单后 必须加上return 否则表单会继续提交-->
<input type = "file" name = "file" id = "file" />

<input type = "submit" value = "提交" name = "submit" />
</form>
</body>
</html>


客户端验证代码如上所示,在测试的过程中,需要注意的问题是,在表单事件onsubmit中,需要写上return,此时当在JS代码中验证文件后缀名失败以后,可以阻止表单继续上传,否则无论JS代码如何验证,文件都会成功上传到服务器。


*

### 服务器端接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
if(isset($_POST["submit"])){
$name = $_FILES['file']['name']; //接收文件名
$name = md5(date('Y-m-d h:m:s')).strstr($name, "."); //文件重命名 保留原有扩展名
$size = $_FILES['file']['size'];
if ($size == 0) {
# code...
echo "文件不能为空"."\n";
}else{
$tmp = $_FILES['file']['tmp_name'];
copy($tmp,$name);//move_uploaded_file($tmp, $name); //将上传文件移动到当前文件
echo "文件上传成功 path :".$name."
";
echo "文件上传路径为:".$tmp."";
}
}
?>;
`


服务器端的接收代码如上所示

这里补充一下有关于PHP中$_FILES数组的使用方法
> $_FILES[‘file’][‘name’] 客户端文件名称
>
> $_FILES[‘file’][‘type’] 文件的MIME类型
>
> $_FILES[‘file’][‘size’] 文件大小 单位字节
>
> $_FILES[‘file’][‘tmp_name’] 文件被上传后再服务器端临时文件名,可以在php.ini中指定
需要注意的是在文件上传结束后,默认的被储存在临时文件夹中,这时必须把他从临时目录中删除或移动到其他地方,否则,脚本运行完毕后,自动删除临时文件,可以使用copy或者move_uploaded_file两个函数

### 前端验证绕过方法

#### 方法一

使用firebug等开发者工具,修改HTML代码,将表单中的onsubmit事件删除,从而绕过JS的验证过程

#### 方法二 中间人攻击

使用Burp等抓包工具,先将木马文件扩展名更改为一张正常图片的扩展名,在上传时,使用工具进行抓包,更改扩展名为PHP,就可以绕过前端的验证。
> 再修改了扩展名后,可能导致文件的正文长度减少了,此时应该将数据包中的字段Content_Length长度改正,否则上传可能会失败。

原文作者:BlBana

原文链接:http://blbana.cc/2016/07/30/158/

发表日期:July 30th 2016, 6:06:30 pm

更新日期:November 15th 2018, 10:34:58 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG