介绍
这是一个文件上传的靶场(总共19关)
下载地址:
https://github.com/c0ny1/upload-labs
过程
第一关:

可以看到这里的上传的验证是javascript验证的,也就是前台认证,但是我们可以利用后台验证绕过。
步骤:
1、上传一个2.png
2、抓包将2.png修改为2.php

然后看看是否成功上传

upload目录是这个靶机上传的文件的存放目录,所以上传的东西都会在这里,所以看有没有成功上传的话可以直接来这里看,或者去访问一下http://xxx.xxx.xxx/upload/文件名,如我刚刚上传的2.php就是这个链接
http://127.0.0.1/upload/upload/2.php

第二关:

所谓文件类型就是上传文件的时候请求中的Content-Type,如下

这关的代码逻辑就是,如果上传的文件类型是image/jpeg或image/png或image/gif就可以上传。那么只要上传一个php文件,然后把文件类型修改为image/jpeg即可上传


成功上传~
第三关:
此关就是后台禁止
php、jsp、asp、aspx这四个文件上传
这关的代码比较长,我就直接贴出来了~
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.'); // 获取文件名的后缀(就是获取.后面的内容)
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) { // 如果$file_ext的值不在$deny_ext列表里,即进入条件
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
既然不能上传php,那么我们可以上传.php3(上传后也是当php解析)

然后看看是否上传了

可以看到是上传了的,但是为什么名字会那么长呢?
可以看看代码中第15行
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
这个$img_path就是上传后的文件的地址,UPDATE_PATH就是上传目录(upload),data("YmdHis")就是当前时间的年月日时分秒,rand(1000,9999)就是在0000到9999中随机抽数字,$file_ext就是上传的文件的后缀,所以拼接起来就是这么长的名字。
那么我们上传了这个文件后,看不到他的名字,我们就可以爆破当前时间的年月日时分秒,然后后面几个随机数字爆破,这里不演示了,直接打开看看php3是否和php效果一样~