WebShell Defense
2022-06-13
筆記如何預防被上傳及置入 WebShell 所衍生的資安風險 😎
說明
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