首页 > 其他分享 >简单看下最近的Spring Secrurity、Spring漏洞(CVE-2024-22234、CVE-2024-22243)

简单看下最近的Spring Secrurity、Spring漏洞(CVE-2024-22234、CVE-2024-22243)

时间:2024-02-27 18:57:16浏览次数:36  
标签:url Spring 2024 isFullyAuthenticated host CVE com

最近的这两个cve我看国内很多情报将其评为高危,所以想着去看看原理,看完发现都比较简单,利用要求的场景也相对有限(特别是第一个),所以就随便看下就行了

Spring Security 用户认证绕过(CVE-2024-22234)

先看下官网的公告(https://spring.io/security/cve-2024-22234)

In Spring Security, versions 6.1.x prior to 6.1.7 and versions 6.2.x prior to 6.2.2, an application is vulnerable to broken access control when it directly uses the AuthenticationTrustResolver.isFullyAuthenticated(Authentication) method.

Specifically, an application is vulnerable if:

  • The application uses AuthenticationTrustResolver.isFullyAuthenticated(Authentication) directly and a null authentication parameter is passed to it resulting in an erroneous true return value.

An application is not vulnerable if any of the following is true:

  • The application does not use AuthenticationTrustResolver.isFullyAuthenticated(Authentication) directly.
  • The application does not pass null to AuthenticationTrustResolver.isFullyAuthenticated
  • The application only uses isFullyAuthenticated via Method Security or HTTP Request Security

大概意思是直接调用``AuthenticationTrustResolver.isFullyAuthenticated(Authentication)` ,若Authentication为null,则方法会永远返回真,从而产生一些与预期相反的结果。

AuthenticationTrustResolver 接口中的 isFullyAuthenticated 方法用于检查 Authentication 对象是否完全经过身份验证,即是否不是匿名用户。在 Spring Security 中,可以使用这个方法来确定用户是否已经进行了完整的身份验证。

影响版本为:

  • 6.1.0 to 6.1.6
  • 6.2.0 to 6.2.1

环境搭建

引入pom,实际调用:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

增加下密码验证和/index的无鉴权的配置(交给应用手动配置)

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((requests) -> requests
                        .requestMatchers("/", "/index").permitAll()  // 端点/、/index 无需鉴权,交给应用直接控制
                        .anyRequest().authenticated()
                )
                .formLogin((form) -> form
                        .loginPage("/login")
                        .permitAll()
                )
                .logout((logout) -> logout.permitAll());

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user =
                User.withDefaultPasswordEncoder()
                        .username("user")
                        .password("password")
                        .roles("USER")
                        .build();

        return new InMemoryUserDetailsManager(user);
    }
}

新增控制器并配置需要用户手动输入密码(isFullyAuthenticated)后才能访问的逻辑:

    @GetMapping("/index")
    @ResponseBody
    public String index(){

        // CVE-2024-22234

        // 获取当前的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        System.out.println(authentication);

        // 创建 AuthenticationTrustResolver 实例
        AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();

        // 使用 isFullyAuthenticated 方法检查是否完全经过身份验证
        boolean fullyAuthenticated = trustResolver.isFullyAuthenticated(authentication);  // 传递null返回即为true
        String msg = "";
        if (fullyAuthenticated) {
            msg = "用户已完全经过身份验证";
        } else {
            msg = "用户可能是匿名用户或者仅部分经过身份验证";
        }
        return msg;
    }

复现

正常情况下,如果没有经过认证,返回的页面为:

image-20240227112713342

进入登录页面正常登录后

image-20240227113132942

返回的页面为:

image-20240227113142148

如果开发在某些情况,比如手动清除SecurityContextHolder中的Authentication信息或通过异步处理导致在异步线程中没有可用的信息getAuthentication()返回null, 则会导致认证校验的失效,我们这里为了复现就手动置为null,

boolean fullyAuthenticated = trustResolver.isFullyAuthenticated(null);

重启应用,在不登陆的情况下,重新访问/index ,发现isFullyAuthenticated已经直接返回了true 。访问鉴权后的页面

![image-20240227115847155](/Users/shellfeel/Library/Application Support/typora-user-images/image-20240227115847155.png)

修复

修复方式也比较简单在isFullyAuthenticated 中增加了对authentication对象为空的判断

image-20240223151856512

Spring Framework SSRF or open redirect( CVE-2024-22243)

Applications that use UriComponentsBuilder to parse an externally provided URL (e.g. through a query parameter) AND perform validation checks on the host of the parsed URL may be vulnerable to a open redirect attack or to a SSRF attack if the URL is used after passing validation checks.

这个看官网描述只知道使用UriComponentsBuilder这个方法来做host校验,会导致重定向和ssrf,粗看下源码不知道是怎么回事,看了下代码更新记录,很简单只是将uri匹配中userinfo匹配的正则表达式去掉[

image-20240223175826813

pre:

private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";

now:

private static final String USERINFO_PATTERN = "([^@/?#]*)";

环境搭建

这里假设存在一个场景,后端会将用户输入的url交给UriComponentsBuilder进行验证,通过后进行正常的访问,后端有个简单的黑名单host判断(evil.com) :

String url = "http://xxx.com";
UriComponents uriComponents = UriComponents uriComponents = UriComponentsBuilder.fromUriString(url).build();
String host = uriComponents.getHost();
System.out.println("userinfo: " + uriComponents.getUserInfo());
System.out.println("host: " + host);
// 如果host为 evil.com 则会被拦截
if (host != null && host.equals("evil.com")) {
    System.out.println("403");

}else {
    System.out.println("pass");
}

简单场景,排除使用302、ip、rebind等方式,单纯从UriComponentsBuilder来进行绕过有什么办法?

复现

一般情况下我们知道绕过ssrf会用到@,如果url为http://[email protected] ,部分的host校验库会识别这个urlHost为A.com,而浏览器或者http client实际会访问B.com 利用这种差异就能绕过部分黑名单限制,直接访问恶意网站。

试下UriComponentsBuilder 可不可以:

很明显,在这个方法中,直接这么用是不行的,但根据漏洞的修复删除的正则表达式符号来看,我们在userinfo最后增加一个[,测试一下

成功绕过:

不过这样绕过后大部分情况下不能直接使用原url进行访问,因为url中存在[ 会让程序报错:

所以更多利用场景我猜可能是使用UriComponentsBuilder取的host重新进行url拼接来进行访问

总结

Spring Security中这个漏洞可能对于实战利用不大,因为黑盒测未授权都能测试出来不需要什么用户可控的绕过姿势,相对而言Spring Framework这个在实战中对于url可控的地方增加xxx[@yyy.com 可能会有奇效。

标签:url,Spring,2024,isFullyAuthenticated,host,CVE,com
From: https://www.cnblogs.com/9eek/p/18037571

相关文章

  • 联合省选 2024 游击
    \(Day-18\)被拉来集训,被后门各种大神打爆了。模拟赛天天保龄,人不为己,天诛地灭。\(Day-12\)sky开学。从当天开始,状态稳定直线下滑,感觉很难调过来了。模拟赛又双叒叕被打爆了,天天做题开摆,混日子很失败。\(Day-5\)筹集,很困。没有状态怎么办?没有状态怎么办?没有状态怎么办?没有......
  • spring重点后置处理器
    1.DefaultListableBeanFactory的作用:默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于beandefinition对象,是一个成熟的beanfactroy。最典型的应用是:在访问bean前,先注册所有的definition(可能从beandefinition配置文件中)。使用预先建立的bean定义元数......
  • 吾爱破解2024春节解题领红包活动,喜迎新春~
    (图作者|吾爱破解@Aoemax)前言K哥在这里,先祝各位小伙伴们新春快乐,财源广进,阖家幸福!吾爱破解每年都有个解题领红包活动,今年也不例外,需要我们使出看家逆向本领来分析内容获得口令红包,根据难度等级不同会获得不同数量的吾爱币,活动持续到元宵节结束。活动一共有十个题,本文分享过年......
  • springboot 统一处理请求非法参数
    通过拦截器和过滤器实现,话不多说上代码。1、重写HttpServletRequestWrapper读取body里面的内容。publicclassRequestWrapperextendsHttpServletRequestWrapper{privatefinalStringbody;publicRequestWrapper(HttpServletRequestrequest){super......
  • 2024年全网最新的百度网盘超级会员SVIP底价购买一个月仅需18元起低价购买的方式,百度网
    由于资源敏感,如果有需要可以关注公众号“沙雕表情包专业户”回复**百度网盘SVIP**,即可获得低于市场价格的优惠渠道。  **新用户:**svip会员连续包年188元,可省110元,平均一天0.51元svip会员连续包季48元,可省40元,平均一天0.53元svip会员连续包月18元,可省12元,平均一天0.6元**老......
  • 2024年全网最新的百度网盘超级会员SVIP一个月仅需18元起低价购买的方式,百度网盘SVIP大
    百度网盘如果是从官方渠道购买的话价格会比较贵**官方渠道:**SVIP一个月要40元,连续包月也要30元,SVIP一个季度要88元,连续包季也要68元SVIP一个年度要360元,连续包年也要263元 由于资源敏感,如果有需要可以关注公众号“沙雕表情包专业户”回复**百度网盘SVIP**,即可获得低于市场价格......
  • 如何创建自己的Spring Boot Starter并为其编写单元测试
    当我们想要封装一些自定义功能给别人使用的时候,创建SpringBootStarter的形式是最好的实现方式。如果您还不会构建自己的SpringBootStarter的话,本文将带你一起创建一个自己的SpringBootStarter。快速入门创建一个新的Maven项目。第三方封装的命名格式是xxx-spring-boo......
  • SDOI2024 考前做题
    1.P9126[USACO23FEB]MooRouteIIS首先注意到不一定保证\(r_i\les_i\),否则就是最短路裸题了。注意到此时相当于负权图最短路。spfa也许能过,但是我们想要复杂度确定的写法。利用一下一条边出入时间固定(至少中途不会变)的性质:不难发现每条边最多只会走一次。不妨考虑dfs,记......
  • 2024/2/2
    什么是爬虫?爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。爬虫流程其实把网络爬虫抽象开来看,它无外乎包含如下几个步骤模拟请求网页。模拟浏览器,打开目标网站。获取数据。打开网站之后,就可以......
  • 2024/2/3
    Scala语言特点Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言(静态语言需要提前编译的如:Java、C、C++等,动态语言如:JS)。1)Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方法的意思。......