Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

ASP.NET 虛擬主機 System.IO 安全漏洞徹底解決方案

編輯:關於伺服器

ASP.NET 虛擬主機環境下,System.IO 命名空間提供強大的檔案系統存取能力,若未妥善隔離,惡意使用者可上傳 WebShell 讀寫任意目錄(甚至 C 槽系統目錄),造成嚴重安全風險。本文基於 Windows Server 2003 + IIS 6.0 + SQL Server 2000 環境,提出以「應用程式集區身分隔離 + NTFS 精細權限 + 系統目錄鎖定」為核心的纵深防禦方案。

一、漏洞根源分析

  • ASP 時代的 FileSystemObject (scrrun.dll) 可透過刪除/改名 DLL 阻擋。
  • ASP.NET System.IO 為 managed code,無需註冊,僅需將組件放入 bin 目錄即可使用,傳統阻擋失效。
  • IIS 6.0 預設工作進程 w3wp.exe 以 Network Service 內建帳號運行,該帳號屬於 IIS_WPG 群組,預設擁有廣泛讀取權限(如 C:\Windows、C:\Program Files),導致跨站目錄遍歷。

二、核心防禦架構:應用程式集區隔離

IIS 6.0 採用「工作進程隔離模式」,每個應用程式集區對應一組 w3wp.exe 進程。將每個網站指派給獨立集區,並為集區指定專屬的低權限帳號,配合 NTFS ACL 鎖定目錄存取,實現網站間的硬性隔離。

三、逐步實施指南

1. 建立專屬帳號並設定群組隸屬

帳號用途帳號名稱密碼加入群組移出群組
應用程式集區身分app_test_userappuserIIS_WPGUsers, Guests 等
匿名存取身分 (IUSR)iis_test_useriisuserGuestsUsers, IIS_WPG 等

帳號屬性:勾選「使用者無法變更密碼」、「密碼永不過期」。

建立帳號屬性
群組隸屬設定

2. 建立並配置應用程式集區

  1. IIS 管理器 → 應用程式集區 → 新增 → 命名 test_pool。
  2. 右鍵屬性 → 「身分識別」分頁 → 選「可設定」 → 瀏覽選取 app_test_user → 輸入密碼。

新增應用程式集區
集區身分識別設定

3. 建立網站並關聯集區與匿名帳號

  1. 新增網站 test_site,實體路徑 D:\test。
  2. 網站屬性 → 「主目錄」→ 應用程式集區選 test_pool。
  3. 「目錄安全性」→ 驗證方法「編輯」→ 匿名存取帳號改為 iis_test_user → 輸入密碼。

網站屬性關聯集區與匿名帳號

4. 系統目錄 NTFS 權限精細鎖定(關鍵纵深防禦)

目錄權限設定原則備註
C:\僅 Administrators、SYSTEM 擁有「完全控制」,移除所有其他群組/帳號,不替換子物件。防止任意讀取系統根目錄
C:\Documents and Settings繼承父權限,替換子物件。
C:\Program Files繼承父權限,替換子物件。
額外:C:\Program Files\Common Files\Microsoft Shared 移除繼承→複製現有權限→增加 Users「讀取」並替換子物件。
支援 ASP/ASP.NET 使用 Access/MDAC 等共用元件
C:\Windows移除繼承→複製現有權限→僅保留 Administrators、SYSTEM「完全控制」+ Users「讀取」,替換子物件。系統服務需 Users 讀取;Network Service 屬 Users 成員故間接獲得讀取
其他資料磁碟 (D:, E:...)僅 Administrators、SYSTEM 完全控制,移除其餘,替換子物件。
網站目錄 (D:\test)繼承現有權限 → 增加 app_test_user、iis_test_user「完全控制」並替換子物件。確保網站讀寫僅限自身目錄

C 槽權限設定
Windows 目錄權限設定

5. 解決 Network Service 仍可讀取 C:\Windows 的殘留風險

因 Network Service 屬 Users 群組,而系統服務需 Users 讀取 C:\Windows,難以完全移除。兩大補強方案:

  1. 無人值守安裝修改系統目錄名:安裝 OS 時將 C:\Windows 改為 C:\WIN2003SRV (≤8 字元,符合 DOS 命名),大幅增加攻擊者猜測路徑難度。
  2. 最小權限白名單:僅授予 IIS_WPG 必須的特定路徑權限:
    %windir%\help\iishelp\common (讀取)
    %windir%\IIS Temporary Compressed Files (列出/讀取/寫入)
    %windir%\system32\inetsrv\ASP Compiled Template (讀取)
    Inetpub\wwwroot (讀取/執行)
    並授予使用者權利:忽略遍歷檢查、批次登入、網路存取。

建議雙重佈防:方案一為必做,方案二視應用相容性微調。

四、自動化管理程式碼範例 (C# + System.DirectoryServices)

適用於大量虛擬主機批量建立集區、虛擬目錄、綁定集區:

using System;
using System.DirectoryServices;

namespace IISAdmin {
    public class PoolManager {
        public static void CreatePool(string name) {
            var pools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
            var pool = pools.Children.Add(name, "IIsApplicationPool");
            pool.CommitChanges();
        }
        public static void SetPoolIdentity(string poolName, string user, string pwd) {
            var pool = new DirectoryEntry($"IIS://localhost/W3SVC/AppPools/{poolName}");
            pool.Properties["WAMUserName"].Value = user;
            pool.Properties["WAMUserPass"].Value = pwd;
            pool.CommitChanges();
        }
        public static void AssignPoolToVdir(string vdirPath, string poolName) {
            var vdir = new DirectoryEntry($"IIS://localhost/{vdirPath}");
            vdir.Invoke("AppCreate3", new object[] { 0, poolName, true });
        }
    }
}

第二組範例展示完整網站建立、啟停、查詢邏輯,可整合至主控面板系統。

五、總結與展望

本方案透過「集區身分隔離 + NTFS 精細 ACL + 系統目錄最小權限」三層防線,從根本阻斷 System.IO 跨站存取。雖實施較繁瑣,但為虛擬主機商必備的安全基線。期待 .NET 2.0+ 版本能在框架層面提供更完善的沙箱機制。

Copyright © Windows教程網 All Rights Reserved