文件上传:.htaccess 与 PHP 替代标签绕过

记录利用 .htaccess 修改图片解析方式,再用 PHP 替代标签绕过内容检测的简短思路。

  • #CTF
  • #文件上传
  • #htaccess
  • #PHP

一、漏洞核心

服务端会检测上传内容并过滤 <?php,但同时存在两个问题:

  • 没有限制 .htaccess 文件上传
  • 没有过滤 PHP 的替代标签

因此可以先改变文件解析方式,再绕过 PHP 开始标签检测。

二、绕过过程

1. 上传 .htaccess

通过 Burp Suite 修改上传请求,使文件名为 .htaccess,内容如下:

<FilesMatch "test.jpg">
    SetHandler application/x-httpd-php
</FilesMatch>

Burp 中上传 .htaccess 的请求

这段配置会让匹配到的 test.jpg 按 PHP 文件处理,而不是普通图片。

2. 上传伪装图片

再上传名为 test.jpg 的文件,把被过滤的 <?php 换成 PHP 替代标签:

<script language="php">
    echo "probe_ok_666";
</script>

伪装图片中的 PHP 替代标签

访问上传后的 test.jpg,如果页面返回 probe_ok_666,说明 .htaccess 已生效,并且文件被 PHP 解析执行。

三、总结

这道题是两个绕过点的组合:.htaccess 负责把图片交给 PHP 处理,<script language="php"> 负责绕过对 <?php 的内容过滤。

四、小 Tips

  • <script language="php"> 只适用于较老的 PHP 环境,PHP 7.0 及以后已移除,遇到题目时要先判断 PHP 版本。
  • .htaccess 需要 Apache、目录允许覆盖配置,并且上传目录确实会读取该文件;换成 Nginx 时这条思路通常不适用。
  • 先使用 echo 这类无害字符串做验证,确认解析链路后再继续分析题目逻辑。
  • 文件名、MIME 类型和文件内容是三个独立的检查点,应分别观察服务器的响应。

使用工具

Burp Suite

用于拦截上传请求,修改文件名、MIME 类型和 multipart 内容,并观察上传结果。