欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Mvc中CommonsMultipartFile的特性實(shí)例詳解

 更新時(shí)間:2023年11月20日 15:30:59   作者:zpchcbd  
這篇文章主要給大家介紹了關(guān)于Spring?Mvc中CommonsMultipartFile特性的相關(guān)資料,SpringMVC擁有強(qiáng)大的靈活性,非侵入性和可配置性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言:

簡(jiǎn)單的記錄下Spring <= 4.1.8的CommonsMultipartFile的特性,遇到一個(gè)springmvc的一套系統(tǒng)通過(guò)該方法進(jìn)行繞過(guò)上傳解決,不過(guò)只限于windows的情況下,這篇筆記先介紹下關(guān)于CommonsMultipartFile,然后給出實(shí)例利用的情況

參考文章:https://forum.butian.net/share/815

MultipartFile是什么

在springmvc中進(jìn)行文件上傳的時(shí)候,springmvc提供了兩個(gè)封裝好的上傳組件來(lái)進(jìn)行使用,如下圖所示,分別是CommonsMultipartFile和StandardMultipartFile

StandardMultipartFile

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.8.RELEASE</version>
    </dependency>

如果要使用StandardServletMultipartResolver進(jìn)行文件上傳,需要進(jìn)行如下兩個(gè)步驟

先在springmvc-servlet.xml中配置如下multipartResolver為StandardServletMultipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />

然后在web.xml中還需要進(jìn)行如下配置multipart-config,配置在DispatcherServlet的servlet標(biāo)簽中

        <multipart-config>
            <!--上傳的文件的最大限制,單位byte-->
            <max-file-size>4194304</max-file-size>
            <!--multipart/form-data請(qǐng)求的最大限制,單位byte-->
            <max-request-size>10485760</max-request-size>
            <!--將存儲(chǔ)上載文件的目錄位置-->
            <!--<location></location>-->
        </multipart-config>

對(duì)于StandardMultipartFile類中有一個(gè)問(wèn)題就是在獲取文件名的時(shí)候?qū)崿F(xiàn)的getOriginalFilename方法是直接獲取文件名,沒(méi)有進(jìn)行過(guò)濾一些特殊字符的情況,這樣的情況就會(huì)產(chǎn)生安全問(wèn)題比如路徑跳躍

UploadController.java

@Controller
public class UploadController {
    @RequestMapping(value = "/fileupload")
    @ResponseBody
    public String test(HttpServletRequest request) throws Exception {
        MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;
        MultipartFile file = req.getFile("uploadFile");
        String realFileName = file.getOriginalFilename();
        String ctxPath = req.getSession().getServletContext().getRealPath("/tmp/");
        File dirPath = new File(ctxPath);
        if (!dirPath.exists()) {
            dirPath.mkdir();
        }
        String serverPath = ctxPath + File.separator + realFileName;
        try {
            File uploadFile = new File(serverPath);
            FileCopyUtils.copy(file.getBytes(), uploadFile);
            return serverPath;
        } catch (Exception var9) {
            var9.printStackTrace();
            return "upload fail";
        }
    }
}

上面代碼的情況下,我們直接上傳文件的話會(huì)存在目錄跳躍的問(wèn)題,結(jié)果如下所示,可以看到readme.jsp可以直接跳出tmp目錄

這里主要問(wèn)題出在getOriginalFilename方法,這里可以觀察下StandardMultipartFile的getOriginalFilename,下面的圖中可以看到?jīng)]有對(duì)../這些符號(hào)做相關(guān)的限制

CommonsMultipartFile

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.8.RELEASE</version>
    </dependency>

這里可以將代碼改為CommonsMultipartFile來(lái)進(jìn)行測(cè)試

將springmvc-servlet.xml中配置如下multipartResolver為CommonsMultipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

重新進(jìn)行發(fā)包可以發(fā)現(xiàn)就不會(huì)出現(xiàn)目錄跳躍的問(wèn)題了

這里同樣可以看下org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename,可以看到首先就會(huì)匹配/符號(hào),然后取/之后的內(nèi)容

這里主要利用了org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename,而這里有個(gè)邏輯問(wèn)題就是如果在windows下的話\\同樣可以作為分隔符來(lái)進(jìn)行識(shí)別,所以如果對(duì)于/..\..\readme.jsp這種payload的話,那么在windows的情況下同樣可以進(jìn)行利用

