共用方式為


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

如果應透過 Web 應用程式防火牆 (WAF) 傳遞的要求遭封鎖,您可以採取的一些措施。

首先,請確定您已閱讀 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,這是您要尋找的規則。 您可以在 details.data 欄位中看到 1=1。 這會再次讓異常分數加三,因為它也是警告。 一般而言,具有 [比對] 動作的每個規則都會增加異常分數,此時異常分數會是六。 如需詳細資訊,請參閱異常評分模式

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

{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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 應用程式防火牆規則

WAF 規則

尋找要求屬性名稱

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

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

Progress Telerik Fiddler Web 調試程序的螢幕快照。在 [原始] 索引標籤中,名稱 text1 之後會顯示 1 = 1。

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

WAF 排除

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

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

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

-	{
-	    "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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 等。

Progress Telerik Fiddler Web 調試程序的螢幕快照。[原始] 索引標籤會列出要求標頭詳細數據,例如連線、內容類型和使用者代理程式。

另一個檢視要求和回應標頭的方式是查看 Chrome 的開發人員工具。 您可以按 F12 或以滑鼠右鍵按一下 -> [檢查] -> [開發人員工具],然後選取 [網路] 索引標籤。載入網頁,然後選取您想要檢查的要求。

Chrome F12

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

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

  • 啟用要求本文檢查

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

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

  • 停用要求主體限制上限

    藉由停用最大要求主體限制,WAF 可以處理大型要求主體,而不會因為太大而遭到拒絕。 如果您經常有大型要求,這可能很有用。

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

  • 停用檔案大小上限

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

    注意

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

    警告

    將新的 Managed 規則集指派給 WAF 原則時,來自現有 Managed 規則集的所有先前自定義專案,例如規則狀態、規則動作和規則層級排除,都會重設為新的 Managed 規則集預設值。 不過,在新的規則集指派期間,任何自定義規則、原則設定和全域排除專案都不會受到影響。

防火牆計量 (僅限 WAF_v1)

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

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

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

下一步

請參閱如何在應用程式閘道上設定 Web 應用程式防火牆