今天我们来总结一下假如遇到一个文件上传的功能,那么可能会存在哪些类型的漏洞呢?一个文件上传功能,实现的原理可能是这样的:
1、大多是情况下是上传图片文件,也有少部分情况是上传 pdf、doc 等文档以及压缩包
2、上传文件后,会保存在目标系统硬盘上,也可能是 OSS 平台
3、上传的文件名可能会存入数据库,方便后续使用
4、上传的文件名及文件内容会被展示给自己或者他人查看
通过功能原理,其涉及多个部分,比如系统硬盘、展示、存取数据库等,知道了原理,那么分析漏洞类型就容易多了。
在文件写入硬盘时,可能存在文件名后缀可控,直接上传 webshell 的情况,如果上传后的目录为网站系统本身,且该目录可执行,那么就可能被直接 getshell,也就是我们常说的文件上传漏洞。
可能存在文件上传漏洞的条件:
1、文件后缀可控,上传动态脚本
2、上传目标必须是网站系统,且上传后的目录可以执行动态脚本
3、如果上传后的路径为 oss 系统,且存在相对应的子域名,那么可以上传 html 文件,造成存储型 XSS 漏洞
安全的做法:上传文件的文件名和后缀不被用户控制,采用随机文件名+固定后缀的方式命名,且上传后的目标路径最好是 oss 系统,且不用子域名解析。
只要与数据库交互,那么就有可能存在 SQL 注入漏洞,所以上传的文件名,禁止包含特殊字符,大概率可以预防 SQL 注入漏洞。

只要涉及到显示,那么就有可能存在 XSS 漏洞,如果文件名可控,未做 XSS 相关防护,那么就可以用作 XSS 攻击,如果可以上传 html 类文件,那么攻击者就可以控制上传文件的内容,来做到类似存储型 XSS 的效果。

还有一种是构造恶意 PDF 文件,展示时触发 XSS:

如果上传后的文件被其他处理,比如解压缩,那么可以构造恶意压缩包,利用解压软件的问题,触发漏洞利用,还比如图片经过 ImageMagick 处理,利用 ImageMagick 的漏洞也是可以的,再比如视频文件被 FFmpeg 处理,利用 FFmpeg 的历史漏洞,也可能存在安全风险。
总之在测试时,一个小小的功能,在了解其实现原理的情况下,根据所涉及的组件和流程,一一测试,不放过任何细节,那么功夫一定不负有心人,加油!