日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解SpringBoot中關(guān)于%2e的Trick

瀏覽:80日期:2023-03-17 18:46:10

分享一個SpringBoot中關(guān)于%2e的小Trick。先說結(jié)論,當(dāng)SpringBoot版本在小于等于2.3.0.RELEASE的情況下, alwaysUseFullPath 為默認(rèn)值false,這會使得其獲取ServletPath,所以在路由匹配時會對 %2e 進(jìn)行解碼,這可能導(dǎo)致身份驗(yàn)證繞過。而反過來由于高版本將 alwaysUseFullPath 自動配置成了true從而開啟全路徑,又可能導(dǎo)致一些安全問題。

這里我們來通過一個例子看一下這個Trick,并分析它的原因。

首先我們先來設(shè)置SprinBoot版本

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent>

編寫一個Controller

@RestControllerpublic class httpbinController { @RequestMapping(value = 'no-auth', method = RequestMethod.GET) public String noAuth() {return 'no-auth'; } @RequestMapping(value = 'auth', method = RequestMethod.GET) public String auth() {return 'auth'; }}

接下來配置對應(yīng)的Interceptor來實(shí)現(xiàn)對除no-auth以外的路由的攔截

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(handlerInterceptor())//配置攔截規(guī)則.addPathPatterns('/**'); } @Bean public HandlerInterceptor handlerInterceptor() {return new PermissionInterceptor(); }}

@Componentpublic class PermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();uri = uri.replaceAll('//', '/');System.out.println('RequestURI: '+uri);if (uri.contains('..') || uri.contains('./') ) { return false;}if (uri.startsWith('/no-auth')){ return true;}return false; }}

由上面代碼可以知道它使用了getRequestURI來進(jìn)行路由判斷。通常你可以看到如 startsWith , contains 這樣的判斷方式,顯然這是不安全的,我們繞過方式由很多比如 .. 或 ..; 等,但其實(shí)在用 startsWith 來判斷白名單時構(gòu)造都離不開跨目錄的符號 ..那么像上述代碼這種情況又如何來繞過呢?答案就是 %2e發(fā)起請求如下

$ curl -v 'http://127.0.0.1:8080/no-auth/%2e%2e/auth'* Trying 127.0.0.1...* TCP_NODELAY set* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)> GET /no-auth/%2e%2e/auth HTTP/1.1> Host: 127.0.0.1:8080> User-Agent: curl/7.64.1> Accept: */*>< HTTP/1.1 200< Content-Type: text/plain;charset=UTF-8< Content-Length: 4< Date: Wed, 14 Apr 2021 13:22:03 GMT<* Connection #0 to host 127.0.0.1 left intactauth* Closing connection 0

RequestURI輸出為

RequestURI: /no-auth/%2e%2e/auth

可以看到我們通過 %2e%2e 繞過了PermissionInterceptor的判斷,同時匹配路由成功,很顯然應(yīng)用在進(jìn)行路由匹配時對 %2e 進(jìn)行了解碼。

我們再來切換SpringBoot版本再來看下

<version>2.3.1.RELEASE</version>

發(fā)起請求,當(dāng)然也是過了攔截,但沒有匹配路由成功,返回404

$ curl -v 'http://127.0.0.1:8080/no-auth/%2e%2e/auth'* Trying 127.0.0.1...* TCP_NODELAY set* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)> GET /no-auth/%2e%2e/auth HTTP/1.1> Host: 127.0.0.1:8080> User-Agent: curl/7.64.1> Accept: */*>< HTTP/1.1 404< Vary: Origin< Vary: Access-Control-Request-Method< Vary: Access-Control-Request-Headers< Content-Length: 0< Date: Wed, 14 Apr 2021 13:17:26 GMT<* Connection #0 to host 127.0.0.1 left intact* Closing connection 0

RequestURI輸出為

RequestURI: /no-auth/%2e%2e/auth

可以得出結(jié)論當(dāng)SpringBoot版本在小于等于2.3.0.RELEASE的情況下,其在路由匹配時會對 %2e 進(jìn)行解碼,這可能導(dǎo)致身份驗(yàn)證繞過。

那么又為什么會這樣?

在SpringMVC進(jìn)行路由匹配時會從DispatcherServlet開始,然后到HandlerMapping中去獲取Handler,在這個時候就會進(jìn)行對應(yīng)path的匹配。

我們來跟進(jìn)代碼看這個關(guān)鍵的地方 org.springframework.web.util.UrlPathHelper#getLookupPathForRequest(javax.servlet.http.HttpServletRequest)這里就出現(xiàn)有趣的現(xiàn)象,在2.3.0.RELEASE中 alwaysUseFullPath 為默認(rèn)值false

