как изменить действие правила modsecurity только для одного параметра?

У меня есть modsecurity с базовым набором правил. И у меня есть POST-запрос с 3 параметрами: Par1 = "XML в кодировке base64" & Par2 = "url" & Par3 = "hash".

Я хочу изменить правила CRS на base64Decode только Par1 и использовать Par2 и Par3 как есть.

Я попытался использовать директиву SecRuleUpdateActionById , но для этого требуется написать директиву для каждого правила в CRS. Директива SecDefaultAction тоже не работает, потому что все CRS-правила имеют «t: none», которое отменяет действия по умолчанию. Я также обнаружил действие multiMatch , но я думаю, что это вызовет множество ложных срабатываний в строке base64.

Есть ли способ обновить действия для нескольких правил, не переписывая эти правила?

1
задан 9 November 2016 в 11:26
2 ответа

Я нашел решение. Я решил получить значение параметра Par1, декодировать его с помощью base64 и записать в переменную "TX" . Эта переменная будет доступна до завершения транзакции. Это можно сделать двумя способами.

1.1. использовать lua:

  • создать файл extract_param.lua с аналогичным содержимым:

     function main ()
      - Получить par1
      локальный par1 = m.getvar ("ARGS.Par1", {"base64DecodeExt"});
      если par1 == nil, то
      m.log (3, «нет Par1 в запросе.»);
      вернуть ноль;
      конец
      m.log (3, "Par1 base64-decoded:" ..par1 .. ".");
      m.setvar ("TX.Par1", par1);
    вернуть ноль;конец
     
  • добавить SecRuleScript директиву перед загрузкой CRS:

     SecRuleScript путь / к / 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"
2
ответ дан 3 December 2019 в 20:33

Нелегко обновить действие нескольких правил CRS, если не считать перечисления каждого идентификатора правила по указанным вами причинам.

Можно обновить переменные, соответствующие группе правил, использующих SecRuleUpdateTargetByTag , но не действие, поскольку нет SecRuleUpdateActionByTag (только SecRuleUpdateActionById ), но, честно говоря, даже если вы хотите преобразовать только один факт, доставит вам проблемы. И я согласен, что множественное совпадение, вероятно, здесь неправильный ответ, даже если бы вы могли это сделать.

В конечном итоге я бы порекомендовал следующее:

  1. Оставьте правила как есть и в основном игнорируйте переменную base64 par1 для CRS (примечание вам может потребоваться обновить НЕКОТОРЫЕ правила, чтобы игнорировать этот параметр для определенных правил, если кодировка base64 создает ложные срабатывания).

  2. Решите, каковы векторы атаки для вашей переменной XML par1, и запишите (или скопируйте из CRS) меньшее подмножество правил только для этого с преобразованием base64Decode. Я полагаю, что даже после декодирования base64 XML может создавать множество ложных срабатываний, поэтому вы, вероятно, все равно не захотите запускать для них полную CRS.

Удачи!

0
ответ дан 3 December 2019 в 20:33

Теги

Похожие вопросы