共用方式為


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

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

{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/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/A6F44B25-259E-4AF5-888A-386FED92C11B/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": "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/A6F44B25-259E-4AF5-888A-386FED92C11B/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/A6F44B25-259E-4AF5-888A-386FED92C11B/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 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 的要求屬性名稱。 這是顯而易見的,因為您可以在防火牆記錄中看到屬性名稱:數據: 相符的數據:1=1 在 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/A6F44B25-259E-4AF5-888A-386FED92C11B/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/A6F44B25-259E-4AF5-888A-386FED92C11B/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": "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/A6F44B25-259E-4AF5-888A-386FED92C11B/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/A6F44B25-259E-4AF5-888A-386FED92C11B/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 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 應用程式防火牆 for Azure 應用程式閘道),您知道動作的下兩個規則:封鎖屬性會根據總異常分數封鎖。 要關注的規則是前兩名。

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

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

尋找要求標頭名稱

Fiddler 是一個有用的工具,可再次尋找要求標頭名稱。 在下列螢幕快照中,您可以看到此 GET 要求的標頭,其中包括 Content-TypeUser-Agent 等等。

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

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

Chrome F12

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

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

  • 停用要求本文檢查

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

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

  • 停用要求主體限制上限

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

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

  • 停用檔案大小上限

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

    注意

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

防火牆計量(僅限WAF_v1)

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

  1. Web 應用程式防火牆 封鎖的要求計數 已封鎖的要求數目
  2. Web 應用程式防火牆 封鎖規則計數 符合要求遭到封鎖的所有規則
  3. Web 應用程式防火牆 評估期間相符的所有規則總計

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

下一步

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