CVE-2020-5421 的修復(fù)方法說明

原因分析

CVE-2020-5421 的漏洞是在修復(fù)CVE-2015-5211時,留下的一個漏洞。在對url做過濾查找文件名稱前,先針對性的處理了“;jsessionid=xxxx; 在發(fā)現(xiàn)”;jsessionId=“開始到下一個分號結(jié)束的部分內(nèi)不檢查是否存在文件名稱,而漏洞就可以通過”;jsessionid=ssddfeff&setup.bat"這樣的方式存在了。

 protected String determineEncoding(HttpServletRequest request) {
     * @return the updated URI string
     */
    public String removeSemicolonContent(String requestUri) {
        return (this.removeSemicolonContent ?
                removeSemicolonContentInternal(requestUri) : removeJsessionid(requestUri));
        return (this.removeSemicolonContent ? removeSemicolonContentInternal(requestUri) : requestUri);
    }

問題出在里面混雜的removeJsessionid 這個處理,因為它做了如下的處理

    private String removeJsessionid(String requestUri) {    
        int startIndex = requestUri.toLowerCase().indexOf(";jsessionid=");  
        if (startIndex != -1) { 
            int endIndex = requestUri.indexOf(';', startIndex + 12);    
            String start = requestUri.substring(0, startIndex); 
            requestUri = (endIndex != -1) ? start + requestUri.substring(endIndex) : start; 
        }   
        return requestUri;  
    }

修改方法說明

因此修改時去掉了對jsessionid關(guān)鍵字的處理,改為對路徑中的內(nèi)容始終全部檢查,也就是去掉這個化蛇添足的步驟。

public String removeSemicolonContent(String requestUri) {
    return (this.removeSemicolonContent ?  
        removeSemicolonContentInternal(requestUri) : requestUri);
        
 }

單元測試中修改后的測試用例

@Test
    public void getRequestKeepSemicolonContent() throws 
        ....
        //  **針對CVE-2020-5421增加的測試**
        helper.getRequestUri(request)); 
        assertEquals("/foo;jsessionid=c0o7fszeb1", helper.getRequestUri(request)); 

commit:2f75212eb667a30fe2fa9b5aca8f22d5e255821f 中還補充了對Maxtrix variable 的處理,這里又跳過了對jessionid部分的處理,但這是為了避免在解析出的矩陣變量中混入了jsessionid,所以這次提交的名稱是Avoid unnecessary parsing of path params,其實里面是有兩個目的的。

附:CVE-2015-5211 的修復(fù)

在修復(fù)CVE-2015-5211的代碼中所做的處理是:解析url中的最后一節(jié)(最后一個'/'之后的內(nèi)容'),如果存在文件名稱,取得其擴展名。如果不是如下的白名單中的類型,就在頭信息中設(shè)置:

"Content-Disposition: inline;filename=f.txt"

讓其以固定的文件名稱f.txt下載,以避免出現(xiàn)不受控制的文件類型。

文件類型白名單:"txt", "text", "json", "xml", "atom", "rss", "png", "jpe", "jpeg", "jpg", "gif", "wbmp", "bmp"

[前一篇]CVE-2020-5421 的復(fù)現(xiàn)和檢測方法探尋
[后一篇]對Spring framwrok 3.1.1 修復(fù)RDF缺陷(CVE-2015-5211及CVE-2020-5421)的全過程

參考

Spring-framework 對應(yīng)CVE-2020-5421的修改
Spring-framework 對應(yīng)CVE-2015-5211的修改

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容