1. 程式人生 > >Java寫檔案時檔名\00或者\0截斷BUG導致的檔案上傳漏洞及修復

Java寫檔案時檔名\00或者\0截斷BUG導致的檔案上傳漏洞及修復

Java在上面兩種環境寫檔案時,會因為\00截斷而無法正確為新生成的檔案命名。比如使用者需要的使用者名稱abc.jsp .jpg,但經過00截斷後,生成的檔案的名稱變為abc.jsp , 因此我們在涉及到上傳的檔名沒更改名稱或者可自定義目錄的時候加以利用 測試環境: 1.windows7(x64)+tomcat7+jdk1.6 2.Linux3.0(ubuntu11.10)(x86)+tomcat7+jdk1.7 Java在上面兩種環境寫檔案時,會因為00截斷而無法正確為新生成的檔案命名。比如使用者需要的使用者名稱abc.jsp .jpg,但經過00截斷後,生成的檔案的名稱變為abc.jsp , 因此我們在涉及到上傳的檔名沒更改名稱或者可自定義目錄的時候加以利用。 測試傳送的頭部資料如下: POST /simpleUpload/write.jsp HTTP/1.1 Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Host: 192.168.200.142:8084 Content-Length: 17 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=D2EC5F95AD581EB5FD3A860FC4CE640 name=abc.jsp .jpg(注意在上傳前,這裡的空格需要我們用十六進位制編輯器將其變為00) 測試的服務端程式碼如下: <%@page import="java.io.*"%> <%     out.clear();     String filename = request.getParameter("name");     if (filename != null) {         String path = application.getRealPath("/");         String p=path + "/" + filename;         File uploadfile = new File(p);         if (!uploadfile.exists()) {             uploadfile.createNewFile();         }         out.println("System Name:"+System.getProperty("os.name"));         out.println("1.The information of UploadFile:");         if(uploadfile!=null){                 out.println("   a.the UploadFile  exists!");             out.println("   b.The path of UploadFile:    "+uploadfile.getAbsolutePath());             out.println("   c.The name of UploadFile:    "+uploadfile.getName());             p=uploadfile.getAbsolutePath().substring(0,uploadfile.getAbsolutePath().length()-5);             File bugFile=new File(p);             out.println("2.The information of BugFile:");             if(bugFile.exists()){                  out.println("   a.The BugFile  exists!");                 out.println("   b.The path of BugFile:    "+bugFile.getAbsolutePath());                 out.println("   c.The name of BugFile:   "+bugFile.getName());             }else{                 out.println("The BugFile: "+bugFile+"  does't exist!");             }             File uploadfile2 = new File(p+uploadfile.getAbsolutePath().substring(uploadfile.getAbsolutePath().length()-5));             out.println("3.Assure whether the nonexistent  UploadFile exists because of the java API or not:");             if(uploadfile2.exists()){                 out.println("   a.The nonexistent  UploadFile  exists!");                 out.println("   b.The path of nonexistent  UploadFile:    "+uploadfile2.getAbsolutePath());                 out.println("   c.The name of nonexistent  UploadFile:   "+uploadfile2.getName());             }else{                 out.println("The nonexistent  UploadFile: "+uploadfile2+" does't exist!");             }         }else             out.println("The UploadFile: "+uploadfile+"  isn't uploaded successfully!");     } else {         out.println("Null name!");     }     out.flush(); %> 1.在windows7(x64)+tomcat7+jdk1.6環境下提交的資料返回結果的截圖:
2.在Linux3.0(ubuntu11.10)(x86)+tomcat7+jdk1.7環境下提交的資料返回結果的截圖:
從上圖我們可以看到: 1點成功了,表示檔案已經上傳成功了,並且檔名abc.jsp\00.jpg沒變,且java認為這個檔案存在的。 2點也成功了,表明 abc.jps存在. 3我們用abc.jsp組全\00.jpg去確認這個檔案是否存在,結果java認為存在。 注:(這裡的00表示16進位制字元) 當我們開啟對應的目錄時,發現只有abc.jsp存在。這說明檔名00截斷是JAVA的原因。而不是系統的原因。 為了不讓web shell由於這個漏洞而得以上傳,推薦你使用fckeditor的方法,用一個正則表示式替換使用者可以定義的路徑名或者檔名,程式碼如下 filename = filename.replaceAll("\\/|\\/|\\||:|\\?|\\*|\"|<|>|\\p{Cntrl}", "_");(正則表達中\\p{Cntrl}這個是處理00字元的。)

