文件操作类漏洞防御

文件操作类漏洞防御

一、文件包含

1.绕过

  • 实际环境中不都是include $_GET['file']这样直接把变量传入包含函数的。在很多时候包含的变量/文件不是完全可控的,如以下代码指定了前缀和后缀

    • 目录穿越绕过指定前缀,构造file = ../../../../etc/passwd
    • 编码绕过前缀:../的编码为%2e%2e%2f
    • 二次编码逃过前缀:../的二次编码为%252e%252e%252f
    • 对于远程包含,使用?号绕过后缀,此时后缀将变成参数的一部分
    • %00截断后缀,只适用于PHP5.3以前的版本
    • 使用为协议phar://构造一个和后缀同路径的压缩包,比如此时file = phar://test.zip

2.防御

  • 配置open_basedir,只允许包含某个目录下的内容
  • 不允许文件包含让用户可控,直接卸载代码中
  • 尽量包含一个确定的文件,而不是一个变量或参数值
  • 检测用户输入参数,确保路径可控
  • 过滤各种../../或经过编码的%2e%2e
  • 不用远程包含,关闭allow_url_include(默认关闭),甚至关闭本地文件包含allow_url_fopen,如果需要使用则限定域名或路径
  • 使用白名单,只要不在白名单列表中的内容则验证不通过

二、文件上传

1.防御

  • 前后端仪器校验,校验后缀名,校验MIME类型
  • 后缀名的校验必须全部转换成小写进行处理
  • 使用白名单,不是白名单的一律不通过
  • 去除文件名后续的各种符号,如点和空格等
  • 针对图片文件使用二次渲染或压缩技术处理图片并另存
  • 对文件名进行重命名,先命名再移动,避免条件竞争
  • 将上传文件坐在目录的权限设置为不可执行

前端后端协同验证,在处理逻辑上需要注意不能出现逻辑漏洞。比如用户注册,如果用户名已被占用,则不能再注册(在A接口校验)。而如果注册接口B没有继续校验,则重名用户可能注册成功。

三、文件下载

1.防御

  • 过滤特殊字符.(点),使用户在URL中不能回溯上级目录
  • 震泽严格判断用户输入参数的格式
  • php.ini配置open_basedir限定文件访问范围
  • 将文件路径保存到数据库中,通过url?id=123的方式下载文件
上一篇
下一篇