文件上传漏洞,指用户上传了一个可执行脚本, 并通过此脚本获得了服务端命令的能力。
需要满足条件:
- 上传的文件能够被 Web 容器解释执行,所以文件上传后所在的目录是 Web 容器所覆盖到的路径
- 用户能够通过Web访问到这个文件, 如果文件上传了,但是用户无法通过Web访问,或者无法使得Web容器解释这个脚本, 那么也不是漏洞.
- 如果用户上传的文件被安全检查,格式化,图片压缩等改变了内容,则可能导致攻击不成功.
所以, validation 还是很重要. 但有时检查文件的格式可能有些问题, 比如如果用户上传 xxx.php[ ].jpg, 表面上看是一个图片, 但是很多语言把[ ] 对应十六进制的 0x00(截断字符)截断了,所以, 从服务器语言比如 PHP,C 等就解释为上传的文件是 xxx.php. (这个validation 是在前端做的, 判断文件的格式是否为.jpg)
如何防御文件上传漏洞
- 文件上传的目录设置为不可执行, 很多大型网站,将上传文件独立存储,作为静态文件处理
- 判断文件类型,推荐白名单方式. 可以结合 MIME Type
- 使用随机数改写文件名和文件路径, 上传后要被攻击者执行, 攻击者需要找到文件. 如果用户上传, 但是不能访问到文件.
- 单独设置文件服务器或域名