Casdoor 任意文件读取漏洞

漏洞信息

项目地址:https://github.com/casdoor/casdoor

项目官网:https://casdoor.org/

项目介绍:Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录、注册等与用户鉴权相关的一系列功能,只需几个步骤进行简单配置,与你的主应用配合,便可完全托管你的用户模块,简单省心,功能强大。

漏洞介绍:Casdoor系统 static 存在任意文件读取漏洞,攻击者可利用该漏洞获取服务器上的敏感文件。

漏洞分析

任意文件读取漏洞,搜一下相关的函数,先是 util.ReadStringFromPath() ,再跟一下定位到 routers/static_filter.go的 serveFileWithReplace 函数:

这个函数就是读取文件,然后替换下 Url ,之后返回到页面中:

image

这个 filepath.Clean 的作用是返回最短路径名,试了一下就是会把 ../ 这种给自动跳级:

image

向上跟踪:

image

然后发现这俩函数都在 StaticFilter() 函数:

image

前面有些条件:

只要 Url 不是指向 api、cas  且拼接后的文件存在( 存在就 return 了 ),就可以进行文件读取:

image

因为它的 path 会和 urlPath 拼接,然后将 path 给读取文件返回到页面的函数处理,导致的任意文件读取。

看下哪里调用了这个:

image

main 中的定义的一个全局过滤器。

现在找下能用的路由:beego 中的过滤器只有注册的路由才能使用,再加上之前的要走到文件读取,urlPath 中不能有 /api/、/cas。

路由是在这里注册 routers/router.go,就有 3 种,/api/、/.well-known/、/cas/,现在是只有 /.well-known/ 能用,试了一下发现都有访问限制。

现在就是这个漏洞的比较精彩的部分,项目中没有可用的路由了,那就找 Web 框架中是否会注册默认的路由,正好 beego 就有:

image

该目录可访问,被注册了也就可以触发过滤器:

image-20240302111442458

可以发现它触发了 StaticFilter 过滤器,不过因为是目录读取失败了,它还返回了路径。

那直接路径穿越读取文件即可:

image-20240302111406101

大概翻了下项目,发现 conf/app.conf 会配置数据库账号密码,看看能不能读取 。

也是泄露了数据库的账号密码了:

image-20240302111552514

又看了下代码,发现在 object/init.go 中,发现该项目会进行一个初始化,应该就是如果它没有名字是 admin 的组织或用户,它会添加一条进去:

image

image

image

差不多的意思就是添加个 admin/123 的用户,找几个目标登录一下看起来好像就是上面猜的那样,没有 admin 的时候,系统会默认给创建一个 admin 的用户,它的邮箱都跟上面代码的一样:

image-20240302111628574

学习总结

读文件需要有一个合适的路由,而 beego 框架本身默认注册了一个 static 的路由导致了该漏洞的利用。又发现了一个默认用户的,貌似是搭建的时候不使用 admin 就有可能会出现。


Casdoor 任意文件读取漏洞
https://liancccc.github.io/2023/12/15/技术/漏洞分析/CasdoorReadFile/
作者
守心
发布于
2023年12月15日
许可协议