У меня есть modsecurity с Core Rule Set. И у меня есть POST-запрос с 3 параметрами: Par1 = "XML в кодировке base64" & Par2 = "url" & Par3 = "hash".
Я хочу изменить правила CRS на base64Decode только Par1 и используйте Par2 и Par3 «как есть».
Я пытался использовать SecRuleUpdateActionById
директива, но она требует написания директивы для каждого правила в CRS. SecDefaultAction
Директива тоже не работает, потому что все CRS-правила имеют "t: none", которое отменяет действия по умолчанию. Я также нашел multiMatch
action, но я думаю, что это вызовет много ложных срабатываний на 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
Добавить SecRuleScript
директива перед CRS загружается:
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. добавить кучу SecRuleUpdateTargetByTag
директивы после CRS загружается:
SecRuleUpdateTargetByTag 'OWASP_CRS/WEB_ATTACK/SQL_INJECTION' "!ARGS:par1|TX:par1"
Нелегко обновить действие нескольких правил CRS, за исключением перечисления каждого идентификатора правила по указанным вами причинам.
Можно обновить переменные, соответствующие группе правил, используя SecRuleUpdateTargetByTag но не действие, так как SecRuleUpdateActionByTag отсутствует (только SecRuleUpdateActionById), но, честно говоря, даже если вы хотите преобразовать только одну из своих переменных, это вызовет у вас проблемы. И я согласен, что множественное совпадение, вероятно, здесь неправильный ответ, даже если бы вы могли это сделать.
В конечном итоге я бы рекомендовал:
Оставьте правила как есть и в основном игнорируйте переменную base64 par1 для CRS (обратите внимание, что вам может потребоваться обновить НЕКОТОРЫЕ правила, чтобы игнорировать этот параметр для определенных правил, если кодировка base64 создает ложные срабатывания).
Решите, каковы векторы атаки для вашей XML-переменной par1, и напишите (или скопируйте из CRS) меньшее подмножество правил только для этого с помощью преобразования base64Decode. Я полагаю, что даже после декодирования base64 XML может создавать множество ложных срабатываний, так что вы, вероятно, все равно не захотите запускать на них полную CRS.
Удачи!