這邊拿windows的環(huán)境來(lái)進(jìn)行測(cè)試,結(jié)果如下所示

調(diào)試過(guò)程可以看到org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename最終取到的就是/之后的內(nèi)容

漏洞修復(fù)

這邊將pom.xml中的springmvc修改為4.1.9.RELEASE

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.9.RELEASE</version>
    </dependency>

重新測(cè)試的情況下,就無(wú)法進(jìn)行繞過(guò)了

實(shí)戰(zhàn)遇到的代碼

這邊拿前面篇頭說(shuō)的實(shí)際審計(jì)的情況,這個(gè)環(huán)境下是在/tmp/目錄下禁止訪問(wèn),所以如果要利用的話那么就需要上傳的文件不在該目錄下,那么這邊的話就可以用getOriginalFilename跨越目錄,用/..\..\readme.jsp來(lái)利用即可

    public static String upLoadFile(HttpServletRequest request) {
        MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;
        MultipartFile file = req.getFile("uploadFile");
        String realFileName = file.getOriginalFilename();
        String ctxPath = request.getContextPath();
        ctxPath = req.getSession().getServletContext().getRealPath("/tmp/");
        File dirPath = new File(ctxPath);
        if (!dirPath.exists()) {
            dirPath.mkdir();
        }

        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        String serverPath = ctxPath + File.separator + format.format(new Date()) + realFileName;

        try {
            File uploadFile = new File(serverPath);
            FileCopyUtils.copy(file.getBytes(), uploadFile);
            return serverPath;
        } catch (Exception var9) {
            var9.printStackTrace();
            return null;
        }
    }

總結(jié)

到此這篇關(guān)于Spring Mvc中CommonsMultipartFile特性的文章就介紹到這了,更多相關(guān)Spring Mvc CommonsMultipartFile特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實(shí)現(xiàn)延遲隊(duì)列的全流程詳解

    Redis實(shí)現(xiàn)延遲隊(duì)列的全流程詳解

    Redisson是Redis服務(wù)器上的分布式可伸縮Java數(shù)據(jù)結(jié)構(gòu),這篇文中主要為大家介紹了Redisson實(shí)現(xiàn)的優(yōu)雅的延遲隊(duì)列的方法,需要的可以參考一下
    2023-03-03
  • 詳解Java之冒泡排序與選擇排序

    詳解Java之冒泡排序與選擇排序

    這篇文章主要為大家介紹了Java之冒泡排序與選擇排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 關(guān)于idea2022.2?閃退的問(wèn)題

    關(guān)于idea2022.2?閃退的問(wèn)題

    最近更新了idea2022.2版本,這是一個(gè)比較大的軟件版本更迭,下面小編給大家介紹下idea2022.2?閃退的問(wèn)題及解決方法,需要的朋友可以參考下
    2022-08-08
  • 在IntelliJ IDEA 搭建springmvc項(xiàng)目配置debug的教程詳解

    在IntelliJ IDEA 搭建springmvc項(xiàng)目配置debug的教程詳解

    這篇文章主要介紹了在IntelliJ IDEA 搭建springmvc項(xiàng)目配置debug的教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 我勸你謹(jǐn)慎使用Spring中的@Scheduled注解

    我勸你謹(jǐn)慎使用Spring中的@Scheduled注解

    這篇文章主要介紹了Spring中的@Scheduled注解使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot返回json和xml的示例代碼

    SpringBoot返回json和xml的示例代碼

    本篇文章主要介紹了SpringBoot返回json和xml的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java Netty實(shí)現(xiàn)心跳機(jī)制過(guò)程解析

    Java Netty實(shí)現(xiàn)心跳機(jī)制過(guò)程解析

    這篇文章主要介紹了Java Netty實(shí)現(xiàn)心跳機(jī)制過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解

    生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解

    這篇文章主要介紹了生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java的依賴倒置原則你了解多少

    java的依賴倒置原則你了解多少

    這篇文章主要為大家詳細(xì)介紹了java的依賴倒置原則,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Java深入分析了解平衡二叉樹(shù)

    Java深入分析了解平衡二叉樹(shù)

    平衡二叉樹(shù)又被稱為AVL樹(shù)(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹(shù)或它的左右兩個(gè)子樹(shù)的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹(shù)都是一棵平衡二叉樹(shù)。本文將詳解介紹一下平衡二叉樹(shù)的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06

最新評(píng)論