upload-labs 靶场通关笔记(Pass1~10)

upload-labs 靶场通关笔记(Pass1~10) ​ 相信各位小伙伴们对文件上传漏洞非常感兴趣特此本文记录 upload-labs 环境Windows 版前10关的代码分析、函数说明及绕过方法。所有操作均在本地靶场环境中完成用于安全技术学习与知识巩固。一、靶场搭建与工具准备靶场环境upload-labs-env-win-0.1集成 Apache PHP MySQL 的一键包upload-labs 项目地址https://github.com/c0ny1/upload-labs/releases蚁剑 (AntSword)https://github.com/AntSwordProject/antSword/releasesNotepadhttps://notepad-plus-plus.org/downloads/Burp Suite Community Editionhttps://portswigger.net/burp/communitydownload建议使用 Chrome 或 Firefox 浏览器配合 Burp Suite 进行抓包测试。二、Pass 1 ~ Pass 10 闯关实现以下每关将展示源代码解析代码功能并对关键函数及超全局变量进行说明最后给出通关思路结合实验过程中的绕过方法。Pass 1前端 JS 限制function checkFile() { var file document.getElementsByName(upload_file)[0].value; if (file null || file ) { alert(请选择要上传的文件!); return false; } var allow_ext .jpg|.png|.gif; var ext_name file.substring(file.lastIndexOf(.)); if (allow_ext.indexOf(ext_name |) -1) { var errMsg 该文件不允许上传请上传 allow_ext 类型的文件,当前文件类型为 ext_name; alert(errMsg); return false; } }代码功能前端 JavaScript 检查文件后缀仅允许.jpg、.png、.gif。关键点document.getElementsByName(upload_file)[0].value获取文件名。lastIndexOf(.)提取后缀indexOf判断后缀是否在白名单中。所有验证均在客户端可绕过。通关思路使用 Burp Suite 拦截上传请求将文件名修改为shell.php后放行。服务端无验证文件保存为 PHP 脚本。实验记录通过 BP 拦截修改或本地修改 HTML 表单均可绕过。Pass 2MIME 类型白名单if (($_FILES[upload_file][type] image/jpeg) || ($_FILES[upload_file][type] image/png) || ($_FILES[upload_file][type] image/gif)) { // 上传逻辑 }代码功能服务端检查$_FILES[upload_file][type]MIME 类型仅允许image/jpeg、image/png、image/gif。关键函数file_exists()检查目录。move_uploaded_file()移动临时文件。$_FILES超全局变量存储文件信息type、tmp_name、name。通关思路Burp Suite 抓包修改Content-Type为image/jpeg上传 PHP 文件。实验记录修改Content-Type后绕过成功。Pass 3有限黑名单 后缀处理$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); // 去除NTFS数据流 $file_ext trim($file_ext); if(!in_array($file_ext, $deny_ext)) { ... }代码功能黑名单禁止.asp、.aspx、.php、.jsp并对后缀进行规范化处理。关键函数strrchr()返回最后一个点后的子串。strtolower()转为小写。str_ireplace()替换::$DATAWindows NTFS 特性。通关思路使用未被禁止的后缀如.php3。实验记录上传shell.php3成功。Pass 4较全黑名单 .htaccess 绕过$deny_ext array(.php,.php5,.php4,.php3,.php2,php1,.html,.htm,.phtml,.pht, ... ,.swf); // 后缀处理同 Pass3代码功能黑名单覆盖常见可执行后缀但未包含.htaccess。通关思路上传.htaccess文件内容为AddType application/x-httpd-php .jpg上传图片马如shell.jpg触发 PHP 解析。实验记录上传.htaccess后再上传shell.jpg蚁剑连接成功。Pass 5全面黑名单但未强制小写$deny_ext array(..., .htaccess); // 包含 .htaccess $file_ext strtolower($file_ext); // 后缀转小写代码功能黑名单包含.htaccess后缀强制转小写。通关思路利用大小写绕过如2.PHP因部分系统不区分大小写。实验记录上传2.PHP成功环境依赖。Pass 6未使用 trim 去除空格$file_name $_FILES[upload_file][name]; // 无 trim $file_ext strrchr($file_name, .); // 无 trim($file_ext)代码功能未对文件名和后缀进行trim()操作。通关思路文件名后添加空格如shell.php使后缀匹配失败。实验记录BP 修改文件名后加空格如shell.php绕过。Pass 7未删除文件名末尾的点$file_name trim($_FILES[upload_file][name]); // 无 deldot 函数 $file_ext strrchr($file_name, .); // 提取后缀代码功能未删除文件名末尾的点如file.php.。通关思路文件名末尾加点如shell.php.提取后缀为空.绕过黑名单。保存时 Windows 自动去除末尾点。实验记录BP 修改文件名后加点如shell.php.上传成功。Pass 8未去除::$DATA代码功能该 Pass 未使用str_ireplace(::$DATA, , $file_ext)处理后缀仅通过strrchr提取扩展名、strtolower转小写和trim去空格。关键漏洞在于忽略 Windows NTFS 文件系统的数据流特性。通关思路利用::$DATA特性绕过黑名单检测上传文件名如2.PHP::$DATA。后缀提取为.PHP::$DATA转小写后为.php::$data黑名单未包含此字符串因此通过检测。保存时 Windows 自动去除::$DATA部分实际生成2.PHP文件。访问时需直接请求/upload/2.PHP无需包含::$DATA。实验记录使用 Burp Suite 修改文件名为2.PHP::$DATA上传成功生成文件2.PHP。蚁剑连接需移除::$DATA直接访问文件有效。防御建议严格验证文件扩展名使用白名单机制如仅允许.jpg,.png。显式移除::$DATA等特殊字符串$file_ext str_ireplace(::$DATA, , $file_ext);文件重命名如添加随机前缀避免直接使用用户输入的文件名。Pass 9使用原始文件名保存代码功能直接使用用户上传的原始文件名$file_name保存文件未添加随机数或时间戳重命名。同时包含deldot去除末尾点和str_ireplace(::$DATA)等处理。通关思路利用复合后缀和 Windows 特性绕过上传文件名如shell.php::$DATA.jpg。后缀提取时最后一个点为.jpg黑名单未包含.jpg因此通过检测。保存时 Windows 忽略::$DATA但.jpg可能被丢弃实际生成shell.php文件末尾可能带点。访问时需保留文件名末尾点如/upload/2.PHP.。实验记录上传shell.php::$DATA.jpg成功最终文件名为2.PHP.带点访问/upload/2.PHP.有效。防御建议强制重命名文件$new_name md5(uniqid()) . . . $allowed_ext;限制扩展名长度如仅取最后一个点后的 3-4 字符。结合 MIME 类型检测避免仅依赖文件名。Pass 10str_ireplace删除黑名单字符串代码功能使用str_ireplace($deny_ext, , $file_name)直接删除文件名中的黑名单子串如php,html不区分大小写。未提取扩展名仅进行简单字符串替换。通关思路利用双写绕过删除逻辑上传文件名如shell.pphphp。str_ireplace删除php后剩余部分为shell.php成功保存为 PHP 文件。类似变体shell.phtmlphtml→ 删除后为shell.phtml。实验记录上传2.pphphp后生成2.php蚁剑连接成功。防御建议避免直接删除子串改用扩展名白名单验证$ext pathinfo($file_name, PATHINFO_EXTENSION); if (!in_array($ext, $allowed_ext)) { reject(); }使用正则表达式严格匹配扩展名如/^[a-z0-9]{3,4}$/i。结合内容检测如exif_imagetype验证图片头。三、免责声明本文所述所有技术方法均在本地搭建的 upload-labs 靶场环境中进行测试仅供网络安全学习与个人技术研究使用。严禁利用文中技术攻击未授权的系统。任何违法使用本文内容的行为作者不承担任何责任。请遵守当地法律法规合法合规进行安全学习。总结与防御策略核心漏洞Pass 8::$DATA绕过Windows 特性。Pass 9原始文件名 复合后缀。Pass 10双写黑名单子串。通用防御使用扩展名白名单而非黑名单。文件重命名随机化。服务器配置禁用危险扩展名执行权限如.php在 upload 目录不可执行。多层检测文件名、MIME 类型、文件内容签名。免责重申本文技术仅限本地靶场测试严禁未授权攻击。遵守法律法规合法学习网络安全技术。通过结构化分析可深入理解漏洞成因与防护措施提升代码安全实践能力。