Security

如何僅修改一個參數的 modsecurity 規則操作?

  • June 14, 2017

我有一個帶有核心規則集的 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"

引用自:https://serverfault.com/questions/810414