【網路安全】給你講清楚什麼是文件上傳漏洞

  • 2019 年 10 月 12 日
  • 筆記

文件漏洞

什麼是文件上傳漏洞

文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行伺服器端命令的能力。常見場景是web伺服器允許用戶上傳圖片或者普通文本文件保存,而用戶繞過上傳機制上傳惡意程式碼並執行從而控制伺服器。

可以看出來這種攻擊的危害很大,攻擊者一旦拿到伺服器許可權,那必然「天下大亂」。想要預防這種攻擊必然要知道這種攻擊的原理,攻擊的方式。這樣我們才能做出更好的應對。本文就從攻擊原理攻擊方式預防方法等方面來介紹下文件上傳漏洞。知己知彼,方能百戰不殆。

文件漏洞攻擊成功的條件

一個「可疑」文件成功上傳到後台後並不代表攻擊就成功了。還必須滿足一定的條件才能才能對後台造成攻擊:

  • 首先上傳的文件能夠被Web容器解釋執行(比如php被Apache容器執行),所以文件上傳後所在的目錄要是Web容器所覆蓋到的路徑;

  • 其次,用戶能夠從Web上訪問這個文件,如果文件上傳了,但用戶無法通過Web訪問,或者無法得到Web容器解釋這個腳本,那麼也不能稱之為漏洞。

以上條件缺一不可。

一個文件上傳漏洞的列子

一般情況下,我們會通過文件名的後綴來判斷上傳的文件是否符合要求。但是在某些時候,攻擊者可以手動修改了上傳過程中的POST包,在文件名後添加一個%00位元組額,則可以截斷某些函數對文件名的判斷。因為在許多語言的函數中,比如在C、PHP等語言的常用字元串處理函數中,0x00被認為是終止符。受此影響的環境有Web應用和一些伺服器。比如應用原本只允許上傳JPG圖片,那麼可以構造文件名為xxx.php[].JPG,其中[]為十六進位的0x00字元,.JPG繞過了應用的上傳文件類型判斷;但對於伺服器來說,此文件因為0x00字元截斷的關係,最終保存文件時變成了xxx.php。

預防文件上傳漏洞的一些方法

  1. 客戶端校驗文件名

    在客戶端使用JS腳本判斷上傳的文件名是否在白名單之內,如果不符合直接拒絕上傳。但是這種校驗很容易讓攻擊者繞過,比如說攻擊者可以禁用JS,也可以先上傳一個分發的文件名,讓後將請求截住,手動將文件名改成非法的文件名。所以光前端進行校驗是遠遠不夠的,還需要後台一同進行校驗。

  2. 服務端文件名校驗

    上面提到攻擊者可以繞過前端校驗,所以還需要後台一起校驗文件名是否在白名單內。但是光校驗文件名的攻擊者還是能有辦法繞過。比如說0x00截斷(上面提到的,hacker.php%00.jpg),因此還需要其他手段進行進一步校驗。

  3. 文件頭校驗

    查看上傳過來的文件的文件頭是否和擴展名匹配。這種方式一定程度上能降低文件上傳成功的概率。但是個人覺得最穩妥的預防方法還是以下幾種。

  4. 將上傳上來的文件和Web伺服器隔離,專門存放到一台文件伺服器上,通過文件ID來訪問。如果非要將文件存放在Web伺服器一起,可以將存放文件的文件夾的可執行許可權去掉。

  5. 將上傳的文件進行隨機重新命名。

參考