跳至內容

為什麼 AWS WAF 會封鎖我的合法上傳請求?

3 分的閱讀內容
0

我想上傳 (POST) 檔案,該檔案會使用 AWS WAF 封鎖的擴充功能。

簡短描述

AWS WAF 可能會因以下其中一個原因封鎖 POST 請求:

  • 您的檔案大小超過 AWS WAF 可檢查的最大請求主體大小。AWS WAF 已修正主體檢查大小配額
  • SQL injection 隱碼攻擊和跨網站指令碼 (XSS) 規則對中繼資料中含有隨機字元的檔案非常敏感。這些隨機字元可能會調用 Web 存取控制清單 (Web ACL) 規則。這是因為它們與 AWS WAF 中實際的 XSS 或 SQL injection 隱碼攻擊特徵非常相似。

首先,請檢閱可能會封鎖檔案上傳的常見規則。如果一般規則不會封鎖上傳,請考慮其他選項來允許封鎖的檔案。

下列規則通常會封鎖檔案上傳:

  • SQLi_BODY
  • CrossSiteScripting_BODY
  • WindowsShellCommands_BODY
  • GenericLFI_BODY
  • SizeRestrictions_BODY

解決方法

檔案上傳遭到 SQLi_BODY 和 CrossSiteScripting_BODY 規則封鎖

請檢查 AWS WAF 完整日誌中的 terminatingRuleMatchDetails 欄位,以取得規則資訊。

**注意:**terminatingRuleMatchDetails 欄位僅會針對 SQLi_BODYCrossSiteScripting_BODY 攻擊填入。

下列是 CrossSiteScripting_BODYmatchedData 範例:

