2019 新生赛 Upload:PHTML 后缀绕过

记录文件上传题中对后缀、Content-Type 和配置文件的测试,以及利用 PHTML 后缀绕过黑名单的过程。

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

题目描述

前端会校验文件类型,像 jpg.png.gif 这样的文件名可以正常通过并上传。图片内容未经检测和过滤;后端使用黑名单进行过滤,但黑名单并不完整。

上传后,PHP 文件无法被解析,因此需要想办法让服务器将上传的文件作为 PHP 执行。

尝试过程

前端检查了文件类型,因此使用 Burp 改包,并进行了以下尝试:

  1. 在文件后缀后加点

    文件可以上传成功,但题目会取文件名最后一个点之后的内容作为保存文件的后缀,因此无法利用。

  2. 修改后缀的大小写

    可以绕过过滤并保存文件,但服务器仍会将其当作图片处理,文件不会被 PHP 解析。

  3. 上传配置文件

    .htaccess 和 .ini 文件均可上传,但无法生效。

  4. 修改 Content-Type

    Content-Type 对文件过滤没有影响。即使改为正常的 PHP MIME 类型,文件也无法被正常解析。

  5. 尝试其他 PHP 后缀

    上传 .php 和 .php5 文件时会被拦截,并提示 bad file。

  6. 尝试 .phtml 后缀

    .phtml 文件可以上传并被正常执行。在文件中写入以下代码:

    <?php echo file_get_contents('/flag'); ?>

    执行上传后的文件,即可获取 flag。

最终方法

使用黑名单中遗漏的 .phtml 后缀上传 PHP 代码,使服务器将文件作为 PHP 解析并执行,从而读取 /flag。