詳解SpringBoot中關(guān)于%2e的Trick

而在2.3.1.RELEASE中 alwaysUseFullPath 被設(shè)置成了true

詳解SpringBoot中關(guān)于%2e的Trick

這也就導(dǎo)致了不同的結(jié)果,一個走向了 getPathWithinApplication 而另一個走向了 getPathWithinServletMapping在 getPathWithinServletMapping 中會獲取ServletPath,ServletPath會對其解碼,這個很多講Tomcat url差異的文章都提過了,就不多說了。所以解釋了最終出現(xiàn)繞過的情況。

那么Trick的具體描述就成了當(dāng)SpringBoot版本在小于等于2.3.0.RELEASE的情況下, alwaysUseFullPath 為默認(rèn)值false,這會使得其獲取ServletPath,所以在路由匹配時會對 %2e 進(jìn)行解碼,這可能導(dǎo)致身份驗(yàn)證繞過。

而這和Shiro的CVE-2020-17523中的一個姿勢形成了呼應(yīng),只要高版本SpringBoot就可以了不用非要手動設(shè)置 alwaysUseFullPath

$ curl -v http://127.0.0.1:8080/admin/%2e* Trying 127.0.0.1...* TCP_NODELAY set* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)> GET /admin/%2e HTTP/1.1> Host: 127.0.0.1:8080> User-Agent: curl/7.64.1> Accept: */*>< HTTP/1.1 200< Content-Type: text/plain;charset=UTF-8< Content-Length: 10< Date: Wed, 14 Apr 2021 13:48:33 GMT<* Connection #0 to host 127.0.0.1 left intactadmin page* Closing connection 0

感興趣的可以再看看說不定有額外收獲

話說回來,可是為什么在高版本中 alwaysUseFullPath 會被設(shè)置成true呢?

這就要追溯到 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#configurePathMatch在spring-boot-autoconfigure-2.3.0.RELEASE中

詳解SpringBoot中關(guān)于%2e的Trick

在spring-boot-autoconfigure-2.3.1.RELEASE中

詳解SpringBoot中關(guān)于%2e的Trick

為什么要這樣設(shè)置?我們查看git log這里給出了答案。

詳解SpringBoot中關(guān)于%2e的Trick

https://github.com/spring-projects/spring-boot/commit/a12a3054c9c5dded034ee72faac20e578b5503af

當(dāng)Servlet映射為”/”時,官方認(rèn)為這樣配置是更有效率的,因?yàn)樾枰埱舐窂降奶幚磔^少。

配置servlet.path可以通過如下,但通常不會這樣配置除非有特殊需求。

spring.mvc.servlet.path=/test/

所以最后,當(dāng)SpringBoot版本在小于等于2.3.0.RELEASE的情況下, alwaysUseFullPath 為默認(rèn)值false,這會使得其獲取ServletPath,所以在路由匹配時會對 %2e 進(jìn)行解碼,這可能導(dǎo)致身份驗(yàn)證繞過。而高版本為了提高效率對 alwaysUseFullPath 自動配置成了true從而開啟全路徑,這又造就了Shiro的CVE-2020-17523中的一個利用姿勢。

