原因分析
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的修改