介绍
这是一个文件上传的靶场(总共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
效果一样~