POSIX字元類(僅應用於us-ascii)

POSIX字元類
\p{Lower} 小寫字母, [z-z]
\p{Upper} 大寫字母, [A-Z]
\p{ASCII} ASCII字元, [\x00-\x7f]
\p{Alpha} 字母, [\p{Lower}\p{Upper}]
\p{Digit} 數字, [0-9]
\p{Alnum} 字母或數字, [\p{Alpha}\p{Digit}]
\p{Punct} 標點, [!"#$%&'()*+,-./:;<=>[email protected][]\^_{}|~]
\p{Graph} 可見字元, [\p{Alnum}\p{Punct}]
\p{Print} 可列印字元, [\p{Graph}\s]
\p{Blank} 空格或製表符, [ \t]
\p{Cntrl} 控制字元, [\x00-\x1f\x7f]
\p{XDigit} 16進位制的一位數字, [0-9a-fA-F]
\p{Space} 空白符號, [ \t\n\f\r\0x0b]
\P{name}, name是以上名稱中的一個. 表示名稱name指定字符集外的字元, [^\p{name}]

相關推薦

Java檔案檔名\00或者\0截斷BUG導致檔案漏洞修復

Java在上面兩種環境寫檔案時,會因為\00截斷而無法正確為新生成的檔案命名。比如使用者需要的使用者名稱abc.jsp .jpg,但經過00截斷後,生成的檔案的名稱變為abc.jsp , 因此我們在涉及到上傳的檔名沒更改名稱或者可自定義目錄的時候加以利用 測試環境: 1

711企業網站管理程式V6.0再爆漏洞利用

前些天出了個Cookies注入漏洞,今天又翻了看了下~   在ADMIN目錄有2個上傳檔案upfile.asp和upfile2.asp   這2個元件的功能就是:無需登入後臺,無需截包,直接本地修改程式碼就能上傳asp檔案,無語中。。。。   另外,更可愛的是寫這套程式

Java下載檔案檔名出現亂碼(但檔案內容正常)

今天寫檔案下載時,發現以前忽略的問題,寫個小記錄 我們一般使用中文作業系統,所以要求的 檔名編碼最好是utf-8,國際化一點 但是,似乎實際上不是這樣 1. String fileName=new S

java解決下載檔名亂碼問題

直接上部分程式碼: String zipFileName = fileNameRoot + System.currentTimeMillis() + ".zip";// 檔名+時間戳+ .zip //得請求頭中的User-Agent

SpringMVC生成Excel和PDF檔案檔名亂碼的解決方案

解決下載的檔名為中文時的亂碼問題: //將程式碼 response.setHeader("Content-Disposition", "attachment; filename=" + URL

java匯入EXCLE檔名中文亂碼

// IE11測試過,是沒有問題的 String userAgent = request.getHeader("USER-AGENT");  if (StringUtils.contains(userAgent, "Chrome") || StringUtils.conta

jdom或dom4j讀取xml檔案如何讓dtd驗證使用本地dtd檔案或者不生效

一、寫在所有之前: 因為dom4j和jdom在這個問題上處理的方法是一模一樣的,只是一個是SAXBuilder 一個SAXReader,這裡以jdom距離,至於dom4j只需要同理替換一下就可以了。 二、問題發生的情況 當你用jdom讀取一個有 dtd驗證的xml檔案,同時

下載檔案檔名為中文相容IE和火狐

response.setContentType("application/x-download"); if (request.getHeader("User-Agent").toLowerCase()

jdom 或 dom4j讀取xml檔案如何讓dtd驗證使用本地dtd檔案或者不生效

一、寫在所有之前:因為dom4j和jdom在這個問題上處理的方法是一模一樣的,只是一個是SAXBuilder 一個SAXReader,這裡以jdom距離,至於dom4j只需要同理替換一下就可以了。二、問題發生的情況當你用jdom讀取一個有dtd驗證的xml檔案,同時你的網路是

java視訊檔案圖片

//轉載地址 https://www.cnblogs.com/smart-hwt/p/8256836.html 1.jsp頁面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%  Str

使用pyinstaller打包多個py檔案,遇到的no module ...,exe檔案一閃而過,自定義模組打包等問題

1.跳過pyinstaller的安裝,自行谷歌 2. 用cmd cd到你想要打包的py檔案所在的資料夾下面,這裡我的資料夾是ceshi;我需要打包的檔案為main.py、a1.py、a2.py 3.執行命令pyi-makespec main.py,這裡將會根據你的mai

檔案漏洞—副檔名繞過

預備知識 利用上傳漏洞可以直接得到webshell,危害非常高導致該漏洞的原因在於程式碼作者沒有對訪客提交的資料進行檢驗或者過濾不嚴,可以直接提交修改過的資料繞過副檔名的檢驗。 實驗目的 通過修改檔名,繞過黑名單,上傳一句話木馬,拿到webshell 實驗工具 一句

教大家修復OD複製可執行檔案所有修改無法顯示的BUG

不知道大家有沒有這種經歷  在用OD複製被修改後的程式時  無法載入 所有修改 項   無殼的程式也會偶爾蹦出沒有所有修改項 那麼 我教大家怎麼修復這個bug 下圖中的兩個地址     00422657     0

caffe下使用g++編譯cpp檔案 遇到 fatal error: cublas_v2.h: 沒有那個檔案或目錄

一、前言        在caffe下使用g++編譯cpp檔案生成bin檔案時突然遇到 fatal error: cublas_v2.h: 沒有那個檔案或目錄 這個吐血問題,通過查詢資料找到解決的方法了 二、g++編譯生成bin檔案        本人的編譯命令是 g++

純自創新浪部落格前端專案js和html自己操作步驟詳細,用到的圖片已,已90%但非完整專案

//這部分是html檔案 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

Access 開啟mdb檔案需要密碼,開啟每一個mdb檔案都需要。

進來出現了一個問題,使用access 2007開啟任何一個mdb檔案時都需要密碼,其實這些檔案沒有設定密碼。問題解決過程: 從網上查詢資料得知是access的工作組裡設定了密碼,找了半天沒有找的怎麼取消工作組的方法,後來又查詢到儲存在C:/Documents and Sett

setup : esxi5.1.0 不能用ssh安裝檔案

在esxi5.1.0虛擬主機上安裝作業系統前, 需要向虛擬主機中傳入.iso. 使用SSH Secure Shell Client 向虛擬主機傳iso時, 顯示失敗資訊: Error 8: /vmimages/setupfile/winxpsp3.iso (dst): un

servlet3.0 getPart()與getParts()獲取檔案

需求: servlet3.0以上,就是tomcat7.0以上,web.xml->web-app->version 3.0以上, 不需要引入其它的jar包 Servlet類需要添加註釋@MultipartConfig, 必要, 否則request.getPart(

phpcms v9.6.0任意檔案漏洞(CVE-2018-14399)

phpcms v9.6.0任意檔案上傳漏洞(CVE-2018-14399) 一、漏洞描述 PHPCMS 9.6.0版本中的libs/classes/attachment.class.php檔案存在漏洞,該漏洞源於PHPCMS程式在下載遠端/本地檔案時沒有對檔案的型別做正確的校驗。遠端攻擊者可以利用該漏洞上傳並

Servlet編程專題11之Servlet3.0特性實現文件

servlet 文件上傳 特性 - 使用Servlet3.0實現文件上傳,不需要借助第三方的jar包。1、在index.jsp文件中編寫文件上傳的表單:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>