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

补充

https://su18.org/post/shiro-3/

————————

说明

本文主要转载自: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

补充

https://su18.org/post/shiro-3/