對適用於 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 的排除專案。 如需詳細資訊,請參閱 Web 應用程式防火牆排除清單。
停用規則
另一個解決誤判的方法,是停用符合 WAF 認為是惡意輸入的規則。 由於您已剖析 WAF 記錄,並將規則範圍縮小至 942130,因此可以在 Azure 入口網站中加以停用。 請參閱透過 Azure 入口網站自訂 Web 應用程式防火牆規則。
停用規則的其中一個優點是,如果您知道包含通常會被封鎖之特定條件的所有流量都是有效流量,則您可以針對整個 WAF 停用該規則。 不過,如果只是特定使用案例中的有效流量,則您停用了整個 WAF 規則將會暴露弱點,因為其為全域設定。
如果您想要使用 Azure PowerShell,請參閱透過 PowerShell 自訂 Web 應用程式防火牆規則。 如果您想要使用 Azure CLI,請參閱透過 Azure CLI 自訂 Web 應用程式防火牆規則。
尋找要求屬性名稱
在 Fiddler 的協助下,您可以檢查個別要求,並決定要呼叫的網頁特定欄位。 這有助於使用排除清單來排除特定欄位,使其無法被檢查。
在此範例中,您可以看到輸入 [1=1] 字串的欄位稱為 text1。
這是您可以排除的欄位。 若要深入了解排除清單,請參閱 Web 應用程式防火牆排除清單。 您可以設定以下排除來排除此案例中的評估:
您也可以檢查防火牆記錄以取得資訊,了解您須新增至排除清單的內容。 若要啟用紀錄,請參閱應用程式閘道的後端健康情況、資源記錄和計量。
檢查防火牆記錄檔,並檢視您所要發生檢查之要求的每小時 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-Type、User-Agent 等。
另一個檢視要求和回應標頭的方式是查看 Chrome 的開發人員工具。 您可以按 F12 或以滑鼠右鍵按一下 -> [檢查] -> [開發人員工具],然後選取 [網路] 索引標籤。載入網頁,然後選取您想要檢查的要求。
尋找要求 Cookie 名稱
如果要求包含 Cookie,可以選取 [Cookie] 索引標籤,在 Fiddler 中加以檢視。
限制全域參數以消除誤判為真
啟用要求本文檢查
藉由將 [檢查要求本文] 設定為關閉,WAF 不會評估流量的要求主體。 如果您知道要求本文對您的應用程式而言非為惡意,這可能很有用。
當您停用此選項時,只有要求本文會略過檢查。 除非使用排除清單功能排除個別的標頭和 Cookie,否則仍會檢查標頭和 Cookie。
停用要求主體限制上限
藉由停用最大要求主體限制,WAF 可以處理大型要求主體,而不會因為太大而遭到拒絕。 如果您經常有大型要求,這可能很有用。
當您停用此選項時,要求本文只會檢查到最大要求主體檢查限制。 如果要求中有惡意內容超過最大要求主體檢查限制,WAF 將不會偵測到該內容。
停用檔案大小上限
藉由停用 WAF 的檔案大小限制,即可上傳大型檔案,而不需要 WAF 拒絕這些檔案上傳。 藉由允許上傳大型檔案,後端的風險會大幅上升。 如果您知道檔案上傳的大小上限,您可以設定檔案上傳的大小限制,略高於預期的大小上限。 將檔案大小限制為應用程式的一般使用案例,是防止攻擊的另一種方式。 不過,如果您的檔案上傳定期超過強制檔案上傳大小上限,您可能需要完全停用檔案上傳大小限制,以避免誤判。
注意
如果您知道您的應用程式永遠不需要上傳任何高於指定大小的檔案,則您可以藉由設定限制來加以限制。
警告
將新的 Managed 規則集指派給 WAF 原則時,來自現有 Managed 規則集的所有先前自定義專案,例如規則狀態、規則動作和規則層級排除,都會重設為新的 Managed 規則集預設值。 不過,在新的規則集指派期間,任何自定義規則、原則設定和全域排除專案都不會受到影響。
防火牆計量 (僅限 WAF_v1)
針對 v1 Web 應用程式防火牆,入口網站現在提供下列計量:
- [Web 應用程式防火牆封鎖的要求計數] 已封鎖的要求數目
- [Web 應用程式防火牆封鎖規則計數] 已符合且已封鎖要求的所有規則
- [Web 應用程式防火牆所有規則分佈] 評估期間所有符合的規則
若要啟用計量,請選取入口網站中的 [計量] 索引標籤,然後選取三個計量之一。