防范文件上传漏洞的核心思想是:确保上传的文件不会被服务器解析成可执行的脚本, 进而引发偏离功能设计的意外后果。 限制文件上传的类型 (1)黑名单常常会出现遗漏或者大小写绕过等问题, 所以通常采用白名单限制安全的文件类型, 如 图片: .jpg, .png, .gif, .bmp 文档: .doc, .pdf, .txt 压缩包: .rar, .zip (2)类型限制不能只做在前端, js的限制可以很轻易绕过, 而后端的限制可以考虑以下几个方面: 扩展名检测, 需要注意%00截断或者文件名包含空格等特殊字符的绕过方式 必要的情况下,重命名用户上传的文件,杜绝上传时的文件名攻击 MIME类型检测, 恶意的代码通常会利用合法的扩展名进行伪装 对于图片上传, 可以考虑对其进行二次渲染/压缩, 将脚本嵌入到一张完全合法的图片中不是难事, 但二次渲染可彻底破坏恶意代码 限制上传文件的大小 (1)限制上传文件的大小,防止由于内存、磁盘耗尽造成的拒绝服务。 (2)可以配置web server允许的最大Post大小 (3)可以在代码层面获取上传文件的大小, 根据文件类型的不同进行进一步的过滤 确保上传的文件被访问时能按照功能设计正确返回 (1)将文件上传目录设置为静态资源目录, 防止被解析为脚本执行 (2)使用代理页面隐藏文件真实路径, 如/attachment/getfile.php?fileid=123 (3)使用上述方式时, 确保Content-Type与实际文件类型一致 (4)如果文件不允许在页面展示, 仅允许下载, 请设置Content-disposition: attachment
其他 (1)确保上传的文件放在安全的路径下, 必要时可将上传的文件存放于web server之外的远程服务器 (2)确保web server版本为最新, 防止由于web server漏洞造成的文件意外解析 (3)部分文件上传攻击会配合本地文件包含(LFI)漏洞进行, 所以需要确保web服务不存在LFI漏洞
|
评论前必须登录!
立即登录