安全漏洞問題5:上傳任意檔案

inzaghi1984發表於2017-11-21

安全漏洞問題5:上傳任意檔案
1.1. 漏洞描述
上傳任意檔案漏洞是指使用者可以上傳所有檔案,程式沒有檢測上傳檔案大小、型別是否是符合期望,或僅僅在客戶端對上傳檔案大小、上傳檔案型別進行限制,未在伺服器端進行驗證。惡意使用者可以利用例如上傳一些惡意的程式,比如圖片木馬。
1.2. 漏洞危害
如果上傳檔案指令碼未對使用者所上傳檔案進行任何限制,或者上傳檔案檢測可以被繞過,則可能會對伺服器造成很大危害。惡意使用者可以通過上傳木馬檔案,獲取目標伺服器的控制許可權。
1.3. 解決方案
針對上傳任意檔案漏洞, 應採取如下措施進行防範:
 對上傳檔案型別進行檢查
僅允許上傳特定的檔案型別,該檢查不能依據HTTP HEAD資訊,可以直接檢查上傳檔案的副檔名,如下示例:
//程式碼示例:限制上傳檔案為XLS
String xlsPath = props.getProperty(“xls”);
bis = new BufferedInputStream(file.getInputStream());
File upload = new File(xlsPath + “/” + fileName);

 if ("".equals(fileName)) {
     ActionMessages messages = new ActionMessages();
     messages.add("file", new ActionMessage("檔名不能為空!",false));
     saveErrors(request, messages);
     return mapping.findForward("fetchxls");
 }
 String[] fArray = fileName.split("\.");
 if (fArray.length == 1) {
     ActionMessages messages = new ActionMessages();
     messages.add("file", new ActionMessage("檔案格式無效!",false));
     saveErrors(request, messages);
     return mapping.findForward("fetchxls");
 }
 if (!"xls".equalsIgnoreCase(fArray[fArray.count()-1])) {
     ActionMessages messages = new ActionMessages();
     messages.add("file", new ActionMessage("檔案格式無效!",false));
     saveErrors(request, messages);
     return mapping.findForward("fetchxls");
 }
 if (file.getFileSize() == 0) {
     ActionMessages messages = new ActionMessages();
     messages.add("file", new ActionMessage("檔案長度為0,上傳失敗!",false));
     saveErrors(request, messages);
      return mapping.findForward("fetchxls");
 }
bos = new BufferedOutputStream(new FileOutputStream(upload));
int available = bis.available();

 限制上傳檔案的訪問許可權
 在伺服器利用系統許可權限制上傳檔案和目錄的許可權,拒絕執行許可權
 將上傳目錄從WEB空間移出,保證使用者無法直接從URL訪問到上傳檔案


相關文章