到此這篇關(guān)于詳解SpringBoot中關(guān)于%2e的Trick的文章就介紹到這了,更多相關(guān)SpringBoot Trick內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久男人天堂| 国产精品麻豆久久| 日韩av资源网| 日本va欧美va欧美va精品| 亚洲天堂日韩在线| 亚洲精品九九| 国产探花一区在线观看| 国产美女精品视频免费播放软件| 国产图片一区| 国内不卡的一区二区三区中文字幕| 欧美成人aaa| 国产美女撒尿一区二区| 国内激情久久| xxxxx性欧美特大| 久久久久久久久丰满| 国产中文字幕一区二区三区| 欧美综合二区| 精品国产成人| 中文字幕色婷婷在线视频| 日韩高清一区在线| 国产精品成人自拍| www.51av欧美视频| 欧美美女一区| 日韩国产在线一| 免费在线日韩av| 日韩成人亚洲| 欧美日韩视频一区二区三区| 影视先锋久久| 99精品网站| 麻豆亚洲精品| 天堂久久av| 日本一区二区免费高清| 欧美亚洲精品在线| 日韩午夜视频在线| 精品在线网站观看| 亚洲国产综合在线看不卡| 久久亚洲欧美| 国产精品久久久久久妇女| 精品精品久久| 国产亚洲欧洲| 国产精品一区二区三区四区在线观看| 97国产精品| aa国产精品| 国产女人18毛片水真多18精品| 日韩专区精品| 免费日韩av片| 精品国产一区二| 国产精品美女| 狂野欧美性猛交xxxx| 影视先锋久久| 国产精品片aa在线观看| 国产在线不卡| 国产日韩亚洲欧美精品| 色爱综合网欧美| 蜜臀精品一区二区三区在线观看 | 最新亚洲国产| 亚洲午夜av| 午夜欧美视频| 久久国内精品视频| 国产精品一级| 亚洲欧洲美洲av| 99pao成人国产永久免费视频 | 国产精品亚洲四区在线观看 | 久久精品国语| 国产日韩欧美一区二区三区 | 亚洲一区二区动漫| 日韩不卡一二三区| 欧美日韩网址| 欧美片第1页综合| 国产99久久久国产精品成人免费| 亚洲香蕉视频| 欧美91在线|欧美| 福利视频一区| 午夜在线一区| 特黄毛片在线观看| 国产私拍福利精品视频二区| 亚洲涩涩av| 欧美精品99| 四虎8848精品成人免费网站| 国产麻豆精品| 香蕉成人久久| аⅴ资源天堂资源库在线| 日韩国产欧美一区二区三区| 久久精品av| 久久久久免费| 91精品日本| 中文字幕日韩亚洲| 极品裸体白嫩激情啪啪国产精品| 欧美国产亚洲精品| 亚洲日本免费电影| 久久一区二区三区电影| 国产伊人久久| 国产情侣一区| 美女国产精品| 欧美精品羞羞答答| 日韩av免费| 成人在线观看免费视频| 亚洲精品国产精品粉嫩| 亚洲激情av| 精品一区欧美| 欧美特黄视频| 福利一区和二区| 国产欧美三级| 亚洲a一区二区三区| 欧美日韩亚洲一区在线观看| 激情国产在线| 国产aⅴ精品一区二区三区久久| 国产精品久久乐| 六月天综合网| 久久国产尿小便嘘嘘| 亚洲天堂日韩在线| 欧美日韩四区| 亚洲欧洲一区二区天堂久久| 欧美日韩在线播放视频| av不卡在线看| 神马日本精品| 99国产精品99久久久久久粉嫩| 99久久亚洲精品蜜臀| 高清在线一区| 久久伊人久久| 黄色在线网站噜噜噜| 四虎成人av| 久久久久久久久久久9不雅视频| 国产精品1区| 国产日韩欧美一区二区三区 | 91精品1区| 久久99蜜桃| 欧洲av不卡| 99在线|亚洲一区二区| 日韩视频一区| 青青草91视频| 亚洲日本欧美| 久色成人在线| 免费一区二区视频| 亚洲精品日本| 国产精品久久久久久久免费软件| 美女性感视频久久| 日本一区二区免费高清| 日韩欧美一区二区三区在线观看| 97精品国产福利一区二区三区| 天堂成人免费av电影一区| 日本免费一区二区视频| 日韩精品中文字幕吗一区二区| 69堂免费精品视频在线播放| 国产精品亚洲欧美一级在线| 久久精品国产久精国产| 国产伊人久久| 欧美成人精品午夜一区二区| 欧美激情aⅴ一区二区三区| 麻豆91精品视频| 日韩久久精品| 亚洲黄页一区| 日韩av午夜在线观看| 欧美黄页在线免费观看| 成人看片网站| 亚洲日韩视频| 丁香婷婷久久| 国产精品美女久久久| 国产欧美亚洲一区| 日韩另类视频| 四虎精品永久免费| 国产成人精品一区二区三区免费| 在线日韩视频| 婷婷亚洲成人| av中文资源在线资源免费观看| 美女尤物久久精品| 国产在线日韩精品| 日韩av不卡在线观看| 国产麻豆精品| 日本不卡视频在线| 日本成人在线不卡视频| 99日韩精品| 亚洲欧美日韩国产| 欧美日韩精品免费观看视频完整| 国产91在线播放精品| 午夜天堂精品久久久久| 日本免费一区二区视频| 精品视频高潮| 精品捆绑调教一区二区三区| 天堂成人免费av电影一区| 麻豆精品视频在线| 首页亚洲欧美制服丝腿| 亚洲精品一级二级| 欧美丰满日韩| 久久一级电影| 久久国产精品亚洲77777| 狠狠爱成人网| 亚洲精品成a人ⅴ香蕉片| 久久国产尿小便嘘嘘| 国产精品流白浆在线观看| 97精品在线| 久久福利一区| 国产日本精品| 日本欧美韩国一区三区| 亚洲伊人av| 蜜臀精品一区二区三区在线观看| 久久精品91| 久久国产精品免费精品3p| 91高清一区| 国产欧美成人|