"terminatingRuleMatchDetails": [{        
        "conditionType": "XSS",        
        "location": "BODY",
        "matchedData": [
            "

下列是 SQLi_BODYmatchedData 範例:

"terminatingRuleMatchDetails": [{        
        "conditionType": "SQL_INJECTION",        
        "location": "BODY",
        "matchedData": [
            ")",
            "*",
            "(",
            "0"
        ]

若要處理由 SQLi_BODYCrossSiteScripting_BODY 封鎖的上傳,請選擇下列其中一個選項。

將已知的 IP 位址新增至安全清單

如果您知道存取應用程式的 IP 位址範圍,請使用 IP 比對條件。這會將 IP 位址新增至安全清單規則。

使用具有比對條件的安全清單

使用具有字串或規則運算式 (regex) 比對條件的安全清單來允許請求。根據 URI、HTTP 標頭或與 AWS WAF 檔案主體相關的字詞來建立安全清單。

在您的安全清單中使用唯一識別碼,以辨識可視為合法的請求。

若要建立安全清單,請建立新的自訂規則。此規則會封鎖 XSS 或 SQLi 攻擊向量,但具有例外狀況條件。該條件是根據符合上傳用的有效請求屬性的比對資料所設定。覆寫受管規則群組中導致誤判的特定規則的動作。對於這些規則,請將 SQLi_BODYCrossSiteScripting_BODY 設定為 Count (計數)。

若要建立此自訂規則,請完成以下步驟:

  1. 開啟 AWS WAF console (AWS WAF 主控台)。
  2. 在導覽窗格中,選擇 AWS WAF
  3. 選擇 Resources & protection packs (資源和保護套件)。
  4. 找到您的保護套件,然後選擇 Rules (規則) 旁的 View and edit (檢視和編輯)。
  5. 在右側窗格中,選擇 Add rules (新增規則)。
    選擇 Custom rule (自訂規則),然後按一下 Next (下一步)。 再次選擇 Custom rule (自訂規則),然後按一下 Next (下一步)。
  6. 將規則 Action (動作) 更新為 BLOCK (封鎖)。
  7. 輸入您的規則名稱
  8. If a request (如果請求) 中,展開下拉式功能表並選擇 matches all the statements (AND) (符合所有陳述式 (AND))。
  9. Statement 1 (陳述式 1) 中,完成以下內容:
    Inspect (檢查) 中,選擇 Has a label (有標籤)。
    Statement (陳述式),選擇 Label (標籤)。
    Match key (比對索引鍵),輸入產生誤判的規則標籤。 例如,如果 CrossSiteScripting_BODY 規則產生誤判,則輸入 awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body
  10. Statement 2 (陳述式 2) 中,完成以下內容:在 Inspect (檢查),選擇 Body (主體)。
    Statement (陳述式),選擇 Oversize Handling (超大處理) 以繼續
    Match type (比對類型) 中,選擇 Contains string (包含字串)。
    String to match (比對字串),輸入要與規則比對的值。
    (選用) 在 Text transformation (文字轉換) 中,選擇 text transformation (文字轉換) 或 None (無)。
    展開 Rule configuration (規則組態),在 Negate statement (NOT) (否定陳述式 (NOT)) 下,選擇 Negate statement results (否定陳述式結果)。
  11. 選擇 Create rule (建立規則)。
  12. 若要設定規則優先順序,請在右側窗格中選取 Edit Rule Order (編輯規則順序),然後將此規則拖曳到封鎖請求的受管規則群組下方。這樣會讓受管規則的標籤優先於規則群組的檢查。接著,AWS WAF 會在下一個規則優先順序中使用該標籤。
  13. 選擇 Save Rule Order (儲存規則順序)。

**注意:**最佳實務是在非生產環境中測試規則,將 Action (動作) 設定為 Count (計數)。若要評估規則,請使用 Amazon CloudWatch 指標結合 AWS WAF 取樣請求或 AWS WAF 日誌。當規則如預期執行時,將 Action (動作) 變更為 Block (封鎖)。

檔案上傳遭到 WindowsShellCommands_BODY、GenericLFI_BODY,或 SizeRestrictions_BODY 規則封鎖

檔案上傳時建立 HTTP 封存 (HAR) 檔案。然後,檢查檔案中是否有觸發 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 規則。

若要允許 WindowsShellCommands_BODYGenericLFI_BODYSizeRestrictions_BODY 的誤判,請先將封鎖規則設為 Count (計數)。如需說明,請參閱將規則群組的評估結果覆寫為計數

然後,為導致誤判的受管規則建立自訂規則:

  1. 開啟 AWS WAF console (AWS WAF 主控台)。
  2. 在導覽窗格中,選擇 AWS WAF
  3. 選擇 Resources & protection packs (資源和保護套件)。
  4. 找到您的保護套件,然後選擇 Rules (規則) 旁的 View and edit (檢視和編輯)。
  5. 在右側窗格中,選擇 Add rules (新增規則)。
    選擇 Custom rule (自訂規則),然後按一下 Next (下一步)。
    再次選擇 Custom rule (自訂規則),然後按一下 Next (下一步)。
  6. 將規則 Action (動作) 更新為 BLOCK (封鎖)。
  7. 輸入您的規則名稱
  8. If a request (如果請求) 中,展開下拉式功能表並選擇 matches all the statements (AND) (符合所有陳述式 (AND))。
  9. Statement 1 (陳述式 1) 中,完成以下內容:
    Inspect (檢查) 中,選擇 Has a label (有標籤)。
    Statement (陳述式),選擇 Label (標籤)。
    Match key (比對索引鍵),輸入產生誤判的規則標籤。例如,如果 WindowsShellCommands_BODY 規則產生誤判,則輸入 awswaf:managed:aws:windows-os:WindowsShellCommands_Body
  10. Statement 2 (陳述式 2) 中,完成以下內容:
    Inspect (檢查),選擇 URI path (URI 路徑)。在 Statement (陳述式) 下,於 Match type (比對類型) 選擇 Exactly matches string (完全相符字串)。
    String to match (比對字串),輸入目前提出請求的 URI 路徑。
    (選用) 在 Text transformation (文字轉換) 中,選擇 text transformation (文字轉換) 或 None (無)。
    展開 Rule configuration (規則組態),在 Negate statement (NOT) (否定陳述式 (NOT)) 下,選擇 Negate statement results (否定陳述式結果)。
  11. 選擇 Create rule (建立規則)。
  12. 若要設定規則優先順序,請在右側窗格中選取 Edit Rule Order (編輯規則順序),然後將此規則拖曳到封鎖請求的受管規則群組下方。
  13. 選擇 Save Rule Order (儲存規則順序)。

**注意:**最佳實務是在非生產環境中測試規則,將 Action (動作) 設定為 Count (計數)。若要評估規則,請使用 CloudWatch 指標結合 AWS WAF 取樣請求或 AWS WAF 日誌。當規則如預期執行時,將 Action (動作) 變更為 Block (封鎖)。

允許封鎖檔案的其他選項

**注意:**規則會依照列出的順序處理。對於以下最佳實務,請根據需要重新排序規則優先順序。

根據您的使用案例選擇最佳方法:

  • 使用 AWS WAF 字串比對規則陳述式或 AWS WAF Classic 字串比對條件套用選擇性排除。將與文件主體相關的特定字詞新增至安全清單。例如: 如果特定 URI 路徑上出現誤判,則將該路徑新增至安全清單中。
  • 使用單獨的網域來上傳檔案。請確認這是否對您的使用案例來說是一種具有成本效益的選擇。
  • 掃描 (清除) 檔案和影像以尋找內嵌程式碼和資料。您可以在上傳檔案之前在用戶端執行此動作。或者,如果您建立了排除規則,您可以在上傳檔案之後,在後端執行此動作。
  • 在上傳檔案之前先進行壓縮。
    **注意:**確保您未壓縮惡意檔案。
  • 如果上傳來自已知 IP 位址範圍,請將這些 IP 位址新增至您的安全清單。
  • 使用 base64 編碼對所有影像資料進行編碼,以便 AWS WAF 不會對影像調用 XSS 或 SQLi。
    **注意:**確保您未對惡意影像進行編碼。
  • 實作影像最佳化技術,例如區塊移除或位元隨機化。
AWS 官方已更新 8 個月前