• Web Security 14.10.2014

    File Upload 的資訊安全風險

    ID-10095111

    許多的網站都會提供檔案上傳的功能,

    特別是社交網站,例如照片分享、例如多媒體影片分享等

    檔案上傳如果沒有做好相關的檢查,很容易讓駭客做其他程式攻擊的使用

    這裡舉幾個例子:

     

    Case 1. 惡意程式碼的上傳

    駭客透過特別寫好的 Malicious.php,上傳時,

    透過修改 HTTP Post 中 MIME的檔案型態,

    上傳至網站,該網站的檔案位置為 website root,

    因此,該有害的 scripts 可能就會經由下列 URL 被執行

    http://www.victimsite.com/uploads/Malicious.php

     

    Case2: 副檔名為 .JPG 的執行

    對於 Apache 來說可以透過,“.htaccess”的修改,如下:

    AddType   application/x-httpd-php   .jpg

    如此一來,任何的 JPG就會當作是 PHP 的檔案來執行

     

    Case 3. Double Execution  (Malicious.php.123)

    另外, Apache 有一個 Double Extension 的功能

    舉例來說,附檔名為 Malicious.php.123

    這種情況,由於  123 的副檔名沒有被Apache 定義MIME檔案型態,

    而且.123 的檔案型態未知,

    所以,這種情況下,該檔案成功上船之後,Apache 會以 Malicious.php  的方式執行。

     

    Case 4. Image 的註解加入指令

    透過 GIMP 這樣的工具,可以在 Image 中加入註解,例如

    <?php phpinfo(); ?>

    由於這樣的 Image 還是會有合法的 File Header,

    因此單純檢查 File Header 並無法檢查出來, image 上傳成功之後,就會執行 PHP

    ImageProperty

    http://www.gimp.org/downloads/

     

    防護建議

    現在我們知道檔案上傳有許多的風險,那麼如果網站有提供網站上傳檔案的功能,

    要如何避免相關的風險呢?

    1. 重新編排新的檔案名稱

    不要直接使用使用者上傳提供的檔案名稱,

    建議可以另外產生 Hash 的檔名,另外加上時間參數。

    這樣一來,可以避免駭客很容易猜出檔案的結構、檔案名稱等。

    2. 檔案存放的位置

    另外安排檔案存放的位置,不要與原本網站網頁的位置相同。

    避免,該檔案可以直接透過 URL 重組的方式被存取執行。

     

    3. 再次檢查檔案類型

    避免,上述 malicious.php.123的狀況,

    檔案上傳之後,再次檢查該檔案類型,可利用 Linux 內建的指令 file

     

    4. 檔案執行的權限

    上傳的檔案權限設定為 read/write

    對於”執行” execution 全部禁止

    對於 Folder 的權限 execution 也應該要禁止,這樣可以避免駭客追蹤整個路徑

     

    5. Web Server 輸入的檢查與稽核

    除了在 client 端網頁輸入的檢查之後,

    檔案傳到 Web Server 也必須檢查檔案型態、檔案大小、使用者權限

    檔案數量、上傳檔案的使用者、時間、類型等紀錄。

     

    6. 白名單

    在 Web server 限制所允許檔案上傳的白名單,

    例如:檔案大小、檔案數量、檔案類型、附檔名等。

    如果有違反該白名單限制條件的,請使用者重新輸入上傳。

     

    總結

    檔案上傳是很常見的功能,但是也是最容易在資訊安全設計上被忽略的所造成的漏洞。

    該忽略主要來自原

    對於double Extension 的不熟悉,

    對於圖形檔案可以內建 comment 來執行指令的不熟悉等。

    因此,對於圖形檔案上傳,也要像對於帳號密碼輸入一樣的檢查所有輸入的合法性,

    才不會另外開了一個漏洞而不自知。

    Posted by Tony @ 1:34 pm

    Tags: , , ,

  • Leave a Reply

    Your email address will not be published.