freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2024-22243 Spring Web UriComponentsBuilder URL 解析不当漏洞分析
2024-02-26 11:48:48

漏洞描述

Spring Framework 是一个开源的 Java 应用程序框架,UriComponentsBuilder 是 Spring Web 中用于构建和操作 URI 的工具类。

受影响版本中,由于 UriComponentsBuilder 处理 URL 时未正确过滤用户信息中的方括号[,攻击者可构造包含方括号的恶意 URL 绕过主机名验证。如果应用程序依赖UriComponentsBuilder.fromUriString()等方法对 URL 进行解析和校验,则可能导致验证绕过,出现开放重定向或 SSRF 漏洞。

影响版本

Spring Framework

  • 6.1.0 - 6.1.3

  • 6.0.0 - 6.0.16

  • 5.3.0 - 5.3.31

  • Older, unsupported versions are also affected

漏洞分析

代码 diff

https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

image

[^@\\[/?#]*: 表示匹配除了特定字符@,[,/,?,#之外的任意字符零次或多次。

  • patch 之后

[^@/?#]*: 表示匹配除了特定字符@,/,?,#之外的任意字符零次或多次。

其中原始的过滤中包含有一个符号[,而 diff 代码把它删除了,漏洞描述相对来叔非常清晰,由此可以构造出对应的 PoC,先搭建一个 Spring 的环境,编写对应的接口

@Controller  
@RequestMapping("/vul")  
public class VulController {  
  
    private static final Set<String> whiteDomains = new HashSet<>(Arrays.asList(new String[]{  
            ".a.com"  
    }));  
  
    @GetMapping  
    public String vul(@RequestParam(name = "url") String url, HttpServletResponse response) throws IOException {  
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(url).build();  
        String schema = uriComponents.getScheme();  
        String host = uriComponents.getHost();  
        String path = uriComponents.getPath();  
  
        System.out.printf("schema:%s\n", schema);  
        System.out.printf("host:%s\n", host);  
        System.out.printf("path:%s\n", path);  
  
        boolean pass = false;  
        for (String whiteDomain : whiteDomains) {  
            if (host.endsWith(whiteDomain)) {  
                pass = true;  
                break;  
            }  
        }  
        if (!pass) return "error";  
  
        return "redirect:" + url;  
    }  
}

为什么这里要这么编写代码呢

首先此处需要一处重定向的代码,所以最后使用return "redirect:" + url;
其次在实际的业务当中,最为常见的业务为登录注册业务,用户在输入完对应的信息后,服务器会发起一个请求如下http://drun1baby.com?redirect_url=http://drun1baby.com/dashboard,服务端会对 redirect_url中的参数进行校验,确保这一请求最终会重定向到http://drun1baby.com这一个主域名中,所以在对应接口中为了更切近实际业务,增加了一个白名单。

直接编写 PoC,使用[符号来绕过,随后完成经典的 SSRF Bypass

http://127.0.0.1:8080/vul?url=http%3A%2F%2Fwww.a.com%5B%40www.baidu.com

成功完成恶意重定向与 SSRF,接下来简单调试一下,由于漏洞原理非常清晰,会过的比较快。

下断点进入到UriComponentsBuilder#fromUriString

image

其中解析结果如图

image

这样一来就可以绕过白名单的检测了,随后通过@符号发起 SSRF

image

漏洞修复

patch 在前面已经分析过不再赘述

https://github.com/spring-projects/spring-framework/commit/7ec5c994c147f0e168149498b1c9d4a249d69e87

Ref

https://spring.io/security/cve-2024-22243

# SSRF # Spring漏洞 # java # Spring # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录