2025年7月4日 星期五

[研究]ASP.NET WebForm 網站【加密的階段作業 (SSL) Cookie 中遺漏安全屬性】弱點處理

[研究]ASP.NET WebForm 網站【加密的階段作業 (SSL) Cookie 中遺漏安全屬性】弱點處理

2025-07-04

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

ASP.NET WebForm 網站,HCL AppScan 10.18.0 報告【加密的階段作業 (SSL) Cookie 中遺漏安全屬性嚴】弱點,如何處理?

加密的階段作業 (SSL)Cookie中遺漏安全屬性

嚴重性:

CVSS評分: 6.5

CISS有量: AINACLPRNINSUICLILANEXRLXRCXCXIORXIRX(AR XIMA//MAC XIMPR.XIMUI XIMOXIMOXIMEX

URL :

實體: (Cookie)

風險: 有可能竊取在加密階段作業期間傳送的使用者和階段作業資訊(Cookie)

原因: Web 應用程式會透過 SSL德送未受保護的 Cookie

修正: 新增 'Secure'屬性至所有機密 Cookie

差異:

推論: ApScan 發現加密階段作業(SSL)使用不合"secure"屬性的Cookie 。

原始回應

HTTP/1.1 200 OK

Cache-Control: private

Content-Type: text/html; charset-ut-8

X-Frame-Options: SAMEORIGIN

X-XSS-Protection: 1; mode-block

X-Content-Type-Options: noeniff

Referrer-Policy: no-referrer-when-downgrade

Strict-Transport-Security: max-age-31536060000

Date: Thu,

Content-Length:

<!DOCTYPE html>

<html xmins "http://www.w3.org/1999/xhtml" lang "zh-Hant.">

<headxtitle>

ChatGPT 說:

針對您提供的 HCL AppScan 10.18.0 弱點報告:「加密的階段作業 (SSL) Cookie 中遺漏安全屬性」,這屬於典型的 缺少 Secure 屬性的 Cookie 設定問題,即使網站透過 HTTPS 傳輸,若 Cookie 沒加上 Secure 屬性,瀏覽器仍有機會在非加密連線時不小心洩露 Cookie,增加被竊取風險。

ASP.NET WebForm 解決方案

1️⃣ 修改 Cookie 設定方式

針對程式中產生的 Cookie,請務必加上:

HttpCookie cookie = new HttpCookie("YourCookieName", "YourValue");
cookie.Secure = true; // 僅透過 HTTPS 傳送
cookie.HttpOnly = true; // 防止 JavaScript 存取,減少 XSS 風險
Response.Cookies.Add(cookie);

 如果是修改 Session Cookie,請設定 web.config:

2️⃣ web.config 設定 Session Cookie

<configuration>
  <system.web>
    <sessionState cookieSameSite="Strict" cookieSecure="Always" />
  </system.web>
</configuration>

 參數說明:

  • cookieSecure="Always" ⇒ 強制 Session Cookie 僅透過 HTTPS 傳送
  • cookieSameSite="Strict" ⇒ 限制第三方網站請求帶入 Cookie,增加 CSRF 防護(根據需求選擇 Strict、Lax 或 None)

3️⃣ Global.asax 確保 Secure 屬性套用

若框架版本較舊、或不同頁面動態產生 Cookie,建議於 Application_EndRequest 統一強制加上 Secure 屬性:

protected void Application_EndRequest(object sender, EventArgs e)
{
    if (Request.IsSecureConnection)
    {
        foreach (string cookieKey in Response.Cookies.AllKeys)
        {
            HttpCookie cookie = Response.Cookies[cookieKey];
            if (cookie != null)
            {
                cookie.Secure = true;
            }
        }
    }
}

 4️⃣ 確認 IIS 強制 HTTPS

除了設定 Cookie,若用戶端仍可透過 HTTP 存取網站,風險依舊存在。

IIS 設定強制 HTTPS:

  • 將網站根目錄設定「需要 SSL」
  • 使用「URL Rewrite」加強轉址:

<rewrite>
  <rules>
    <rule name="Redirect to HTTPS" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>


 5️⃣ 確認 HSTS 標頭

從您的報告:

Strict-Transport-Security: max-age=31536060000   

 已經正確套用 HSTS(強制瀏覽器使用 HTTPS),良好。

6️⃣ 常見疏漏

  • ASP.NET 預設的 Session Cookie 若未設定 cookieSecure="Always" 仍可能出現問題
  • 程式碼中手動產生的 Cookie 忽略 Secure
  • 只在伺服器端設定 HSTS,客戶端仍可初次透過 HTTP 存取


小結:處理步驟

✅ 確認程式碼內所有 Cookie 加上 cookie.Secure = true

✅ web.config 中設定 cookieSecure="Always"

✅ 確保 IIS 強制 HTTPS,禁止 HTTP 存取

✅ 全站導入 HSTS(您已完成)

✅ 建議定期透過 AppScan 重新驗證

********************************************************************************

僅在 Web.Config 設定  <sessionState cookieSameSite="Strict" cookieSecure="Always" /> ,其他不管,可否解決 ?

ChatGPT 說:

只改 web.config 這只影響 ASP.NET 自動產生的「Session Cookie」

例如:ASP.NET_SessionId 這類型的 Cookie 會套用:

Secure ⇒ 僅透過 HTTPS 傳輸

SameSite=Strict ⇒ 限制第三方請求帶入 Cookie


但需注意:

🔴 其他透過程式碼產生的 Cookie 不受影響,例如:

HttpCookie myCookie = new HttpCookie("CustomCookie", "abc");

Response.Cookies.Add(myCookie);

如果您網站除了 Session Cookie,還有其他自訂 Cookie,web.config 不會自動幫您加上 Secure,這類 Cookie 照樣被 AppScan 掃到問題。


實務建議:您可以先單純加上:

<sessionState cookieSameSite="Strict" cookieSecure="Always" />

然後重新跑一次 AppScan,看弱點是否消失

********************************************************************************

若只在 "Global.asax 確保 Secure 屬性套用" ,不管 Web.config 設定,不管個別網頁程式修改,可以解決 ?

ChatGPT 說:

✅ 單純靠 Global.asax 這段,可以有效消除「Cookie 未設 Secure」的 AppScan 弱點

⚠ 但注意以下細節:

項目說明
Session Cookie因為 ASP.NET_SessionId 是透過 Response.Cookies 回傳,這段程式會套用
自訂 Cookie只要用 Response.Cookies.Add(),這段也會套用
SameSite 屬性這段程式沒有處理 SameSite,若 AppScan 也檢查 SameSite,需另設
非 HTTPS 請求判斷 Request.IsSecureConnection,只有 HTTPS 請求才加 Secure

********************************************************************************

2️⃣ 正確寫法:屬性合併

您應該將所有設定合併在同一個 <sessionState> 裡:

<configuration>

  <system.web>

    <sessionState 

      mode="SQLServer" 

      allowCustomSqlDatabase="true" 

      sqlConnectionString="MyConnectionString" 

      cookieless="false" 

      timeout="20" 

      cookieSameSite="Strict" 

      cookieSecure="Always" />

  </system.web>

</configuration>

********************************************************************************

'/' 應用程式中發生伺服器錯誤。

組態錯誤

描述: 處理服務此要求所需的組態檔時發生錯誤。請檢視下列的特定錯誤詳細資訊,並適當修改您的組態檔。

剖析器錯誤訊息: 無法辨認的屬性 'cookieSecure'。請注意,屬性名稱必須區分大小寫。

ChatGPT 說:

非常精準的觀察,這代表您的 ASP.NET 環境版本不支援 cookieSecure 和 cookieSameSite 這兩個屬性。

1️⃣ 支援版本說明

cookieSecure 和 cookieSameSite 為 .NET Framework 4.7.2 以上版本 才開始支援

若您使用的 ASP.NET WebForm 專案是:

狀況 說明

.NET Framework 4.7.2 或以上 屬性有效,可直接用

.NET Framework 4.5、4.6、4.7 不支援,報錯

.NET Framework 更舊版本 不支援,報錯

2️⃣ 如何確認您的版本?

打開 web.config 看頂部:

<compilation targetFramework="4.7.2" />

若不是 4.7.2 或更高版本,該屬性無法使用。

您也可以用:Visual Studio 專案內容 → 目標 Framework

伺服器實際環境,確認安裝的 .NET Framework 版本

3️⃣ 解決方案

若無法升級 .NET Framework,又要修正 AppScan 弱點,建議:

4️⃣ 建議動作

動作 說明

確認 targetFramework 若小於 4.7.2,建議用 Global.asax

無法升級框架 保留原始 sessionState 設定,別加不支援屬性

AppScan 弱點持續存在 可提供實際回應 Set-Cookie 資訊,我協助判斷

********************************************************************************

<compilation debug="true" targetFramework="4.8">

ChatGPT 說:

這代表:

⚠ 您雖設定 targetFramework="4.8",但:

伺服器環境實際執行的 .NET 版本 < 4.7.2

或 System.Web 組件沒有更新

Visual Studio 發佈時未使用正確版本

IIS 維持舊版應用程式集區

2️⃣ 核心檢查步驟:

請在伺服器上:

開啟 IIS 管理員

找到網站對應的「應用程式集區」

確認 .NET CLR 版本 是否顯示:

v4.0.30319

⚠ 雖顯示 v4.0,但實際版本需看「已安裝的 .NET Framework」。


3️⃣ 查看伺服器 .NET 版本

請檢查:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

內部 System.Web.dll 右鍵 → 內容 → 詳細資料

版本應至少為 4.7.2 或以上

或透過註冊表:

reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"

會顯示:

Release    REG_DWORD    528040  (對應 4.8)

4️⃣ 快速解決法:

若不確定伺服器版本、又要快速修補:

✅ 使用 Global.asax 統一補上 Secure,可解決大部分 AppScan 報告問題

✅ cookieSameSite 若需支援,確認環境版本符合


5️⃣ 總結建議:

✅ 若確定伺服器已完整安裝 .NET 4.8,可用 cookieSecure、cookieSameSite

✅ 若伺服器版本落後,建議升級 .NET Framework

✅ 無法升級時,Global.asax 強制加 Secure 為次佳方案

********************************************************************************


(完)

相關

沒有留言:

張貼留言