• 6個”檔案上傳”功能的資訊安全風險與防護

    有些網站會提供檔案上傳的功能,例如 DropBox、社交網站提供照片上傳或是部落格網站提供檔案上傳分享等功能。

    駭客可以透過檔案上傳的方式執行惡性程式或是產生非預期的結果。因此,檔案上傳的安全防護不亞於帳號密碼的保護措施。

    這篇文章主要討論這些”檔案上傳”的網站,需要注意哪些資訊安全風險與防護的建議。

    我們會舉 6 個檔案上傳相關安全風險的原因、程式範例討論與安全防護必須要注意的建議。

     

    風險1: 檔案路徑

    file path injection 又稱為 path traversal。這樣的攻擊主要是透過檔案路徑的搜尋,間接存取其他網站的資源。

    當URL 網址的路徑內包含  ../ 就表示該網站有潛在的風險

    舉例來說,下列檔名的參數中,帶有路徑位置,因此駭客就可以藉由修改路徑位置,間接存取網站伺服器其他檔案資源。

    http://www.awesomefileupload.com/downloadFile?filename=/../downloadSrc/my_vacation_photos.zip

    例如,駭客可能會嘗試下列網址

    http://www.awesomefileupload.com/downloadFile?filename=/../../../../etc/passwd

    因此,針對這樣的攻擊,並須對於檔案名稱的輸入加以過濾。相關檔案的權限管理必須加以限制。

    風險2: Null Byte Injection

    Null 在系統內部,主要告訴電腦說,這是這個字串的結尾。

    在一些舊版的IIS 或是Java 對於這樣的 Null 並沒有妥善的處理,會導致一些非預期的行為。讓我們看幾個個案如果使用null byte (%00)在檔名中,會發生什麼情況?

    例如

    http://www.site.com/files?filename=../../../../etc/passwd%00profile.jpg

    雖然剛輸入的檔名為 JPG 結尾,但是舊版的 Java 程式讀取,

    還是會直接讀取到 /etc/passwd。

    雖然這樣的漏洞已經在 Java 7之後修正,

    但是正確的處理 Null byte 的輸入,還是處理輸入值重要的一環。

     

    風險3: 沒有適當的關閉資源

    當每一個檔案被開啟時,都有會一個相對應的 handle 紀錄該檔案開啟的狀態。

    檔案沒有被使用的時候,應該要適時的將該 Handle  關閉。讓系統資源釋放。

    如果長時間都沒有關閉 Handle,會慢慢地導致系統資源不足,

    甚至系統當機,需要重新開機才能解決。

    以下列這個例子,finally這段 code就很重要,因為不管是正常執行還是發生 I/O exception 都還是要 close file handles。

    try {
       fileIn = getUploadInputStream();
       fileOut = new FileOutputStream(validatedFilePath);
       byte[] buffer = new byte[bufferSize];
       int byteCount = 0;
       
       while ((byteCount = input.read(buffer)) >= 0) {
       //what happens if an exception happens here?
              output.write(buffer, 0, byteCount);
       }
    
    } catch (IOException ioe) {
          //handle the exception somehow
    
    
    } finally {
          //close output streams to release memory resources!
          fileIn.close();
          fileOut.close();
    }
    Close File Handle

    但是這樣的寫法,如果遇到 close file handles 又出現 exception 那麼怎辦? 還要額外在處理這樣的 exception 比較複雜。Java 7之後提供 “try-with-resources statement”的寫法,可以自動處理相關 resource 的釋放與關閉。

     

    static String readFirstLineFromFile(String path) throws IOException {
    
    
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    
    
            return br.readLine();
    
    
    
        }
    }
    try-with-resources statement

     

    風險4:上傳惡性程式

    駭客可能利用一些檔案的特性,上傳惡性程式以達到特定行為。下列是比較常見被駭客使用的檔案格式。

    • 病毒、惡性程式
    • 還有 JavaScript 可以造成 CSRF 或是XSS攻擊的 HTML
    • 可執行的程式。例如 JSP, JSPX, WAR, JAR, PHP, ASP, SH等

    以下提供相關副檔名的處理方式,如果真的需要儲存該類的副檔名,建議將該儲存的伺服器與網站伺服器分開。

    避免該儲存的檔案直接存放在與網站伺服器同一台機器。

    副檔名 防護建議
    HTMLHTM 拒絕這樣的檔案上傳。因為 HTML可以內含有害的 JavaScript
    .JS 拒絕JavaScript 可以帶來許多程式執行的風險,例如 JavaScript Injection, XSS, CSRF等。
    .jsp, .jspx 拒絕這類的檔案主要是 Java 網頁的執行。也會間接讓許多有害的程式執行。
    war 拒絕這是 JAR 檔案的集合。包含了 XML, HTML, JSP等。這樣的檔案可以控制取代整個網站的服務。更不能夠上傳。
    jpg pnggif 這些圖形檔的上傳必須要確認檔案格式的正確性。如何確認檔案格式的正確性,這邊另外介紹一個小技巧。”ImageMagick”ImageMagick是command-line的工具程式,可以用來轉換讀取各式各樣的圖形檔。使用這樣的工具,由於是 command-line 執行,要另外注意 command injection 的風險。
    .zip 在解壓縮之前要做一定的驗證。
    .doc, .ppt, .txt, 上傳之後,建議用防毒軟體做一定的掃描。

    風險5:壓縮檔炸彈

    這是一個特別製作的ZIP壓縮檔,該檔案壓縮的層數較多,壓縮之後再壓縮再壓縮…另外,解壓縮之後檔案高達好幾 G

    因此,如果網站沒有經過驗證就直接解壓縮,很容易造成該網站資源耗盡無法運作。

    http://www.unforgettable.dk/

    目前有許多程式都提供相關的 API 可以檢查壓縮檔。

    例如下列 Java 程式碼,在實際解壓縮之前,檢查該壓縮檔案解開後的大小 。

     

    import java.io.IOException;
    import java.util.Date;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    public class MainClass {
    
      public static void main(String[] args) {
    
        try {
          ZipFile zf = new ZipFile("your.zip");
          Enumeration e = zf.entries();
          while (e.hasMoreElements()) {
            ZipEntry ze = (ZipEntry) e.nextElement();
            String name = ze.getName();
    
    
            long uncompressedSize = ze.getSize();
    
    
            long compressedSize = ze.getCompressedSize();
            
            System.out.println(name);
            System.out.println(uncompressedSize);
            System.out.println(compressedSize);
            
          }
        } catch (IOException ex) {
          System.err.println(ex);
        }
      }
    }
    Get uncompressed ZIP filesize

    參考:http://www.java2s.com/Tutorial/Java/0180__File/GetuncompressedandcompressedSize.htm

     

    風險6:真實檔名

    檔案上傳 之後使用一個對照的 ID來儲存,不要用使用者所提供的檔名儲存。

    可進一步參考,這裡有些關於”檔案上傳”的安全設計建議,

    https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Uploads

    http://software-security.sans.org/blog/2009/12/28/8-basic-rules-toimplement-secure-file-uploads/

     

    摘要

    針對網站有提供檔案上傳功能,需要注意下列事項:

    • 確認檔案相關的權限,特別是寫入的權限應該要透過控管。
    • 確認檔名。例如 null byte 或是特殊符號的禁止。像是 / or \  ‘ 或是 ..。
    • 確認檔案內的型態內容。例如JPG, PNG 為副檔名時,確認該檔案是否為圖形檔。
    • 檢查檔案的 File headers以確認該檔案內容型態。
    • 用防毒軟體掃描該檔案是否為已知惡性程式。
    • 禁制特定類型可執行的檔案。例如 JS, EXE, SH, HTML 等

     

    Tags: , , , , ,

  • GHOST Vulnerability (CVE-2015-0235)

    這篇文章主要說明一個 1月底才發現的 Linux 嚴重的資訊安全風險,這個風險透過 GetHostName 的Buffer Overview 導致 Linux Server 被入侵。

    由於幾乎有的 Linux 主機都收到這個風險的影響,因此建議盡快更新 Linux 版本。這篇文章說明:

    • 這個風險是什麼
    • 影響的範圍
    • 如何偵測與更新

     

    這個風險GHOST 是什麼?

    這個風險來自於Linux glibc library. 讓駭客不需要帳號密碼就可以取得整個 Linux 主機的控制權。

    CVE-2015-0235. http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0235

    glibc 是標準 Linux C語言的程式庫,所以預設所有的 Linux 都會有這個程式庫。因此,該風險影響的範圍很大。

    駭客可以透過 gethostbyname () 這個 API,buffer overflow 的方式,入侵該 Linux 主機。

    這個 API 主要的功能為將 hostname 解析為 IP address。

    那些Linux 版本會受到影響?

    • Debian 7 (wheezy)
    • Red Hat Enterprise Linux 6 & 7
    • CentOS 6 & 7
    • Ubuntu 12.04

     

    如何檢查是否有相關服務用到glibc ?

    lsof | grep libc | awk ‘{print $1}’ | sort | uni

     

    如何更新?

    • Fix for Centos/RHEL/Fedora 5,6,7

    yum update glibc

    sudo restart

    • Fix for Ubuntu

    sudo apt-get update

    sudo apt-get dist-upgrade

    sudo restart

     

    參考資料

    Tags: , , ,

  • Free Web Security Testing ToolSet 網站資訊安全測試工具集

    這篇文章主要介紹一個工具集的VM,這個工具級主要提供 “所有” Web Security 所需要用到的工具。

    這個VM已經預先安裝好100多個網站安全測試工具(免費),只要啟動該VM即可使用。

    資訊安全測試工具主要分為兩大類:

    • 網站測試工具。這類的測試工具可以測試 CSRF, XSS, SQL injection, Cookie Session 等。
    • 主機網路入侵測試:這類的工具包含 port scanning、服務、應用程式弱點入侵等

    更重要的是 “免費”. Yes it’s all free. 這個工具集的主角就是

    Samurai Web Testing Framework http://samurai.inguardians.com/

     

    Linux Virtual Image

    這個工具集全部包含在這個  Linux Image 當中,下載這個 Image 後,用 VMware or VirtualBox 開啟就可以使用   SamuraiWTF_3.0.zip

    Download SamuraiWTF3.2.zip (3.3 GB)

    包含哪些工具呢?

    超過100個工具。有網路偵查相關的工具、主機入侵測試的工具、也有瀏覽器相關的套件、當然還有網站安全測試等工具。

    SamuraiWTF

     

     

    工具的教學

    對於這些工具不熟悉的,也可以透過下列的教學投影片學習  SamuraiWTF Course v18 – Slides.pdf

    Tags: , ,