共用方式為


對適用於 Azure 應用程式閘道的 Web 應用程式防火牆 (WAF) 進行疑難排解

如果您的 Web 應用程式防火牆 (WAF) 阻止了應該允許的請求,您可以採取一些步驟。

首先查看 WAF 概述WAF 配置 文件,並確保已啟用 WAF 監控 。 這些文章介紹了 WAF 的運行方式、規則集的工作原理以及如何訪問 WAF 日誌。

OWASP 規則集在初始設計時便設定為嚴格,以滿足使用WAF的應用程式或組織的特定需求進行調整。 在許多情況下,建立排除、自訂規則,甚至停用可能造成問題或誤判的規則,是完全正常且可被預期的。 每個網站和每個 URI 原則可讓這些變更只影響特定網站/URI。 因此,更改不應影響可能不會遇到相同問題的其他網站。

了解 WAF 記錄

WAF 記錄的目的是為顯示 WAF 符合或封鎖的每個要求。 這是相符合或遭封鎖的所有已評估要求總帳。 如果您注意到 WAF 封鎖不應封鎖 (誤判) 的要求,您可以採取一些措施。 首先,縮小範圍並尋找特定要求。 瀏覽記錄,找到要求的特定 URI、時間戳記或交易識別碼。 找到相關記錄項目時,您可以開始對誤判採取行動。

舉例來說,假設您有一個合法流量,其中包含您想要透過 WAF 傳遞的字串 1=1。 如果您嘗試使用此要求,WAF 會封鎖任何參數或欄位中包含 1=1 字串的流量。 此字串通常與 SQL 插入式攻擊有關。 您可以瀏覽記錄,查看要求的時間戳記,以及封鎖/符合的規則。

在下列範例中,您可以看到有四個規則在相同要求中被觸發 (使用 TransactionId 欄位)。 第一個指出其相符的原因是使用者針對要求使用了數值/IP URL,這會將異常分數增加 3,因為它是警告。 下一個符合的規則是 942130,這是您要尋找的規則。 您可以在 1=1 欄位中看到 details.data。 這會再次讓異常分數加三,因為它也是警告。 一般而言,具有 [比對] 動作的每個規則都會增加異常分數,此時異常分數會是六。 如需詳細資訊,請參閱異常評分模式

最後兩個記錄項目顯示要求已遭到封鎖,因為異常分數夠高。 這些項目的動作與其他兩個不同。 它們會顯示其實際上「封鎖了」要求。 這些規則是必要規則,而且無法停用。 不應該將它們視為規則,而更應該是 WAF 內部的核心基礎結構。

