WebShell Defense


  1. 說明
  2. 防止 WebShell Upload
    1. 白名單
    2. 改變檔名
    3. 格式置換
    4. 目錄權限限制
  3. 檢測檔案是否為 WebShell

筆記如何預防被上傳及置入 WebShell 所衍生的資安風險 😎

logo

說明

Mitigating-Web-Shells | Gtihub

防止 WebShell Upload

WebShell 的發生,除原本的程式碼開發不良或者被惡意加入外,最常見的情況就是正常的檔案上傳功能,被用作惡意的上傳 WebShell,下列討論

白名單

上傳來源

搭配 IP Geolocation 檢查來源 IP 是否符合白名單國家與區域。

上傳檔案副檔名

public ActionResult Upload(HttpPostedFileBase file)
{
    string extension = Path.GetExtension(file.FileName);
    if (new List<string> {"jpg", "jpeg", "png"}.contains(extension))
    {
      ...
    }
}

上傳檔案標頭

public ActionResult Upload(HttpPostedFileBase file)
{
    if (file.ContentType != "image/png" || file.ContentType != "image/jpeg")
    {
      ...
    }
}

改變檔名

上傳後的檔案,應主動變更名稱,增加惡意上傳者調用惡意程式的複雜程度。

public ActionResult Upload(HttpPostedFileBase file)
{
    string extension = Path.GetExtension(file.FileName);
    string fileName = $"{Guid.NewGuid()}{extension}";
    string savePath = Path.Combine(Server.MapPath("~/UploadFile"), fileName);
    file.SaveAs(savePath);
}

格式置換

上傳的圖片,可以經轉檔再轉回的方式,破壞檔案內容,讓夾雜於圖片當中的惡意資訊被破壞。

Bitmap image = new Bitmap("picture.png");
image.Save(@"picture-re0.png", ImageFormat.Png);

但可能衍生畫質改變、檔案容量變化的問題 😶

目錄權限限制

上傳後的檔案避免直接儲存在網頁目錄,避免被直接存取。

在 ASP.NET 當中,File Save 的位置只能是在網頁資料夾的範圍,無法儲存在其他的資料夾。待驗證是否可以用 File Copy 的方式來達到搬移上傳檔案的功能。

如果是 Windows 驗證的環境,可以讓保存上傳檔案的資料夾 NTFS 不允許 Authenticated Users,從而避免被存取,

網頁目錄中的特定資料夾,可以明確拒絕 POST Method 以避免被夾帶 WebShell 的執行參數。

檢測檔案是否為 WebShell

webshell-detect-bypass | GitHub

findWebshell Python 3.x,使用 CLI 的方式比對檔案特徵,判斷是否為 WebShell

Shell-Detector 需要使用 Python 2.x