Eu encontrei uma solução. Eu decidi pegar o valor do parâmetro Par1, base64-decodificá-lo e gravar em um "TX"
1.1. use lua:
-
crie o arquivo
extract_param.lua
com um conteúdo semelhante: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
-
adicione
SecRuleScript
directive antes de o CRS ser carregado:SecRuleScript path/to/script/extract_param.lua phase:2,log
1.2. use a funcionalidade padrão "setvar". Esse método é mais fácil, eu uso. Mas eu achei ( aqui ) mais tarde e decidi contar sobre lua também.
-
adicione a seguinte regra antes de o CRS ser carregado:
SecRule ARGS:par1 "^(.*)$" "log, pass, id:22, phase:2, t:base64DecodeExt, setvar:tx.par1=%{MATCHED_VAR}"
2. Adicione o grupo de SecRuleUpdateTargetByTag
diretivas após CRS é carregado:
SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"