题目

考点
本关服务端校验的是扩展名黑名单——它只挡掉了少数几个后缀(如.php),但没挡.htaccess。思路:先上传一个.htaccess配置文件,把.png声明成”按PHP解析”,再传一个内容为php代码的.png文件——黑名单只管文件名后缀,管不了配置规则。
开始打靶
首先上传一张正常的图片,获取到图片存储的路径

现在我们尝试上传一个php文件去读取服务器的文件,服务器返回信息不允许上传php文件

我们这里可以尝试利用上传.htaccess文件,文件内容为AddType application/x-httpd-php .png,这里的意思就是将文件后缀为.png的文件当做php去解析

接下来上传png文件,文件内容还是php代码

访问上传的文件,可以看到成功读取到了服务器的文件内容,这里服务器成功的将png文件当做php去解析了

提交内容,通关!

修复措施
本关能打成功是因为黑名单只挡了几个常见后缀,漏掉了.htaccess这种配置文件。修复要点:
- 用白名单不用黑名单:黑名单永远有漏网之鱼(
.htaccess、.user.ini、.php5、.phtml都是例子),白名单只放行明确安全的类型才靠谱。 - 禁止上传点开头的文件:
.htaccess这类隐藏配置文件一律拒绝。 - 服务端重命名:不保留用户扩展名,随机生成文件名,配置规则再怎么写也影响不到。
- 存储目录不可执行:目录禁脚本执行,
AddType写了也白写。