看到代码中只是对比了URI是否为/system/UserInfoSearch.do,而多加一个/并不影响正常解析,而又能让该规则匹配不到。
URL编码绕过还是用上面的代码演示,绕过手法则是换成url编码绕过的方式。
payload:/system/%55%73%65%72%49%6e%66%6f%53%65%61%72%63%68%2e%64%6f
绕过分析当Filter处理完相关的流程后,中间件会对请求的URL进行一次URL解码操作,然后请求解码后的Servlet,而在request.getRequestURL()和request.getRequestURI()中并不会自动进行解码,所以这时候直接接收过来进行规则匹配,则识别不出来。这时候导致了绕过。
Spring MVC中追加/绕过在SpringMVC中假设以如下方法配置:
<servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>特定情况下Spring匹配web路径的时候会容错后面的/
如,/admin/main.do/
修复使用该代码接受URI
String uri1 = request.getServletPath() + (request.getPathInfo() != null ? request.getPathInfo() : "");下面来尝试前面的几种绕过方式。
分号阶段绕过 payload: /login/main.do;123
多/绕过payload: //system/UserInfoSearch.do;123
URL编码绕过payload:/system/%55%73%65%72%49%6e%66%6f%53%65%61%72%63%68%2e%64%6f
../绕过payload:/system/login/../../login/main.do
均不可用,使用上面的方式接受URI后,接受过去的时候发送特殊字符一律被剔除了。打断点可见。
关注点前面提到过request.getRequestURL()和request.getRequestURI(),这些危险字符并不会自动剔除掉。可重点关注该方法。
参考https://blog.csdn.net/qq_38154820/article/details/106799046
0x02 结尾不只是Filter里面可以做权限绕过,在使用到一些Shiro框架的时候,也会有一些权限绕过的方式。