Одно из того, что мне не нравилось в ModSecurity 1.x, это то, что его возможности противодействия обходу защиты были неявны. Входной поток всегда подвергался серии преобразований и всегда в одном порядке. С одной стороны это было удобно, так как вам не надо было заботиться об этом. Но такой подход – неявная нормализация – не надежен. (Не удивляйтесь). Во-первых, случаются ситуации, когда вам необходимо сделать некоторые преобразования (иногда специфичные) до того как вы увидите данные. Во-вторых, когда важен контекст, в котором используются входные данные. Такой подход не всегда подходит для выполнения специфичных преобразований – вы можете даже помочь злоумышленникам избежать обнаружения.
Вот почему, когда разрабатывал архитектуру ModSecurity 2.x, я пришел к гибкому решению, которое позволяет настраивать функции нормализации для каждой ситуации отдельно. Однако за новые возможности пришлось пожертвовать простотой – ModSecurity 2.x стал немного сложнее. Но хватит об этом, давайте обсудим улучшения.
В документации к ModSecurity 2.x описано 19 функций нормализации. Вот они:
lowercase
replaceNulls
removeNulls
compressWhitespace
removeWhitespace
replaceComments
urlDecode
urlEncode
urlDecodeUni
base64Encode
base64Decode
md5
sha1
hexDecode
hexEncode
htmlEntityDecode
escapeSeqDecode
normalisePath
normalisePathWin
Имена большинства из них описывают себя сами. (Для ознакомления с другими обратитесь к документации). По умолчанию ModSecurity 2.x для входящего потока выполняет функции lowercase, replaceNulls и compressWhitespace. Если вам требуются другие действия, то вы можете их настроить, используя новое действие “t”. Как и раньше, для задания списка действий по умолчанию для всех правил, вы можете использовать SecDefaultAction, например:
SecDefaultAction log,auditlog,deny,status:403,phase:2,
t:lowercase,t:replaceNulls,t:compressWhitespace
Этот пример взят из стандартной конфигурации. Также вы можете устанавливать действия для каждого правила отдельно, либо задавая их полностью, либо добавляя или удаляя их из стандартной конфигурации. Вот пример, где удалено действие compressWhitespace и добавлено replaceComments:
SecRule ARGS keyword t:-compressWhitespace,t:replaceComments
Для полного удаления всех нормализирующих функций просто добавьте специальное слово: none.
SecRule ARGS keyword t:none,t:normalisePathWin
А если встроенных функций нормализации вам не хватает, тогда в этом случае вы можете использовать новый API, который позволяет добавлять новые функции нормализации без изменения исходного кода. (За примерами обращайтесь к дистрибутиву.)
Источник: Web Security Blog
Перевод: ApacheDev.ru