0x00 前言
在Java中如果在正则中,没有做标示,那么默认正则情况下,.
是不会去主动匹配\r \n
的,因为这个特性,所以导致了一些漏洞的出现,如:
- Spring Security CVE-2022-22978
- Shiro CVE-2022-32532
0x01 示例
在如下的代码中,匹配了两个不同的字符串
public static void main(String[] args) {
String regex = "a.*b";
Pattern pattern = Pattern.compile(regex);
boolean A = pattern.matcher("ab").matches();
System.out.println(A);
boolean B = pattern.matcher("a\nb").matches();
System.out.println(B);
}
默认情况运行如下图所示:
那么在一定情况下可以通过这个特性进行绕过。但是通常情况下利用起来的会比较困难,为比较鸡肋。
通常的修复方式是加Pattern.DOTALL
public static void main(String[] args) {
String regex = "a.*b";
Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
boolean A = pattern.matcher("ab").matches();
System.out.println(A);
boolean B = pattern.matcher("a\nb").matches();
System.out.println(B);
}
补充知识
Spring Security
Spring Security 是一个基于 Spring 框架的安全框架,用于实现身份认证和授权功能。它提供了一组安全性服务,如透明地保护应用程序和服务、处理身份验证和授权、处理 HTTP 安全、提供与其他安全服务的集成等。Spring Security 可以轻松地集成到现有的 Spring 应用程序中,为 Web 应用程序和 RESTful Web 服务提供强大的安全性。
Spring Security 的设计和实现遵循许多基本安全概念,如身份验证、授权、会话管理、密码学、HTTPS、防范 CSRF 和 XSS 攻击等。其核心功能包括基于 URL 或方法级别的访问控制、角色和权限管理、支持多种身份验证机制(如表单登录、HTTP Basic 和 Digest 认证、OpenID 和 OAuth 2.0 等)、支持 LDAP 和 Active Directory 集成、支持单点登录和集群环境等。
Spring Security 的优点包括灵活性、可扩展性、易于使用和集成、广泛的社区支持和文档、更好的安全性等。同时,Spring Security 还有一些缺点,比如复杂的配置、学习成本较高、一些默认配置可能不太安全等。因此,在使用 Spring Security 时,需要了解其特点和注意事项,合理配置和使用。
Spring Security优势
Spring Security 提供了在 Web 应用程序中实现身份验证和授权的全面框架。以下是 Spring Security 的几个优势:
-
安全性:Spring Security 是一个开源的安全框架,经过广泛测试和使用,深受开发人员的信赖和保证。
-
可定制性:Spring Security 可以根据开发人员的需要进行定制化,例如多认证机制、授权策略、安全日志等。
-
灵活性:Spring Security 提供了灵活的配置选项,可以在不改变应用程序代码的情况下进行配置和修改。
-
易于集成:Spring Security 可以与 Spring 框架和其他第三方框架无缝集成,使得开发人员可以轻松实现安全性。
-
简单易用:Spring Security 提供了易于理解的 API 和开发人员友好的文档,使得开发人员可以快速上手并迅速构建安全的应用程序。
shiro
Shiro(安全性质量)是一个用于身份验证,授权和加密的Java安全框架。它提供了一个易于使用的API,使应用程序能够实现安全性功能,例如会话管理,单点登录(SSO)和密码哈希。Shiro的设计目标是简单和易于使用,并提供一些可选的插件来与其他框架和技术进行集成。Shiro的灵活性和可扩展性使其成为许多Java应用程序的首选安全解决方案之一。
shiro优势
Shiro是一个Java安全框架,具有以下优势:
-
集成方便:Shiro可以很容易地集成到现有的应用程序中,使用简单。
-
全面的认证、授权机制:Shiro支持多种认证和授权机制,包括基于表单的认证、CAS单点登录、OAuth、LDAP等,可以满足各种应用场景的需求。
-
高度可定制:Shiro支持自定义Realm、Session、Cache等,可以根据具体需求进行定制。
-
支持多种协议:Shiro支持多种Web协议,包括Servlet、Websocket、JavaFX等,可以实现多种应用场景的需求。
-
安全性高:Shiro提供了安全性高的加密算法和身份认证机制,可以保障应用程序数据的安全。
-
活跃的社区支持:Shiro有一个活跃的社区,提供了大量的文档和示例代码,方便用户学习和使用。
Pattern.DOTALL
Pattern.DOTALL是一个正则表达式标志,可以在Python中使用re模块启用。它可以在匹配模式中忽略行尾符(\n)。在使用DOTALL标志时,点号(.)特殊字符将匹配任何字符,包括行尾符。如果没有启用该标志,则点号将不匹配行尾符。这在需要匹配多行文本时非常有用,例如当需要在整个文本中匹配某个模式时。
使用方法:
re.findall(‘pattern’, text, flags=re.DOTALL)
其中,re.DOTALL 可以用 16 代替,也就是使用十六进制数表示。