Security
如何僅修改一個參數的 modsecurity 規則操作?
我有一個帶有核心規則集的 modsecurity。我有 3 個參數的 POST 請求:Par1 = “base64-encoded XML”& Par2 = “url”&Par3 = “hash”。
我想將 CRS 規則修改為僅對Par1 進行 base64Decode 並“按原樣”使用 Par2 和 Par3。
我嘗試使用
SecRuleUpdateActionById
指令,但它需要為 CRS 中的每條規則編寫指令。SecDefaultAction
指令也不起作用,因為所有 CRS 規則都有覆蓋預設操作的“t:none”。我也找到了multiMatch
行動,但我認為它會在 base64-string 上造成很多誤報。是否有某種方法可以在不重寫此規則的情況下更新多個規則的操作?
我找到了解決方案。我決定獲取參數 Par1 的值,對其進行 base64 解碼並記錄在“TX”變數中。在事務完成之前,此變數將可用。有兩種方法可以做到這一點。
1.1。使用 lua:
- 創建
extract_param.lua
具有相似內容的文件:function main() -- Retrieve par1 local par1 = m.getvar("ARGS.Par1", {"base64DecodeExt"}); if par1 == nil then m.log(3, "no Par1 in request."); return nil; end m.log(3, "Par1 base64-decoded:" ..par1.. "."); m.setvar("TX.Par1",par1); return nil; end
- 在載入 CRS之前添加
SecRuleScript
指令:SecRuleScript path/to/script/extract_param.lua phase:2,log
1.2. 使用標準的“setvar”功能。這個方法比較簡單,我用過。但後來我找到了它(在這裡),並決定也介紹一下 lua。
- 在載入 CRS之前添加以下規則:
SecRule ARGS:par1 "^(.*)$" "log, pass, id:22, phase:2, t:base64DecodeExt, setvar:tx.par1=%{MATCHED_VAR}"
2.載入CRS後添加一堆
SecRuleUpdateTargetByTag
指令:SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"