访问靶场环境第2关,查看下源码:

我们把源码dump下来分析一下:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) { /*判断变量submit是否设置*/
if (file_exists(UPLOAD_PATH)) { /*检查UPLOAD_PATH中的文件或目录是否存在*/
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { /*如果上传的文件格式为jpeg或png或type的话if语句结果为真,向下执行。*/
$temp_file = $_FILES['upload_file']['tmp_name']; /*上传文件的临时路径赋值给$temp_file*/
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] /*UPLOAD_PATH/上传文件名*/
if (move_uploaded_file($temp_file, $img_path)) { /*如果移动的文件路径和文件名称正确,结果为真。*/
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
代码分析完毕,我们可以看出,源码中判断的点在于上传文件的类型,这时我们只需要修改上传文件的MIME值就可以绕过过滤。
我们上传一个php文件,并抓包修改MIME值,将MIME值修改为: image/jpeg。

修改后我们传输数据包到服务器

可以看到我们上传成功,我们访问下上传的php文件,并利用一句话木马查看phpinfo()。

成功调用phpinfo(),说明我们上传的一句话木马可以正常使用,绕过了后端对上传文件的限制。