url解析特性造成绕过访问
说明
本文主要转载自:https://xz.aliyun.com/t/10799
1.Tomcat
tomcat具有某些特性,会对/;/、/./、/../、/..;/进行特殊处理
小结
先parsePathParameters处理分号,再normalize处理斜杠、反斜杠、点
//aaa;bbb/./../ ==> parsePathParameters() ==> //aaa/./../
//aaa/./../ ==> normalize() ==> /
--> /aaa/./../
--> /aaa/../
--> /
normalize函数对参数进行了一次decodedURI()操作,所以支持传入url编码后数据,但parsePathParameters函数是直接传入参数,以下地址经过均可访问到主页:
//
/./
/.;/
/aaa/../
/;aaa
/aaa;bbb/../
/aaa;bbb/.././
/aaa/..;./
/aaa;../..;/
/.;/aaa/../
/%2e;/
绕过访问限制
当后端服务器通过用户当前请求路径来判断权限时,可能存在绕过风险,如:
攻击者使用a账户访问admin文件路径,
/;/admin
或/aaa/../admin
服务器通过路径来判断当前用户是否具备admin文件访问权限,此时HttpServletRequest.getRequestURI()取得的值是原生地址:即
/;/admin,判断不等于/admin,不可以访问
tomcat对url解析,最终值为/admin,攻击者便成功访问/admin文件
相关的具体案例:
案例:
Shiro < v1.5.2 身份认证绕过(CVE-2020-1957)
Shiro < v1.5.3 身份认证绕过(CVE-2020-11989)
Shiro < v1.6.0 身份认证绕过(CVE-2020-13933)
PS:补充 https://www.anquanke.com/post/id/230238
1.1 一句话说明
Tomcat在解析请求路径时,会自行修正路径,并使用修正后的路径来匹配对应的Servlet,Tomcat自行修正后得到的URI路径跟使用getRequestURI方法得到的URI路径不一致。造成漏洞绕过。
tomcat 分号 对URL的影响 asdadsl;123/add ===> asdadsl/add
修复方案及延伸
String uri = request.getContextPath() + request.getServletPath();
2、Spring Boot中关于%2e的Trick
2.1 低版本
当Spring Boot版本在小于等于2.3.0.RELEASE的情况下,alwaysUseFullPath为默认值false,这会使得其获取ServletPath,所以在路由匹配时相当于会进行路径标准化包括对%2e解码以及处理跨目录,这可能导致身份验证绕过。
即/no-auth/%2e%2e/auth ----> /auth
2.1 高版本
当Spring Boot版本在大于等于2.3.1.RELEASE的情况下
/no-auth/%2e%2e/auth ---> /no-auth/%2e%2e/auth
但是这样会导致/no-auth/%2e 这种情况绕过相关的验证,参考Shiro的CVE-2020-17523