Upload-Labs 第1至第10关通关教程引言Upload-Labs 是一个专注于文件上传漏洞练习的开源靶场旨在帮助网络安全初学者深入理解各类文件上传漏洞的成因、利用方式及防御措施。该靶场通过设置不同难度和类型的关卡模拟了真实Web应用中常见的安全缺陷涵盖了从前端校验到服务端解析的多种攻击场景。本教程将详细讲解 Pass-01 至 Pass-10 的通关方法每关均包含漏洞原理分析、具体操作流程以及实操截图说明。建议读者在本地搭建 PHPStudy 环境Apache PHP 5.x进行实验以确保与靶场运行环境一致避免因版本差异导致无法复现问题。Pass-01 前端验证绕过本关考察前端JavaScript对文件类型进行限制的安全机制及其绕过方法。漏洞原理说明此关卡仅在客户端使用 JavaScript 函数checkFile()对上传文件的扩展名进行检查阻止.php等可执行脚本的上传。然而这种校验完全依赖于浏览器端攻击者可通过禁用或修改JS代码轻松绕过而服务器并未对文件类型做任何后端验证存在严重的安全风险。具体操作流程尝试上传一个名为shell.php的一句话木马文件浏览器会弹出提示“只允许上传 .jpg/.png/.gif 类型文件”并阻止提交。打开浏览器开发者工具F12切换至“Elements”或“Sources”面板找到页面中的script标签定位到checkFile()函数。删除或注释掉该函数的核心判断逻辑例如将return false;改为return true;或者直接删除整个函数定义。在修改后的页面中重新选择shell.php文件并上传此时可成功绕过前端限制。上传成功后复制返回的文件路径在蚁剑AntSword中新建连接填入URL地址和密码如kfc即可连接获取 WebShell。防御建议应始终在服务端对上传文件的类型、内容和扩展名进行严格校验不能依赖前端JS作为唯一防线。同时建议对上传文件重命名并存储在无执行权限的目录下。Pass-02 MIME 类型校验绕过本关考察服务器仅通过 HTTP 请求头中的Content-Type字段判断文件类型的安全缺陷。漏洞原理说明虽然前端未做限制但服务端通过 PHP 的$_FILES[upload_file][type]获取文件的 MIME 类型并仅允许image/jpeg、image/png等图片类型。由于该值由客户端控制攻击者可使用抓包工具如 Burp Suite篡改请求中的Content-Type头部从而伪造文件类型实现绕过。具体操作流程准备一个包含一句话木马的 PHP 文件例如shell2.php内容如下?phpeval($_POST[shell2]);?在网页中选择该文件并点击上传使用 Burp Suite 抓取 POST 请求包。在拦截的请求中找到Content-Type: application/octet-stream或类似字段将其修改为image/png。放行数据包服务器将误认为上传的是合法图片文件从而允许保存。访问上传成功的文件路径使用蚁剑连接成功获取 WebShell 控制权。防御建议不应依赖Content-Type判断文件类型因其极易被伪造。应结合文件头Magic Number、扩展名白名单和服务端内容检测等多种手段综合判断。Pass-03 黑名单不全绕过本关考察基于黑名单过滤机制中存在的遗漏扩展名所带来的安全隐患。漏洞原理说明服务端采用黑名单方式禁止.php、.php3、.php4、.php5等常见PHP扩展名上传。但由于配置不当或考虑不周某些服务器仍支持其他可解析的扩展名如.phtml、.php7、.inc。若未将这些扩展纳入黑名单则可被用于绕过。此外Apache 需要在httpd.conf中显式配置AddType application/x-httpd-php才能识别非标准扩展因此需手动添加支持。具体操作流程编辑 Apache 的配置文件httpd.conf查找是否存在以下语句#AddType application/x-httpd-php .php .phtml取消注释并在末尾添加.php5修改为AddType application/x-httpd-php .php .phtml .php5保存文件并重启 PHPStudy 服务使配置生效。将原始的shell.php文件重命名为shell.php5。上传该文件服务器将根据新配置将其作为PHP脚本解析执行。使用蚁剑连接shell.php5成功获得 WebShell。防御建议应优先使用白名单而非黑名单策略。即使使用黑名单也必须覆盖所有可能被解析的扩展名并定期更新规则库。同时建议关闭不必要的文件解析功能。Pass-04 .htaccess 文件利用本关考察通过上传.htaccess文件来改变 Apache 解析行为的高级绕过技术。漏洞原理说明.htaccess是 Apache 提供的一种分布式配置文件可用于控制目录级的行为包括文件解析方式。当目标服务器允许上传.htaccess文件且开启了AllowOverride All时攻击者可上传自定义规则强制将特定扩展名甚至任意文件解析为 PHP 脚本。具体操作流程创建一个名为.htaccess的文本文件内容如下SetHandler application/x-httpd-php此指令表示该目录下所有文件都将被视为 PHP 文件处理。将该文件上传至服务器。如果提示不允许上传.htaccess可尝试大小写变换如.HtAccess或编码绕过。准备一张图片马在正常 GIF 图片头部插入一句话木马并确保前六个字节为GIF89a以便通过类型检测。将该图片另存为shell.jpg并上传。访问shell.jpg的URL由于.htaccess规则作用服务器会将其当作 PHP 脚本执行触发木马代码。使用蚁剑连接该 URL成功建立会话。防御建议应在 Web 目录中禁用.htaccess文件的解析功能或在 Apache 主配置中设置AllowOverride None。同时禁止上传点所在目录具有脚本执行权限。Pass-05 .user.ini 文件利用本关考察利用 PHP 的用户配置文件.user.ini实现持久化代码执行的技术。漏洞原理说明从 PHP 5.3.0 开始CGI/FastCGI 模式下支持每个目录下的.user.ini文件自动加载。该文件可用于设置auto_prepend_file或auto_append_file使得每次请求 PHP 文件时都会自动包含指定文件。若攻击者能上传.user.ini和恶意图片马则可在后续访问中触发包含实现命令执行。前提条件PHP 版本 ≥ 5.3.0运行模式为 CGI/FastCGI上传目录可写且能访问具体操作流程创建.user.ini文件内容如下auto_prepend_fileshell.jpg表示每个 PHP 页面执行前都会包含shell.jpg。上传该.user.ini文件。准备一个图片马shell.jpg其内容开头为GIF89a并嵌入一句话木马。上传shell.jpg。等待缓存刷新默认user_ini.cache_ttl300秒或修改 php.ini 将其设为较小值如10秒并重启服务。访问任意已存在的 PHP 页面如readme.php服务器将自动包含shell.jpg触发木马。使用蚁剑连接该页面成功获取 WebShell。防御建议应禁止上传.ini类型文件或在 PHP 配置中设置user_ini.filename来禁用.user.ini功能。同时避免在用户可控目录中启用 FastCGI 模式。Pass-06 大小写绕过本关考察黑名单过滤过程中未统一转换文件名大小写所导致的绕过漏洞。漏洞原理说明服务端黑名单虽列出了.php、.php3等扩展名但在比对时未使用strtolower()统一转为小写导致如.Php、.pHp、.PHP等混合大小写的扩展名未被识别从而绕过检测。而 Windows 系统本身不区分文件扩展名大小写仍可正常解析执行。具体操作流程将原始的一句话木马文件shell.php重命名为shell.Php。直接在网页上传该文件。服务器因黑名单匹配失败而放行文件被保存为shell.Php。由于 Apache/PHP 对扩展名不敏感该文件仍会被当作 PHP 脚本解析。使用蚁剑连接shell.Php成功建立控制通道。防御建议在进行黑名单或白名单校验前应对文件扩展名统一转换为小写使用strtolower()确保比较一致性。更推荐使用白名单机制配合严格的格式校验。Pass-07 空格绕过本关考察未使用trim()清除文件名首尾空白字符所引发的安全问题。漏洞原理说明服务端黑名单检查时未调用trim()函数去除文件名两端的空格或其他空白字符如%20、\x09等。攻击者可在.php后添加空格如shell.php使黑名单匹配失效。而在实际保存时操作系统或PHP函数可能会自动忽略末尾空格最终生成合法的.php文件。具体操作流程准备shell.php文件。使用 Burp Suite 抓包在上传请求中将文件名字段改为shell.php注意末尾有一个空格。查看请求体中filenameshell.php 是否正确显示。放行数据包服务器因黑名单未命中而允许上传。文件系统通常会忽略末尾空格实际保存为shell.php。使用蚁剑连接原文件名shell.php无需带空格成功连接。注意蚁剑连接时填写的路径是shell.php而不是带有空格的名称。防御建议应对上传文件名调用trim()函数清除前后空白字符并在正则匹配或字符串比较前进行规范化处理。Pass-08 文件名末尾加点绕过本关考察 Windows 文件系统自动去除文件名末尾“.”所导致的绕过漏洞。漏洞原理说明Windows 文件系统不允许文件名以“.”结尾在保存时会自动移除末尾的点号。而服务端黑名单若仅简单地检查扩展名是否为.php未对文件名进行标准化处理则攻击者可通过上传shell.php.成功绕过检测最终被系统保存为shell.php。具体操作流程将shell.php重命名为shell.php.。使用 Burp Suite 抓包确认请求中文件名为shell.php.。放行数据包服务器接收该文件。操作系统在保存时自动去除末尾的“.”实际文件名为shell.php。该文件可被正常解析执行。使用蚁剑连接shell.php成功获取 WebShell。提示此技巧仅适用于部署在 Windows 系统上的服务器。防御建议应在服务端对文件名进行预处理移除末尾的点号和空格并拒绝包含非常规字符的文件名。同时建议使用随机文件名存储上传文件。Pass-09 ::$DATA 绕过本关考察 NTFS 文件流特性在文件上传绕过中的应用。漏洞原理说明NTFS 文件系统支持“替代数据流”ADS其中::$DATA表示主数据流。当文件名形如shell.php::$DATA时Windows 会将其视为主流文件shell.php但在黑名单检测阶段由于扩展名部分变为::$DATA常规.php检查将失效从而实现绕过。具体操作流程构造文件名为shell.php::$DATA。使用 Burp Suite 抓包在请求中将文件名字段修改为此值。放行数据包服务器因无法识别::$DATA而放行上传。文件系统将其解释为shell.php并保存。使用蚁剑连接时路径应填写shell.php不要包含::$DATA。易错点连接时务必删除::$DATA后缀否则无法访问。防御建议应禁用 NTFS 替代数据流功能或在上传前对文件名进行清洗移除特殊符号。也可在 Linux 环境下部署服务以规避此类问题。Pass-10 特殊字符组合绕过本关考察对文件名处理函数deldot()逻辑缺陷的理解与利用。漏洞原理说明服务端使用自定义函数deldot()处理文件名其逻辑是从后往前扫描遇到第一个“.”即停止处理不会继续检查之前的字符。攻击者可构造shell.php. .点空格点的形式使得函数在遇到最后一个“.”时停止未能检测到前面的.php.结构从而绕过黑名单。具体操作流程将shell.php重命名为shell.php. .注意中间有空格。使用 Burp Suite 抓包确认文件名字段为shell.php. .。放行数据包服务器因deldot()函数逻辑缺陷而放行。文件系统忽略末尾的“.”和空格最终保存为shell.php。使用蚁剑连接shell.php成功建立连接。关键点deldot()函数设计不合理未完整清理文件名结构。防御建议应彻底重构文件名处理逻辑使用正则表达式或循环方式完整清理所有无效字符。更安全的做法是使用哈希值如 md5加时间戳重命名上传文件。