文件上传功能导致的漏洞.
序号 | 存储文件夹下的web脚本可被执行 | 文件路径用户可控 | 文件名称用户可控 | 文件后缀用户可控(没用白名单) | 文件存储位置 | 利用效果 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 同域 | [高危] 上传.php 等 得到webshell |
2 | 0 | 0 | 0 | 1 | 同域 | [高危] 上传.html .svg 等 实现XSS |
3 | 0 | 1 | 1 | 1 | 同域 | [高危] 目录穿越 如果进程权限足够高 则可覆盖任意文件 |
4 | 0 | 0 | 1 | 1 | 同域 | 覆盖同文件夹下的任意文件 |
5 | 0 | 0 | 1 | 0 | 同域 | 覆盖同文件夹下的某个后缀的文件 |
6 | 0 | 0 | 0 | 0 | 不同域 | [低危] 无法直接利用 考虑漏洞联合 |
上传功能本身无漏洞(即只有文件内容用户可控)的情况下,可以考虑多个漏洞联合利用: 利用web应用、web中间件等漏洞.
序号 | 已知存在的漏洞 | 正常上传文件 | 联合利用效果 |
---|---|---|---|
1 | web中间件 解析漏洞 | filename.* |
webshell |
2 | web应用 本地文件包含漏洞 | filename.* |
webshell |
3 | web应用 XSS漏洞(但因严格的CSP无法触发) | filename.* |
XSS(bypass CSP) |
4 | web应用 web逻辑越权 | filename.* |
遍历已上传的文件 |
5 | web应用 未限制上传策略(上传的次数、每次的大小) | filename.* |
存储可能被占满 资源消耗型DOS |
-
上传一个文件
- filename fuzz
- .php .jsp .asp .shtml 等等奇葩payload https://github.com/1135/dictionary/blob/master/web_upload_filename_all.txt?raw=true
- content-type
- 图片
image/jpeg
image/png
- 更多参考MIME
- 图片
- filename fuzz
-
访问一个文件
- 越权遍历文件
- 0.基础 - 使用较新版本的web中间件(避免解析漏洞) 并禁止文件存储路径的web脚本解析(上传的文件只能作为数据).
- 0.上传策略 - (不强制要求)web应用未限制上传策略(上传次数、大小) 可导致存储可能被占满 存储资源耗尽导致DOS.
- 1.文件后缀 - 白名单(图片jpg jpeg png).
- 2.文件名称 - 随机hash重命名(避免遍历文件).
- 3.保存路径 - 保存到固定文件夹(web应用不要使用"用户输入的路径" 避免目录穿越).
- 4.文件位置 - 资源存储 与 web应用 建议不同域.
- 5.文件复检 - (不强制要求)例如 对图片文件进行拉伸等处理,如果处理失败则为非正常图片(构造的畸形图片).
- 6.对应记录 - 建立对应关系 每个文件都能够对应到实际上传者 便于追溯 鉴权.
- 7.访问鉴权 - 有任意用户来访问上传的文件 都可以根据其权限(身份) 判断是否有权限访问 避免越权.
- 综上 如在
www.XXcompany.com
上传的文件都保存到"对象存储"(OSS,Object Storage Service)https://file.XXcs.com/media/upload/picture/20191015162116-c21be4fc-ef24-1.png