JSF应用URL重复/faces路径引发安全校验绕过的解决方法
JSF重复/faces路径绕过身份校验修复方案
问题根因
该漏洞由路径匹配逻辑不一致导致:
你同时配置了/faces/*的Faces Servlet前缀映射、*.xhtml等扩展名视图映射,Servlet容器的安全约束是基于原始请求URL做匹配的,现有规则仅覆盖/faces/AdminStuff/*路径,当请求携带多层重复/faces前缀时,容器判定路径不匹配安全规则直接放行;而Mojarra处理请求时会自动剥离多余的/faces前缀段,最终定位到受保护目录下的视图资源,形成未授权访问。你使用的Mojarra 2.2.8-34版本默认未对嵌套前缀映射做拦截,进一步放大了该问题。
修复方案
按优先级从高到低可选择以下方案:
- 优先移除前缀映射,仅保留扩展名映射(最稳妥,维护成本最低)
直接删除web.xml中Faces Servlet对应的/faces/*映射规则,所有JSF视图统一通过.xhtml后缀访问。同时修改安全约束的路径匹配规则,将原有的<url-pattern>/faces/AdminStuff/*</url-pattern>替换为<url-pattern>/AdminStuff/*.xhtml</url-pattern>,从根源上消除前缀匹配带来的路径绕过风险。 - 若必须保留
/faces/*前缀映射,补全安全约束匹配规则
在现有安全约束的资源集合中,补充覆盖重复前缀场景、直接访问源文件场景的匹配规则,示例配置如下:
该方案需要确保规则覆盖所有可能的异常路径形式,后续新增路径时需要同步更新匹配规则,维护成本较高。<web-resource-collection> <web-resource-name>AdminStuff</web-resource-name> <description></description> <!-- 原有单层前缀规则 --> <url-pattern>/faces/AdminStuff/*</url-pattern> <!-- 覆盖任意多层重复/faces前缀的场景 --> <url-pattern>/faces/*/AdminStuff/*</url-pattern> <!-- 拦截直接访问xhtml源文件的请求 --> <url-pattern>/AdminStuff/*.xhtml</url-pattern> </web-resource-collection> - 升级Mojarra版本并开启嵌套前缀拦截
升级至2.2.x分支的最新维护版本,在web.xml中添加如下上下文参数,强制Faces Servlet拒绝携带嵌套映射前缀的异常请求:<context-param> <param-name>javax.faces.DISABLE_FACESSERVLET_TO_NESTED_PREFIX_MAPPING</param-name> <param-value>true</param-value> </context-param> - 新增前置过滤器做路径规范化
自定义全局Servlet Filter,在请求进入安全校验逻辑前完成URL规范化,检测到连续重复的/faces路径段时,直接返回403响应,或重定向到规范化后的合法路径,从入口层拦截异常请求。
注意:所有修复方案上线前,需要逐一测试多层重复
/faces路径、直接访问.xhtml后缀、混合前缀+后缀访问等场景,确认所有受保护路径均能正常触发身份校验,无绕过风险。
内容的提问来源于stack exchange,提问作者Sam Donato
相关产品推荐
相关产品推荐

