海康威视iSecure Center综合安防管理平台认证绕过分析

## 认证绕过依赖项 在每一个模块的`cas-client.properties`文件中,都有如下字段的参数配置 \# 不拦截的地址,支持正则表达式,按照组件需求配置 cas.ignore.pattern\=/login,\*.html,...

认证绕过依赖项

在每一个模块的cas-client.properties文件中,都有如下字段的参数配置

# 不拦截的地址,支持正则表达式,按照组件需求配置
cas.ignore.pattern\=/login,*.html,*.eot,*.woff,*.ttf,*.svg,*.gif,*.css,*.js,*.json,/casLogin,*.ico,*.icon,*.png,*.map,/api/meta/qrcode,/api/session,/api/session/captcha,/api/locales,/api/meta,/api/menus,......

其他模块的相关配置如下

搜索关键字: cas.ignore.pattern

image-20240708151229773.png

认证的时候是通过正则匹配的方式,来判断当前请求的路径是否需要认证

每一个模块下都有一个这样的认证函数。

image-20240708151622914.png

绕过过程调试

这里的认证绕过,主要是通过url的处理的绕过,所以关键在对url的处理上。

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter#handle

org.springframework.web.servlet.resource.ResourceHttpRequestHandler#handleRequest

过程如下:

假设我们想访问portal模块下的/front/common/getToken接口,正常情况下未授权访问后,会跳转到登录页面。

image-20240711110307929.png

跟踪一下从入口到报错,这整个过程对URL的处理。

我们的请求进入到应用后,会进入到认证过滤器,直接在SSO的认证过滤器处下断点

image-20240711110916542.png

请求的链接成功断在了断点处

image-20240711111043902.png

这个url不是忽略的,直接进入下边的else逻辑块。 这块逻辑直接拼接Cas认证路径,跳转到Cas了。

image-20240711112755512.png

上边的跟踪并没有多大意义,没有跟到对URL路径的具体处理逻辑,下边尝试构造绕过的URL,再次进行跟踪。

利用..;/绕过认证

改进url如下:https://xx.xx.xxx.x/portal/ui/login/..;/..;/front/common/getToken,利用/ui/login被忽略的特性,进行认证绕过。

直接在isRequestUrlExcluded()函数中下断点,这里事通过getRequestUrl()来获取URL路径,很大概率存在漏洞。

image-20240711113445473.png

成功返回True,也就是说成功的绕过了认证,接下来就进入了下一个过滤器。

image-20240711113713236.png

该模块一共18个过滤器,当前是第11个过滤器,

image-20240711114014012.png

在最后一个过滤器的时候,会调用处理程序,对URL路径进行处理。

org.springframework.web.servlet.resource.ResourceHttpRequestHandler#getResource通过该函数进行请求的资源获取。如果没找到就返回404,如果找到了,就进一步处理。

image-20240711141409297.png

进入getResource后默认通过如下映射处理器获取路径。

image-20240711141841685.png

如果返回空,再用如下两个映射处理器获取路径

image-20240711142632668.png

其中org.springframework.web.util.UrlPathHelper.PATH处理器已经把url路径中的;给去掉了。

org.springframework.web.util.UrlPathHelper#resolveAndCacheLookupPath

image-20240711152540679.png

其他的处理器

image-20240711143701310.png

之后就是从如下几个目录中找到对应的资源,这里很显然没找到。

image-20240711145221003.png

这里拼接了一个这样的路径,很显然找不到东西

image-20240711144604542.png

那么,这时候就因该思考,前边某个地方应该进入接口路径的处理逻辑,而不是进入文件路径的处理逻辑。

经过再次整理,在org.springframework.web.servlet.DispatcherServlet#doDispatch中找到获取映射处理器的函数调用

image-20240711161612495.png

通过getMappingsByDirectPath()在映射接口列表中获取对应的接口映射处理器

image-20240711154713030.png

当然,这是在正确获取了url路径的情况下。我们构造的绕过认证的路径,很显然不是正常路径。

正常情况下获取到的路径

image-20240711162955096.png

绕过认证构造的路径

image-20240711162400147.png

如果是接口的认证绕过,就需要消除这个影响。

利用;.css绕过认证

现在需要满足一个条件,用来绕过认证的字符,在认证绕过之后,需要利用应用自身机制把多余的字符删除掉。那么就需要认证的字符串放到url后边,利用/*.css的规则就比较合适了。

经过一番查找,很遗憾,该模块没有后缀忽略的规则。。。

image-20240711165702172.png

可绕过总结

应用程序用匹配规则是正则匹配,这个匹配特别严格,是全字符匹配。

image-20240711170620584.png

本地写了个脚本,看一下具体执行情况。大志分这么几种情况,方案一采用的是前边验证,方案二采用的后缀验证。

image-20240711172221879.png

根据上边脚本运行的情况,再匹配忽略规则,就很容易知道哪些可以用来绕过前边检查,哪些可以用来绕过后缀检查了。

  • 发表于 2024-08-12 11:20:06
  • 阅读 ( 56 )
  • 分类:Web应用

0 条评论

请先 登录 后评论