tml大文件傳輸源碼,html大文件傳輸解決方案,html大文件傳輸思路,html大文件傳輸實例,html大文件分塊上傳,html大文件分片上傳,html大文件批量上傳,html大文件加密上傳,html文件夾上傳,html文件夾批量上傳,
網上一般的做法都是用的HTML5的API,也就是chrome提供的API,能夠滿足基本需求,但是還是有痛點,chrome限制死了,固定死了無法擴展,每個域名只允許5個TCP連接,導致了速度有上限,你也無法修改和擴展。然后就是瀏覽器也只能用chrome,用戶用了IE就不行了,用戶現有的系統跑在IE上,也不能換。
進度信息容易丟失,用戶關閉網頁,刷新網頁,關閉瀏覽器,重啟瀏覽器,關閉電腦,重啟電腦后,進度信息都會丟失,無解,沒辦法。擴展性還是差了點。
傳大文件,超大文件,文件數量多的話,前端就卡,網頁反應慢,容易死,崩潰,在配置較差的電腦或者配置一般的電腦上這個痛點體現的非常明顯。
對于大文件的處理,無論是用戶端還是服務端,如果一次性進行讀取發送、接收都是不可取,很容易導致內存問題。所以對于大文件上傳,采用切塊分段上傳
從上傳的效率來看,利用多線程并發上傳能夠達到最大效率。
斷點續傳,就是在文件上傳的過程中發生了中斷,人為因素(暫停)或者不可抗力(斷網或者網絡差)導致了文件上傳到一半失敗了。然后在環境恢復的時候,重新上傳該文件,而不至于是從新開始上傳的。
斷點續傳的功能是基于分塊上傳來實現的,把一個大文件分成很多個小塊,服務端能夠把每個上傳成功的分塊都落地下來,客戶端在上傳文件開始時調用接口快速驗證,條件選擇跳過某個分塊。
實現原理,就是在每個文件上傳前,就獲取到文件MD5取值,在上傳文件前調用接口,如果獲取的文件狀態是未完成,則返回所有的還沒上傳的分塊的編號,然后前端進行條件篩算出哪些沒上傳的分塊,然后進行上傳。
當接收到文件塊后就可以直接寫入到服務器的文件中。
導入項目:
導入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
導入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot統一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2
下載示例:
https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/
工程
NOSQL
NOSQL示例不需要任何配置,可以直接訪問測試
創建數據表
選擇對應的數據表腳本,這里以SQL為例
修改數據庫連接信息
訪問頁面進行測試
文件存儲路徑
up6/upload/年/月/日/guid/filename
相關問題:
1.javax.servlet.http.HttpServlet錯誤
2.項目無法發布到tomcat
3.md5計算完畢后卡住
4.服務器找不到config.json文件
相關參考:
文件保存位置
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
產品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授權生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
分享一些文件上傳繞過的思路,下文內容多包含實戰圖片,所以打碼會非常嚴重,可多看文字表達;本文僅用于交流學習, 由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,文章作者不為此承擔任何責任。
一次項目滲透時,通過往png后綴隨便加個字符可知該上傳點為白名單上傳,正常情況下無法繞過
通過觀察接口信息,發現接口名字為UploadImg,猜測該接口用于圖片上傳,按照開發的習慣,保不準會存在temp、test,這類的接口,隨后通過fuzz找到存在的上傳接口(file),但此時的接口(file)上傳文件仍舊存在限制,需要繞過。
由于黑名單限制不夠嚴謹,經過多個偽后綴嘗試,發現.cer后綴可繞過限制并被解析
然后就getshell進內網,后面的操作就不多說了。
很多師傅看到白名單上傳就會認為這個上傳點足夠安全,無法繞過,但其實不然,在存在多個上傳接口的情況下,或許會存在沒做限制,或者限制不嚴格的上傳點也不一定,關鍵的是我們要如何發現這些接口,在此類接口存在限制時,如何去進行繞過,下面再舉一個和接口繞過相關的例子。
【一>所有資源關注我,私信回復“資料”獲取<一】
1、200份很多已經買不到的絕版電子書
2、30G安全大廠內部的視頻資料
3、100份src文檔
4、常見安全面試題
5、ctf大賽經典題目解析
6、全套工具包
7、應急響應筆記
8、網絡安全學習路線
upload_2018.php接口白名單上傳,在正常情況下,改變后綴會導致上傳失敗,如下
再進一步測試時發現存在多個上傳接口,刪除_2018使用upload接口進行文件上傳,可導致任意文件上傳
進一步傳shell時發現存在waf(某訊云),需進一步繞過。
通過尋找域名真實IP,使用真實IP進行文件上傳,繞過waf限制,為防止有心人,這里直接把IP給打碼蓋住了,以防萬一。
很多時候有一些開發為了便捷性,在部署上傳接口時限制不夠嚴謹或壓根沒做限制,這導致一旦被繞過限制傳shell,都會導致非常嚴重的后果,當然,我們可以找一些temp、test這類上傳接口,因為此類接口多數是開發過程中用作測試的,這種接口幾乎都是無限上傳文件類型的,同樣的我們也可以找一些api文檔進行上傳接口的發現,這或許會有驚喜也說不定
這是一個把圖片轉base64的文件上傳類型,具體繞過如下:
通過抓包發現圖片是以base64進行上傳的,觀察了下數據包,發現可通過更改upload_0字段內容上傳任意文件
訪問HTML頁面,成功被解析,可進一步上傳shell獲取權限。
一句話shell上傳后發現無法執行命令,之后通過上傳PHPinfo發現其存在disable_functions,利用某斯拉繞過限制,getshell
#案例四
一個關于nginx解析漏洞的利用,這個漏洞是很久之前挖到的,這種漏洞現在應該不會存在了,單單是waf都能欄掉,這個就作為思考開拓說一下:
一次外網打點時發現了目標的一個核心系統,通過踩點發現了某上傳功能,但上傳接口存在白名單限制,且無其它的上傳接口,由于這個站的shell比較重要,必須拿到,之后通過漏洞挖掘,發現目標存在nginx解析漏洞,結合圖片上傳點成功獲取到了內網據點。
有些時候文件上傳成功后端沒有返回路徑,只回顯了一個id號,這時候如果目標存在注入的話,我們嘗試可以用sqlmap的–search參數或者SQLshell對返回的ID號進行搜索,這樣說不定就能找到shell地址了,之前在關于Swagger-UI下的滲透實戰 23也說過,感興趣的可以去看看;也有文件上傳成功卻只回顯一個文件名的,在前不久的一次攻防就遇到這種情況,后來是用了fuzz找到了完整的shell路徑,另外在某些時候,上傳文件可以跨目錄,那么我們可以通過…/進行跨目錄上傳,運氣好的話,或許會在幾個…/后把shell傳到域名的根目錄下,如果當前上傳文件夾無執行權限,那么跨目錄上傳shell也是個不錯的思路;另外,如果上傳目錄可控,可上傳文件到任意目錄的話,在linux場景我們可上傳一個ssh秘鑰用于遠程登錄,極端一點的話,可考慮上傳passwd、shadow文件覆蓋系統用戶,但前提是權限要足夠大。
如果不能跨目錄,站點又沒有注入的話,那么我們可以嘗試尋找網站日志文件,例如泛微E-COLOGY日志的日志,像這種日志文件是有規律可循的,可以用burp進行日志爆破,或許在日志文件中能找到shell路徑也說不定。
再者就是文件包含和文件讀取了,文件讀取的話可以通過讀取日志和配置文件來發現shell地址,但是成功率太低了,至于文件包含,除了靶場和ctf,實戰還沒碰過。
還有一個關于burp的使用技巧,這是真實遇到的,上傳shell后沒有回顯路徑,但是通過http history搜索shell的名字發現了完整的shell路徑,因為傳上去的文件,如圖片這類的總歸是顯示出來的,這時候可以先在web應用到處點點,多加載一些數據包,然后再到http history搜索shell的名字,或許會有驚喜也說不定。
某些時候上傳黑名單不嚴謹,那么我們可用偽后綴進行繞過,其它多的就不說了,大概思路就這樣,當繞過限制拿到shell時,總會給我帶來樂趣,或許這就是我喜歡滲透的原因。
篇文章主要介紹,如何在springboot工程作為服務器,去接收通過http 上傳的multi-file的文件。
構建工程
為例創建一個springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依賴。為例能夠上傳文件在服務器,你需要在web.xml中加入標簽做相關的配置,但在sringboot 工程中,它已經為你自動做了,所以不需要你做任何的配置。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies>
創建文件上傳controller
直接貼代碼:
@Controller public class FileUploadController { private final StorageService storageService; @Autowired public FileUploadController(StorageService storageService) { this.storageService = storageService; } @GetMapping("/") public String listUploadedFiles(Model model) throws IOException { model.addAttribute("files", storageService .loadAll() .map(path -> MvcUriComponentsBuilder .fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString()) .build().toString()) .collect(Collectors.toList())); return "uploadForm"; } @GetMapping("/files/{filename:.+}") @ResponseBody public ResponseEntity<Resource> serveFile(@PathVariable String filename) { Resource file = storageService.loadAsResource(filename); return ResponseEntity .ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+file.getFilename()+"\"") .body(file); } @PostMapping("/") public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) { storageService.store(file); redirectAttributes.addFlashAttribute("message", "You successfully uploaded " + file.getOriginalFilename() + "!"); return "redirect:/"; } @ExceptionHandler(StorageFileNotFoundException.class) public ResponseEntity handleStorageFileNotFound(StorageFileNotFoundException exc) { return ResponseEntity.notFound().build(); } }
這個類通過@Controller注解,表明自己上一個Spring mvc的c。每個方法通過 @GetMapping 或者@PostMapping注解表明自己的 http方法。
創建一個簡單的 html模板
為了展示上傳文件的過程,我們做一個界面: 在src/main/resources/templates/uploadForm.html
<html xmlns:th="http://www.thymeleaf.org"> <body> <div th:if="${message}"> <h2 th:text="${message}"/> </div> <div> <form method="POST" enctype="multipart/form-data" action="/"> <table> <tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr> <tr><td></td><td><input type="submit" value="Upload" /></td></tr> </table> </form> </div> <div> <ul> <li th:each="file : ${files}"> <a th:href="${file}" th:text="${file}" /> </li> </ul> </div> </body> </html>
上傳文件大小限制
如果需要限制上傳文件的大小也很簡單,只需要在springboot 工程的src/main/resources/application.properties 加入以下:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
測試
測試情況如圖:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。