dromara / Sa-Token

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!—— 登录认证、权限认证、分布式Session会话、微服务网关鉴权、单点登录、OAuth2.0
https://sa-token.cc
Apache License 2.0
16.57k stars 2.61k forks source link

SaToken的Oauth2模块存在开放重定向漏洞风险 #529

Closed m4ra7h0n closed 5 months ago

m4ra7h0n commented 1 year ago

使用版本:

version <= 1.37.0

复现步骤:

需要先配置一个client信息,这个时候我们设置跳转的url位如下模式

@Component
public class SaOAuth2TemplateImpl extends SaOAuth2Template {

    // 根据 id 获取 Client 信息 
    @Override
    public SaClientModel getClientModel(String clientId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        if("1001".equals(clientId)) {
            return new SaClientModel()
                    .setClientId("1001")
                    .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
                    .setAllowUrl("*")
//                    .setAllowUrl("https://*sa-token.cc/") // https://www.baidu.com/sa-token.cc/
//                    .setAllowUrl("https://sa-token.cc*") // https://sa-token.cc@www.baidu.com
                    .setContractScope("userinfo")
                    .setIsAutoMode(true);
        } 
        return null;
    }

    // 根据ClientId 和 LoginId 获取openid 
    @Override
    public String getOpenid(String clientId, Object loginId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
    }

}

1.我们网站的子域名https://*sa-token.cc/ 2.我们网站的子目录https://sa-token.cc*(有可能配置的时候没有加/) 分别可以使用如下来绕过 1.https://www.baidu.com/sa-token.cc/ 2.https://sa-token.cc@www.baidu.com

然后通过正常的oauth2认证流程走,假设使用code模式,到我们接收code的地址就变成了https://www.baidu.com 如果这是一个恶意的网站那么就可以劫持用户。

我去spring-security-oauth中翻了一下,他们的的服务端有一个默认的接受code的地址叫做RedirectionEndPoint,默认接收下面模式的uri:/login/oauth2/code/*,具体的重定向地址可以配置比如http://127.0.0.1:8080/login/oauth2/code/google,google是registrationId,是注册的需要获取用户资源的客户端,而配置的时候需要一个具体的地址,不能填*。 我觉得本质问题是这块不应该使用*,而使用*的位置只能是服务端的匹配端,比如文档中的/oauth2/*处理所有oauth2请求,具体可以将此细分,比如参考spring-security的方式。而且如果文档中默认使用的是*也有可能造成一定风险,如果用户不知道有这个漏洞的话,他有可能直接拷贝过来不加修改。

如果包含了重定向的白名单校验部分,仍然可以参考spring中 路径中包括{scheme}://{userinfo}@{host}:{port}/{path}/?{p1=v1}#{fragment} spring中是进行了严格的匹配,可以看其相关重定向漏洞修复:CVE-2019-3778 以及CVE-2019-11269默认禁用子域名跳转

我不确定哈,你如果觉得有风险就修复一下。或者这个只是用户自己配置的问题。感谢。

click33 commented 1 year ago

收到

Ardep79 commented 1 year ago

使用版本:

versión <= 1.37.0

复现步骤:

需要先配置一个client信息,这个时候我们设置跳转的url位如下模式

@Component
public class SaOAuth2TemplateImpl extends SaOAuth2Template {

    // 根据 id 获取 Client 信息 
    @Override
    public SaClientModel getClientModel(String clientId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        if("1001".equals(clientId)) {
            return new SaClientModel()
                    .setClientId("1001")
                    .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
                    .setAllowUrl("*")
//                    .setAllowUrl("https://*sa-token.cc/") // https://www.baidu.com/sa-token.cc/
//                    .setAllowUrl("https://sa-token.cc*") // https://sa-token.cc@www.baidu.com
                    .setContractScope("userinfo")
                    .setIsAutoMode(true);
        } 
        return null;
    }

    // 根据ClientId 和 LoginId 获取openid 
    @Override
    public String getOpenid(String clientId, Object loginId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
    }

}

1.我们网站的子域名https://*sa-token.cc/ 2.我们网站的子目录https://sa-token.cc*(有可能配置的时候没有加/) 分别可以使用如下来绕过 1. https://www.baidu.com/sa-token.cc/ 2.https://sa-token.cc@www.baidu.com

https://www.baidu.com如果这[是](https://www.baidu.com) 一个恶意的网站那么就可以劫持用户.

我去spring-security-oauth中翻了一下,他们的的服务端有一个默认的接受code的地址叫做,默认接收下面模式RedirectionEndPoint的uri:/login/oauth2/code/*,具体的重定向地址可以配置比如http://127.0.0.1:8080/login/oauth2/code/google, google 是registrationId, 是注册我觉得本质问题是*这块 不应该使用*,而使用的位置*只能是服务端的匹配端,比如文档中的/oauth2/*处理所有oauth2请求,具体可以将此细分,比如参考spring-security的方式。而且如果文档中默认使用的是也有可能造成*一定风险,如果用户不知道有这个漏洞的话,他有可能直接拷贝过来不加修改。

{esquema}://{ userinfo }@{host}:{puerto}/{ruta}/?{p1=v1}#{ fragmento} primavera中是进行了严格的匹配,可以看其相关重定向漏洞修复:CVE-2019-3778 以及CVE-2019-11269默认禁用子域名跳转

我不确定哈,你如果觉得有风险就修复一下。或者这个只是用户自己配置的问题。感谢。

♥️

click33 commented 2 months ago

sa-token-oauth2 模块我们进行了一次大的重构,同时也修复了上述两个越权漏洞,敬请大佬再次关注,如有新 bug 及时反馈! https://sa-token.cc/doc.html#/oauth2/oauth2-check-domain

image