每個程式設計師都應該警惕的檔案上傳漏洞!!

2022-02-15 05:23:36 字數 2049 閱讀 8905

2023年09月13日 07:30:00 菜v菜 閱讀數 4241

hack:專注於網路安全攻防黑客技術的研究及思考,帶領新手走進黑客世界的大門。

檔案上傳漏洞是指網路攻擊者上傳了乙個可執行的檔案到伺服器並執行。這裡上傳的檔案可以是木馬,病毒,惡意指令碼或者webshell等。

假如某**有乙個允許使用者上傳的功能,使用者上傳的最終會被儲存到 /upload/ 目錄下,並且以上傳檔案時的時間日期命名,上傳檔案的字尾為字尾。小明這時上傳了乙個1.jpg的檔案,當伺服器收到使用者上傳的資料時,會在 /upload/ 目錄下新建乙個以當前時間日期命名的檔案,字尾為.jpg 。然後將接收到的使用者上傳的1.jpg裡的資料寫入到新建的檔案裡面。

漏洞成因:

由於程式設計師在對使用者檔案上傳部分的控制不足或者處理缺陷,而導致使用者可以越過其本身許可權向伺服器上傳可執行的動態指令碼檔案。打個比方來說,如果你使用 php 作為伺服器端的動態**環境,那麼在你的**的上傳功能處,就一定不能讓使用者上傳 php 型別的檔案,否則他上傳乙個一句話木馬,你伺服器上的檔案就可以被他任意更改了。因此檔案上傳漏洞帶來的危害常常是毀滅性的,apache、tomcat、nginx等都曝出過檔案上傳漏洞。

一般我們會利用檔案上傳漏洞上傳一句話木馬,然後用菜刀連線獲取 webshell。但是這裡有兩個問題:

伺服器上傳檔案命名規則:

前端指令碼檢測副檔名。當客戶端選擇檔案點選上傳的時候,客戶端還沒有向伺服器傳送任何訊息,前端的 js 指令碼就對檔案的副檔名進行檢測來判斷是否是可以上傳的型別

#前端指令碼檢測,只允許上傳 .jpg格式的檔案

2.後端指令碼檢測副檔名,資料提交到後端,後端的函式對上傳檔案的字尾名進行檢測,比如黑名單檢測不允許上傳 .php 、.asp 字尾格式的檔案;白名單檢測只允許上傳 .jpg 格式的檔案

#後端php檢測

$info=pathinfo($_files["file"]["name"]);

$ext=$info['extension'];// 得到副檔名

if (strtolower($ext) == "php")

3.後端通過對上傳檔案的 content-type 型別進行黑白名單檢測過濾

#後端對上傳檔案的 content-type型別進行檢測,只允許上傳 image/gif、image/jpeg、image/pjpeg格式的檔案

if (($_files["file"]["type"] != "image/gif") && ($_files["file"]["type"] != "image/jpeg")

&& ($_files["file"]["type"] != "image/pjpeg"))

注意:在生產環境中的過濾,往往是這些方法都會結合的,而不只是單單的某乙個過濾方法。生產環境中的過濾是很嚴格的

例如:我們上傳 1.php%00.jpg 時,首先字尾名是合法的jpg格式,可以繞過前端的檢測。上傳到後端後,後端判斷檔名字尾的函式會認為其是乙個.jpg格式的檔案,可以躲過白名單檢測。但是在儲存檔案時,儲存檔案時處理檔名的函式在遇到%00字元認為這是終止符,於是丟棄後面的 .jpg,於是我們上傳的 1.php%00.jpg 檔案最終會被寫入 1.php 檔案中並儲存在服務端。

00截斷實驗:

這個實驗對使用者上傳檔案是這樣處理的,首先會對使用者上傳檔案的字尾名進行檢測,只能上傳 jpg/gif/png 格式的檔案,然後會對上傳後的檔案路徑進行判斷,如果是以 php 為字尾的就會返回flag,如果是以 jpg/gif/png 為字尾就會顯示儲存路徑為固定的:./uploads/8a9e5f6a7a789acb.php

客戶端檢測,使用 js 對上傳檢測,包括檔案大小、副檔名、檔案型別等

服務端檢測,對檔案大小、檔案路徑、副檔名、檔案型別、檔案內容檢測、對檔案重新命名等

其他限制,如伺服器端上傳目錄設定不可執行許可權

檢查**有沒有檔案解析漏洞和檔案包含漏洞

每個程式設計師都應該學習使用Python或Ruby

如果你是個學生,你應該會c,c 和j a。還會一些vb,或c net。多少你還可能開發過一些web網頁,你知道一些html,css和j ascript知識。總體上說,我們很難發現會有學生顯露出掌握超出這幾種語言範圍外的語言的才能。這真讓人遺憾,因為還有很多種程式語言,它們能讓你成為乙個更好的程式設計...

每個程式設計師都應該經歷一次軟考

今天討論的問題可能會引起很多爭議,但我還是堅持做有爭議的敢說真話的人 軟考在很多各大高校裡還是比較流行的,只能說是流行而已,60 的人只是去湊熱鬧為國家軟考辦去做貢獻的,為什麼要說 每個程式設計師都應該經歷一次軟考 呢,這是源自於本人從軟考中得到的感悟吧,在園子裡很多人都是經歷過軟考的,有的人會說軟...

每個程式設計師都應該了解的記憶體知識1 記憶體概述

英文原文 早期的計算機很簡單,它的各種元件如cpu 記憶體 大容量儲存和網路介面都是一起開發的,所以效能差不多。舉個例子來說,記憶體和網路介面提供資料的速度不會比cpu快多少。這種情況隨著計算機基本結構的固化和各子系統的優化慢慢地發生了改變。其中一些元件的效能開始落後,成為系統的瓶頸。特別是大容量儲...