文件上传 #
网站可能会提供文件上传的功能,如上传图片等,这些功能可能存在漏洞。
ctf web题目中,如果涉及考查文件上传知识点,则对应web大概率是由php编写,文件上传利用的主要过程或目的是以下全部2点:
- 利用提供的上传功能,上传一句话木马或者php脚本
- 想办法触发上传php脚本的执行,并得到脚本返回
以上2点如果有未完成的情况,则整个文件上传的过程都没有太大意义
脚本上传阶段 #
此阶段的工作流程如下:
- 上传正常合法文件
- Burpsuite抓包
- 发送到repeat模块,不断尝试修改,直到上传成功
对上传文件的限制有以下几种:
- 文件后缀限制:
- 黑名单限制了
php
,但是php[123457],phtml,pht 这些其中的某些是可以的 - 白名单只允许
jpg
等,那后续触发执行阶段再想办法
- 黑名单限制了
- 文件Magic Number限制:
- 需要添加对应文件的Magic Number,如
image/gif
的Magic NumberGIF89a
- 需要添加对应文件的Magic Number,如
- 文件内容限制:
- 不允许有
php
:则可以使用<script language='pHp'>phpinfo()</script>
- 不允许有
eval
:则可以使用assert,或者动态拼接<?php $_GET['a']($_POST['b'])?>
,利用?a=assert&b=system("ls");
,利用了php动态函数调用特性,允许使用变量作为函数名进行函数调用
- 不允许有
触发执行阶段 #
文件上传成功后,需要以某种方式将上传的脚本以php代码的形式执行:
- 如果提示了存储路径或能够猜测路径,则可以尝试直接访问路径,并测试是否能够执行成功
- 如果以上无法执行成功,则可以搭配文件包含或
.user.ini
机制触发脚本执行
确定能够执行后,使用蚁剑/hackbar之类的工具连接,获取想要的数据即可;或者直接修改上传脚本,从网页回显中获得执行结果
绕过 #
TODO