2019 新生赛 Upload:PHTML 后缀绕过
记录文件上传题中对后缀、Content-Type 和配置文件的测试,以及利用 PHTML 后缀绕过黑名单的过程。
题目描述
前端会校验文件类型,像 jpg.png.gif 这样的文件名可以正常通过并上传。图片内容未经检测和过滤;后端使用黑名单进行过滤,但黑名单并不完整。
上传后,PHP 文件无法被解析,因此需要想办法让服务器将上传的文件作为 PHP 执行。
尝试过程
前端检查了文件类型,因此使用 Burp 改包,并进行了以下尝试:
-
在文件后缀后加点
文件可以上传成功,但题目会取文件名最后一个点之后的内容作为保存文件的后缀,因此无法利用。
-
修改后缀的大小写
可以绕过过滤并保存文件,但服务器仍会将其当作图片处理,文件不会被 PHP 解析。
-
上传配置文件
.htaccess和.ini文件均可上传,但无法生效。 -
修改
Content-TypeContent-Type对文件过滤没有影响。即使改为正常的 PHP MIME 类型,文件也无法被正常解析。 -
尝试其他 PHP 后缀
上传
.php和.php5文件时会被拦截,并提示bad file。 -
尝试
.phtml后缀.phtml文件可以上传并被正常执行。在文件中写入以下代码:<?php echo file_get_contents('/flag'); ?>执行上传后的文件,即可获取
flag。
最终方法
使用黑名单中遗漏的 .phtml 后缀上传 PHP 代码,使服务器将文件作为 PHP 解析并执行,从而读取 /flag。