{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "920350",
        "message": "Host header is a numeric IP address",
        "action": "Matched",
        "site": "Global",
        "details": { 
            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
            "data": "40.90.218.160",
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
            "line": "791" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "942130",
        "message": "SQL Injection Attack: SQL Tautology Detected.",
        "action": "Matched",
        "site": "Global",
        "details": { 
            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
            "line": "554" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
        "action": "Blocked",
        "site": "Global",
        "details": { 
            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
            "data": "",
            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
            "line": "57" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
        "action": "Blocked",
        "site": "Global",
        "details": { 
            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
            "data": "",
            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
            "line": "73" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    }
}

修正誤判

有了這項資訊,加上規則 942130 是符合 1=1 字串的知識,您可以執行一些動作來阻止流量被封鎖:

  • 使用排除清單。 關於排除清單的更多資訊,請參見 WAF排除清單

  • 停用規則。

使用排除清單

若要做出處理誤判的明智決定,請務必熟悉應用程式使用的技術。 舉例來說,假設您的技術堆疊中沒有 SQL 伺服器,而您收到與這些規則相關的誤判。 停用這些規則不一定會減弱您的安全性。

使用排除清單的優點之一,就是只會停用特定部分的要求。 不過,這表示特定排除範圍適用於通過 WAF 的所有流量,因為其為全域設定。 例如,如果 [1=1] 是特定應用程式主體中的有效要求,但對於其他應用程式非有效,這可能會導致問題。 另一個優點是您可以在符合特定條件時,在主體、標頭和 Cookie 之間選擇,而不是排除整個要求。

有時,特定參數會以不直覺的方式傳遞至 WAF。 例如,在使用 Microsoft Entra ID 驗證時,權杖會通過。 __RequestVerificationToken 通常作為請求 Cookie 傳入。 不過,在某些停用 Cookie 的情況下,此權杖也會當作要求屬性或 arg 而通過。 如果發生這種情況,您也必須確保 __RequestVerificationToken 新增至排除清單作為 [要求屬性名稱]

顯示排除清單的螢幕快照。

在此範例中,您想要排除等於 [text1] 的 Request 屬性名稱。 這很明顯,因為您可以在防火牆記錄中看到屬性名稱:[資料:相符的資料:在 ARGS:text1: 1=1] 中找到。 屬性為 [text1]。 您也可以透過其他幾種方式找到此屬性名稱,請參閱尋找要求屬性名稱

顯示如何設定 WAF 排除清單的螢幕快照。

您可以在不同範圍層級的應用程式閘道中建立 WAF 的排除專案。 如需詳細資訊,請參閱 Web 應用程式防火牆排除清單

停用規則

另一個解決誤判的方法,是停用符合 WAF 認為是惡意輸入的規則。 由於您已剖析 WAF 記錄,並將規則範圍縮小至 942130,因此可以在 Azure 入口網站中加以停用。 請參閱透過 Azure 入口網站自訂 Web 應用程式防火牆規則

停用規則的其中一個優點是,如果您知道包含通常會被封鎖之特定條件的所有流量都是有效流量,則您可以針對整個 WAF 停用該規則。 不過,如果只是特定使用案例中的有效流量,則您停用了整個 WAF 規則將會暴露弱點,因為其為全域設定。

如果您想要使用 Azure PowerShell,請參閱透過 PowerShell 自訂 Web 應用程式防火牆規則。 如果您想要使用 Azure CLI,請參閱透過 Azure CLI 自訂 Web 應用程式防火牆規則

記錄 HAR 檔案

您可以使用瀏覽器或 Fiddler 之類的外部工具來記錄 HTTP 封存 (HAR) 檔案。 HAR 檔案包含載入網頁時瀏覽器提出的要求和回應相關信息。 這項信息對於針對 WAF 問題進行疑難解答很有用。

小提示

當您連絡支持人員時,請備妥 HAR 檔案是很好的作法。 支援小組可以使用 HAR 檔案來協助診斷問題。

若要在 Microsoft Edge 中記錄及儲存 HAR 檔案,請遵循下列步驟

  1. F12Ctrl+Shift+I 以啟動 Edge 開發人員工具。 您也可以從工具列選單的 [其他工具開發人員工具] 底下啟動工具>

  2. 在 [ 控制台] 索引標籤中,選取 [清除控制台 ],或按 Ctrl+L

    Microsoft Edge 開發人員工具 [控制台] 索引卷標的螢幕快照。

  3. 選取 [網路] 索引標籤。

  4. 選取 [清除網络記錄 檔] 或按 Ctrl+L,然後在未錄製時選取 [記錄網络記錄 ]。

    Microsoft Edge 開發人員工具 [網络] 索引標籤的螢幕快照。

  5. 載入要為其進行疑難解答的 WAF 所保護的網頁。

  6. 選取 [停止錄製網络記錄] 來停止錄製

  7. 選取 匯出 HAR(清理過的)...,然後儲存 HAR 檔案。

    顯示如何在 Microsoft Edge 開發人員工具中儲存 HAR 檔案的螢幕快照。

尋找要求屬性名稱

您可以使用 Fiddler 來檢查個別要求,並判斷呼叫網頁的特定欄位。 使用這項資訊有助於使用排除清單排除特定欄位,使其無法檢查。

在此範例中,您可以看到輸入 [1=1] 字串的欄位稱為 text1

Fiddler Web Debugger 的螢幕快照。在 [原始資料] 索引標籤中,名稱 text1 之後顯示 1=1。

這是您可以排除的欄位。 若要深入了解排除清單,請參閱 Web 應用程式防火牆排除清單。 您可以設定以下排除來排除此案例中的評估:

顯示 WAF 排除的螢幕快照。

您也可以檢查防火牆記錄以取得資訊,了解您須新增至排除清單的內容。 若要啟用紀錄,請參閱應用程式閘道的後端健康情況、資源記錄和計量

檢查防火牆記錄檔,並檢視您所要發生檢查之要求的每小時 PT1H.json 檔案。

在此範例中,您可以看到您有四個具有相同 TransactionID 的規則,而且它們全都在同一時間發生:

{
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "920350",
        "message": "Host header is a numeric IP address",
        "action": "Matched",
        "site": "Global",
        "details": {
            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
            "data": "40.90.218.160",
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
            "line": "791"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "942130",
        "message": "SQL Injection Attack: SQL Tautology Detected.",
        "action": "Matched",
        "site": "Global",
        "details": {
            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
            "line": "554"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
        "action": "Blocked",
        "site": "Global",
        "details": {
            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
            "data": "",
            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
            "line": "57"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
        "action": "Blocked",
        "site": "Global",
        "details": {
            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
            "data": "",
            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
            "line": "73"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}

了解 CRS 規則集的運作方式,且 CRS 規則集 3.0 適用於異常評分系統 (請參閱 Web 應用程式防火牆 Azure 應用程式閘道),您知道最底下具有 [動作:封鎖] 屬性的兩個規則會根據總異常分數被封鎖。 要注意的規則是前兩個規則。

系統會記錄第一個案例,因為使用者使用了數值 IP 位址來瀏覽至應用程式閘道,在此情況下可以忽略此記錄。

第二個 (規則 942130) 是有趣的規則。 您可以在詳細資料中看到其符合模式 (1=1),且欄位名為 text1。 請遵循相同的先前步驟,排除等於 1=1

尋找要求標頭名稱

您可以使用 Fiddler 來尋找要求標頭名稱。 在以下螢幕擷取畫面中,您可以看到此 GET 要求的標頭,其中包括 Content-TypeUser-Agent 等。

Fiddler Web 調試程序的螢幕快照。[Raw] 索引標籤會列出請求標頭的詳細資訊,例如連線、內容類型和使用者代理。

另一個檢視要求和響應標頭的方法,是使用 Microsoft Edge 或 Google Chrome 的開發人員工具。 如需詳細資訊,請參閱 記錄 HAR 檔案

如果要求包含 Cookie,可以選取 [Cookie] 索引標籤,在 Fiddler 中加以檢視。

限制全域參數以消除誤判為真

  • 啟用要求本文檢查

    藉由將 [檢查要求本文] 設定為關閉,WAF 不會評估流量的要求主體。 如果您知道要求本文對您的應用程式而言非為惡意,這可能很有用。

    當您停用此選項時,只有要求本文會略過檢查。 除非使用排除清單功能排除個別的標頭和 Cookie,否則仍會檢查標頭和 Cookie。

  • 停用要求主體限制上限

    通過禁用最大請求正文限制,WAF 可以處理大型請求正文,而不會因超出大小限制而拒絕它們。 如果您經常有大量需求,此設置非常有用。

    當您停用此選項時,請求主體只會被檢視到檢查的最大限制。 如果要求中有惡意內容超過最大要求主體檢查限制,WAF 將不會偵測到該內容。

  • 停用檔案大小上限

    藉由停用 WAF 的檔案大小限制,即可上傳大型檔案,而不需要 WAF 拒絕這些檔案上傳。 藉由允許上傳大型檔案,後端的風險會大幅上升。 如果您知道檔案上傳的大小上限,您可以設定檔案上傳的大小限制,略高於預期的大小上限。 將檔案大小限制為應用程式的一般使用案例,是防止攻擊的另一種方式。 不過,如果您的檔案上傳定期超過強制檔案上傳大小上限,您可能需要完全停用檔案上傳大小限制,以避免誤判。

    注意

    如果您知道您的應用程式永遠不需要上傳任何高於指定大小的檔案,則您可以藉由設定限制來加以限制。

    警告

    將新的託管規則集分配給WAF策略時,現有託管規則集中的所有先前自定義項(如規則狀態、規則作和規則級別排除項)都將重置為新託管規則集的預設值。 不過,在新的規則集指派期間,任何自定義規則、原則設定和全域排除專案都不會受到影響。

防火牆指標(僅限 WAF v1)

針對 v1 Web 應用程式防火牆,入口網站現在提供下列計量:

  1. [Web 應用程式防火牆封鎖的要求計數] 已封鎖的要求數目
  2. [Web 應用程式防火牆封鎖規則計數] 已符合已封鎖要求的所有規則
  3. [Web 應用程式防火牆所有規則分佈] 評估期間所有符合的規則

若要啟用計量,請選取入口網站中的 [計量] 索引標籤,然後選取三個計量之一。

後續步驟