进入靶场环境,查看第3关的源码:

对代码进行分析:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) { /*判断$submit是否设置*/
if (file_exists(UPLOAD_PATH)) { /*检查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)) {/*如果在$deny_ext中没有搜索到$file_ext,那么结果为真*/
$temp_file = $_FILES['upload_file']['tmp_name']; /*将上传文件的临时路径赋值给$temp_file*/
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; /*UPLOAD_PATH/本地格式化后的日期/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 . '文件夹不存在,请手工创建!';
}
}
代码分析完毕,我们可以看到的过滤有:删除文件尾部的点,将.后的字符串的转换为小写,去除字符串::$DATA,收尾去空。
所以我们可以使用绕过验证方式只有:添加php解析拓展名,例如:php5,php4,php3
我们上传抓包修改

查看上传结果

可以看见,已经上传成功。我尝试调用一句话木马发现调用失败,可能是我环境问题导致无法解析,但正常情况下都是可以解析的。