ModSecurity SecRule 是基於原始瀏覽器 url,而不是內部重寫(index.php、app.php 等)

ModSecurity SecRule 是基於原始瀏覽器 url,而不是內部重寫(index.php、app.php 等)

我正在 Symfony 2 網站上工作,並嘗試建立 ModSecurity 規則來匹配特定的瀏覽器 URL。 IE example.com/results

Symfony 2 使用 .htaccess 中的規則在內部重寫對 app.php 的所有請求,因此當我檢查 ModSecurity 規則中的 REQUEST_URI 時,它被設定為 app.php。我嘗試了任何其他看起來相關的伺服器參數,但所有參數要么是 app.php 要么是空白。

有沒有辦法在設定檔中建立基於瀏覽器請求的 URL 的 ModSecurity 規則,而不是基於內部重寫的結果?

像 WordPress 這樣的 CMS 似乎也有同樣的問題:所有內容都被重寫到 index.php,所以我找不到任何方法將 modsec 規則套用到特定路由。 (我想,由於 WP 如此常見,我也許可以通過在那裡搜索相同的問題來找到答案。)

答案1

看起來我可以使用伺服器變量THE_REQUEST,按照這個答案:https://stackoverflow.com/a/27968463/160565

我使用 mod_rewrite 轉儲THE_REQUEST到 mod_security 規則上方的環境變數中,然後進行比對。

如前所述,THE_REQUEST是 mod_rewrite 使用的 Apache 伺服器變量,而不是 mod_security 變數。 mod_security 中直接等效的變數是REQUEST_LINE,即。請求的第一行。它採用字串的形式,例如:

GET /foo/bar HTTP/1.1

THE_REQUEST當 URL 被重寫時 (mod_rewrite) 變數不會改變,而REQUEST_URI(mod_rewrite) 會改變。

然而,令我有點驚訝的是REQUEST_URI(mod_security) 變數返回重寫的 URL(也許這與指令的順序或使用 mod_security 有關)嵌入式REQUEST_URI

就在 mod_security 規則之上...

mod_security 規則可能應該位於檔案的頂部(如果還沒有的話),位於任何 mod_rewrite 指令之前。 (儘管我不確定順序是否真的重要。)

請注意,REQUEST_URI(mod_security) 變數與 (mod_rewrite) 變數不同REQUEST_URI,儘管名稱相同。值得注意的是,REQUEST_URI(mod_security) 包含查詢字串,而REQUEST_URI(mod_rewrite) 則不包含。

參考:


更新:

... REQUEST_URI(mod_security) 變數傳回重寫的 URL

您可能在請求中太晚運行 mod_security 規則,即。在錯誤的phase?來處理要求的您應該比較的網址REQUEST_URI在以下任一個中進行比較的 URL階段1 或 2(請求)。後面的階段(即 3 - 5)將根據回應進行處理,這可以解釋為什麼您看到的是重寫的 URL,而不是請求的 URL。

phase行動論據或SetDefaultAction指令。例如:

SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"

這五個階段是:

  1. 請求標頭 (REQUEST_HEADERS)
  2. 請求正文 (REQUEST_BODY)
  3. 響應標頭 (RESPONSE_HEADERS)
  4. 回應正文 (RESPONSE_BODY)
  5. 日誌記錄(LOGGING)

從 ModSecurity 版本 v2.7 開始,某些階段號有別名:

2 - 請求
4 - 回應
5 - 記錄

例子:

SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"

參考:

答案2

看起來我可以使用伺服器變數 THE_REQUEST,根據這個答案:https://stackoverflow.com/a/27968463/160565

相關內容