Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[漏洞]开启local或local-plus 并启用 enable-access 后,通过特定url能够下载机器的所有文件 #78

Closed
xiwh opened this issue Apr 7, 2023 · 5 comments

Comments

@xiwh
Copy link

xiwh commented Apr 7, 2023

例如 http://127.0.0.1:8080/storage/../xxx,通过".."就定位到储存目录的上一级, 从而直接下载储存目录同级中的xxx文件,通过这样的手段可以实现下载任意目录文件

@1171736840
Copy link
Collaborator

1171736840 commented Apr 7, 2023

此功能是通过以下方式实现的,可以通过过滤器进行拦截,或者使用其它方式实现文件访问,例如Nginx

public class FileStorageAutoConfiguration implements WebMvcConfigurer {
     /**
      * 配置本地存储的访问地址
      */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        for (FileStorageProperties.Local local : properties.getLocal()) {
            if (local.getEnableAccess()) {
                registry.addResourceHandler(local.getPathPatterns()).addResourceLocations("file:" + local.getBasePath());
            }
        }
        for (FileStorageProperties.LocalPlus local : properties.getLocalPlus()) {
            if (local.getEnableAccess()) {
                registry.addResourceHandler(local.getPathPatterns()).addResourceLocations("file:" + local.getStoragePath());
            }
        }
    }
}

@xiwh
Copy link
Author

xiwh commented Apr 7, 2023

上面有误, 不能通过特定url任意访问机器内所有文件,但是可以无视base-path访问storage-path内的所有文件,建议addResourceLocations时将local.getStoragePath()+local.getBasePath()添加进去解决。
但是 FileStorageService 的实现类LocalPlusFileStorage和LocalFileStorage依然有这样的漏洞,如果传入非法url将导致能够操作任意路径文件,建议在拼接路径后做一次判断,下面有个例子可以参考下:
image

@1171736840
Copy link
Collaborator

好的,感谢你的建议,我会在新版本中处理相关问题

@1171736840
Copy link
Collaborator

针对现有版本,可以查看文档,通过切面进行拦截处理

@1171736840
Copy link
Collaborator

由于工作较忙,目前新版本才接近尾声
这个 本地 base-patn 和 本地升级版本 storage-path 其实就相对于对象存储的 bucket-name ,本地升级版本 base-path 和 对象存储中的 base-path 作用一致,只是用于一个存储平台通过路径区分不同的项目,并没有隔离访问的功能,只有本地升级版会这样,应该是没什么问题的
要想避免这个情况,有以下两个办法:
1、把 base-path 写在 storage-path 中
2、通过 自定义拦截器 或 Nginx 等过滤

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants