正则匹配配置不当

💡 原文中文,约7400字,阅读约需18分钟。
📝

内容提要

正则匹配在权限校验中若未使用Pattern.DOTALL,可能被换行符绕过,导致安全漏洞。文章以Apache Shiro CVE-2022-32532和Spring Security CVE-2022-22978为例,说明默认配置风险及修复方法,强调应显式设置DOTALL,并避免使用模糊路径取值。

🔎

延伸解读

默认正则模式的隐藏风险

Java正则默认不匹配换行符,若权限校验直接使用Pattern.compile(regex),攻击者可在路径中注入%0a等编码换行符绕过匹配。文章示例中,/permit/a\nb在默认模式下不匹配,但启用DOTALL后匹配,说明默认配置可能造成安全漏洞。

框架漏洞修复对比

Apache Shiro CVE-2022-32532和Spring Security CVE-2022-22978均因正则默认配置不当导致绕过。修复方式是在Pattern.compile时显式添加Pattern.DOTALL标志,确保点号匹配包括换行符在内的所有字符。开发者应关注框架版本更新,及时应用补丁。

实际利用条件与建议

漏洞利用需特定场景,如路径使用{value}取值时可能被绕过,但实际开发中较少使用。建议权限校验避免使用正则匹配,若必须使用,应显式设置DOTALL,并避免模糊路径取值。同时可借助CodeQL等工具进行自动化检测。

Q&A

正则匹配在权限校验中为什么可能被绕过?

因为默认的Pattern.compile(regex)不会匹配换行符等行终止符,攻击者可以在URL中注入换行符(如%0a)来绕过正则匹配,导致权限校验被绕过。

Pattern.DOTALL标志的作用是什么?

Pattern.DOTALL标志使正则表达式中的点号(.)匹配任何字符,包括行终止符(如换行符)。默认情况下,点号不匹配行终止符,因此可能导致匹配不完整。

Apache Shiro CVE-2022-32532漏洞是如何被利用的?

攻击者通过在URL路径中注入换行符(如%0a)来绕过正则匹配,例如请求/permit/a%0any,由于默认正则不匹配换行符,导致匹配失败,从而绕过权限校验。

Spring Security CVE-2022-22978漏洞的修复方法是什么?

修复方法是在Pattern.compile()时显式设置Pattern.DOTALL标志,确保正则匹配包含换行符在内的所有字符。

使用正则匹配进行权限校验时,有哪些安全建议?

1. 使用Pattern.compile(regex, Pattern.DOTALL)显式设置DOTALL标志;2. 避免使用{value}这种模糊方式取路径值;3. 尽量在正则匹配中明确指定匹配模式。

为什么使用{value}取路径值可能带来安全风险?

使用{value}取路径值时,如果正则匹配被绕过,攻击者可能通过构造特殊路径(如包含换行符)来访问未授权的资源,因为路径值被直接用于业务逻辑,可能导致权限校验失效。

🏷️

标签

➡️

继续阅读