文件上传漏洞

简单总结一下文件上传漏洞的一些绕过姿势与防御;

题库:https://github.com/c0ny1/upload-labs

综述:Webshell研究综述-阿里云能力建设团队

0x00 漏洞简介

存在条件

  1. 存在上传点
  2. 可以上传动态文件
  3. 上传目录有执行权限,并且上传的文件可执行
  4. 可访问到上传的动态文件

image-20210304222036807

0x01 基本姿势

  • 基本的服务端检测包括MIME检测等,此类可以通过抓包修改等简单绕过
  • 内容过滤,可以考虑copy命令合并图片和脚本
  • 强混淆
  • Webshell收集项目
  • 多个filename
  • 目录穿越 ../../../ .././.././../ (./是为了防止../../被过滤)
  • 解析漏洞 首先根据指纹确定中间件的版本
    • 确定是否存在00阶段类型的漏洞

0x02 高级姿势

  1. 重绘图
  2. 文件包含与PHPINFO
  3. 在线解压缩漏洞
    • webshell解压到网站目录(可使用../目录穿越)
    • 文件软链接的方式,将根目录等敏感目录软连接到自己的文件,之后将软链接压缩上传
    • image-20210304221528581

0x03 防御

image-20210304222127470

0x04 一些CTF题目

4-1 weekly-ctf-07 00截断

首先,这个问题的难点在于不只是后缀验证一次,

  1. 上传的时候必须是jpg png gif,就是下图的灰色箭头;content-type倒是不重要
  2. 红色箭头的路径会和你的文件名进行一次拼接,拼接之后再进行一次检测,这次要求你必须是php后缀
  3. 所以解决办法只能是让地址生效,拼接后后面的地方失效

这个题的重点在于这个文件路径是可控的

image-20200515221430265

那关键点就在这儿了,如何操作让a.php后边拼接部分失效呢,最简单的就是最流行的00截断法,这个要在16进制界面更改,下图2

image-20200515221950885

image-20200515222415720

这一行的0d 0a是什么意思呢

image-20200515222358315

所以要留空,留一个字符,可以是空格等

image-20200515222654609

image-20200515222714987

只需要把留空的字符改为00,forward一下就可以出flag了

image-20200515222811594

4-2 任意上传 JS形式一句话 菜刀使用

image-20200525192531360

image-20200525193041272

image-20200525193156651

image-20200525192402433

image-20200525193030249

参考资料

  1. Webshell研究综述-阿里云能力建设团队
  2. 关于00截断原理的一些思考
  3. 利用htaccess绕黑名单,mail绕过disable function
  4. 文件包含漏洞(绕过姿势)
  5. 文件上传之黑名单验证绕过