upload-labs靶场通关详解:第三关
一、分析源代码
代码注释如下:
<?php
// 初始化上传状态和消息变量
$is_upload = false;
$msg = null;// 检查是否通过POST方式提交了表单
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);// 去除Windows文件流标记(例如.php::$DATA会被解析为.php文件)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 去除扩展名前后的空白字符$file_ext = trim($file_ext);// 检查文件扩展名是否不在禁止列表中if(!in_array($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 . '文件夹不存在,请手工创建!';}
}
?>
通过代码注释可以得出,这关是黑名单验证,不允许上传.asp,.php,.jsp等后缀文件,并且对上传的文件进行了处理,比如删除末尾的点,转换大小写等,并且将上传的文件重命名后再移动到指定的目录。
二、解题思路
我们可以尝试修改后缀名的方式来绕过验证。在php5.2.17版本中,可以通过修改配置文件完成相关操作。
AddType application/x-httpd-php .php .phtml .php3 .php4 .php5是一条 Apache HTTP 服务器配置指令,用于告诉服务器将特定文件扩展名(如 .php、.phtml、.php3、 .php4 、.php5)的文件识别为 PHP 脚本,并使用 PHP 解释器进行处理。
通俗意思就是你上传的xxx.php3文件,服务器会当成xxx.php文件来执行。
三、解题步骤
1.修改配置文件,找到htttpd-conf这个配置文件,在里面添加一条数据,保存并退出。如下:
AddType application/x-httpd-php .php .phtml .php6
2.将一句话木马的后缀改成php6,然后尝试上传文件,结果显示上传成功。
3.找到上传后的木马文件路径,验证是否可以使用。
检查网页代码,通过html标签找到文件路径,或者直接右击,复制图片地址。
去文件目录下执行,成功。