Перейти к содержанию

Добавление правил в профиле приложений

Чтобы добавить правило, перейдите во вкладку Правила.

Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.

Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.

При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.

Добавление правила

Описание ветки

Описание ветки состоит из набора условий для различных параметров HTTP‑запроса, которым он должен удовлетворять, чтобы применились правила, относящиеся к данной ветке. В форме создания правила каждая строка в секции Если в запросе означает отдельное условие, состоящее из трех полей: point, тип и аргумент сравнения. Правила, описанные в ветке, применяются к запросу, только если выполнены все условия.

Для настройки набора условий вы можете использовать как конструктор URI, так и расширенную форму.

Конструктор URI

Работа с конструктором URI

Конструктор URI позволяет задать набор условий для срабатывания правила с помощью одной строки. В строке задаются метод и адрес запроса, к которому будет применяться правило:

  • Метод запроса необходимо выбрать из выпадающего списка. Если значение не выбрано, правило будет применяться к запросам с любым методом.

  • Адрес запроса необходимо ввести в специальное поле. Строка может иметь следующий формат:

    Формат Примеры и значения элементов запроса
    Полный URI, включая:
    • Схему (значение не учитывается, можно задать явно в расширенной форме)
    • Домен
    • Порт
    • Путь
    • Параметры URI
    https://example.com:3000/api/user.php?q=action&w=delete
    • [header, 'HOST']example.com:3000
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]php
    • [query, 'q']action
    • [query, 'w']delete
    URI с неполным набором компонентов example.com/api/user
    • [header, 'HOST']example.com
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]

    http://example.com/api/clients/user/?q=action&w=delete
    • [header, 'HOST']example.com
    • [path, 0]api
    • [path, 1]clients
    • [path, 2]
    • [action_name]user
    • [query, 'q']action
    • [query, 'w']delete

    /api/user
    • `[header, 'HOST'] — любое значение
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]
    URI с * для обозначения компонента с любым значением, кроме пустого example.com/*/create/*.*
    • [header, 'HOST']example.com
    • [path, 0] — любое значение, кроме пустого (скрыто в расширенной форме редактирования)
    • [path, 1]create
    • [path, 2]
    • [action_name] — любое значение, кроме пустого (скрыто в расширенной форме редактирования)
    • [action_ext] — любое значение, кроме пустого (скрыто в расширенной форме редактирования)
    • Совпадет с example.com/api/create/user.php.
      Не совпадет с example.com/create/user.php и example.com/api/create.
    URI с ** для обозначения любого количества компонентов, в том числе отсутствия example.com/**/user
    • [header, 'HOST']example.com
    • [action_name]user
    • [action_ext]
    • Совпадет с example.com/api/create/user и example.com/api/user.
      Не совпадет с example.com/user, example.com/api/user/index.php и example.com/api/user/?w=delete.

    example.com/api/**/*.*
    • [header, 'HOST']example.com
    • [path, 0]api
    • [action_name] — любое значение, кроме пустого (скрыто в расширенной форме редактирования)
    • [action_ext] — любое значение, кроме пустого (скрыто в расширенной форме редактирования)
    • Совпадет с example.com/api/create/user.php и example.com/api/user/create/index.php.
      Не совпадет с example.com/api, example.com/api/user и example.com/api/create/user.php?w=delete.
    URI с регулярным выражением в качестве значения компонента (регулярное выражение необходимо указывать в {{}}) example.com/user/{{[0-9]}}
    • [header, 'HOST']example.com
    • [path, 0]user
    • [path, 1]
    • [action_name][0-9]
    • [action_ext]
    • Совпадет с example.com/user/3445.
      Не совпадет с example.com/user/3445/888 и example.com/user/3445/index.php.

Строка, введенная в конструкторе URI, автоматически преобразовывается в набор условий для следующих элементов запроса:

  • method

  • header. С помощью конструктора URI можно задать только заголовок HOST.

  • path, action_name, action_ext. Перед сохранением правила убедитесь, что значения этих элементов определены одним из следующих способов:

    • Явное значение для определенного номера path + action_name + action_ext (опционально)
    • Явное значение для action_name + action_ext (опционально)
    • Явное значение для определенного номера path без action_name и action_ext
  • query

Вы можете завершить редактирование значения, заданного в конструкторе URI, в расширенной форме. В том числе добавить элементы запросы, которые не поддерживаются в конструкторе URI.

Использование подстановочных знаков (wildcards)

Можно ли использовать подстановочные знаки (wildcards) при работе с конструктором URI в Вебмониторэкс? Нет и да. "Нет" означает, что вы не можете использовать их классически – для замены других симовлов или их последовательностей. "Да" означает, что вы можете достигнуть аналогичного результата, действуя так:

  • В элементах URI используйте регулярные выражения вместо подстановочных знаков.

  • Используйте знаки * или ** в самой строке URI в значении "один или несколько компонентов" (смотрите примеры в разделе выше).

Детали

Синтаксис регулярных выражений отличается от классических подстановочных знаков (wildcards), но позволяет достигнуть тех же результатов. Например, вы хотите получить маску, соответствующую адресам:

  • something-1.example.com/user/create.com и

  • anything.something-2.example.com/user/create.com

...которую с классическими подстановочными знаками (wildcards) вы бы попытались получить примерно так:

  • *.example.com/user/create.com

Однако в конструкторе URI, something-1.example.com/user/create.com будет преобразован в:

Пример преобразования URI в элементы

...где something-1.example.com является элементом header-HOST. Мы упоминали, что классические подстановочные знаки (wildcard) не могут быть использованы внутри элементов запроса. Поэтому понадобится регулярное выражение: установите для элемента header-HOST тип условия REGEX и затем задайте регулярное выражение, используя синтаксис PIRE:

  1. Не используйте * в значении "любое количество символов".

  2. Поместите все ., которые должны быть интерпретированы буквально как точки, в квадратные скобки:

    something-1[.]example[.]com

  3. Используйте . без скобок как замену "1 любого символа" и * после нее как квантификатор "0 или более повторений предшествующего", то есть .* и:

    .*[.]example[.]com

  4. Добавьте $ в конце выражения, чтобы обозначить, что строка должна заканчиваться тем, что вы ввели:

    .*[.]example[.]com$

    Более простой способ

    Вы можете пропустить .* и оставить только [.]example[.]com$. В обоих случаях Вебмониторэкс будет считать, что перед [.]example[.]com$ может встречаться любой символ любое количество раз.

    Использование регулярного выражения в элементе HOST

Расширенная форма редактирования

Point

Поле point содержит параметр, значение которого необходимо взять для сравнения. В данный момент поддерживаются не все point'ы, которые может анализировать WAF‑нода.

  • application — ID приложения.

  • proto — версия HTTP‑протокола (1.0, 1.1, 2.0, ...).

  • scheme — http или https.

  • uri — часть URL запроса без адреса домена (например, /blogs/123/index.php?q=aaa для запроса, отправленного на адрес http://example.com/blogs/123/index.php?q=aaa).

  • path, action_name, action_ext — иерархическая часть URI, где:

    • path — массив с частями URI, разделенными /, кроме последней. Если URI состоит только из одной части, массив будет пустым.
    • action_name — последняя часть URL после / и до первой точки (.). Всегда присутствует в запросе, даже если значение — пустая строка.
    • action_ext — последняя часть URI после первой точки (.). Может отсутствовать в запросе.
  • query — параметры URL (параметры строки запроса).

  • header — заголовки запроса. При вводе имени заголовка, наиболее частые значения отображаются в выпадающем списке. Например: HOST, USER-AGENT, COOKIE, X-FORWARDED-FOR, AUTHORIZATION, REFERER, CONTENT-TYPE.

  • method — методы запроса. Если значение не задано в явном виде, правило применяется к запросам, отправленным любым методом.

Тип условия EQUAL (=)

Значение point'а должно точно совпадать с аргументом сравнения. Например, с example совпадет только example.

Тип условия EQUAL для значения заголовка HOST

Чтобы правила покрывали больше запросов, мы ввели ограничение на использование типа условия EQUAL с заголовком HOST. Вместо типа EQUAL мы рекомендуем использовать IEQUAL, который допускает значения параметра в любом регистре.

Если у вас есть созданное правило с типом условия EQUAL, он будет автоматически заменен на IEQUAL.

Тип условия IEQUAL (Aa)

Значение point'а должно совпадать с аргументом сравнения в любом регистре. Например, с example совпадет example, ExAmple, exampLe и т.д.

Тип условия REGEX** (.*)

Значение point'а должно соответствовать регулярному выражению.

Синтаксис регулярных выражений

Для поиска совпадений строк с регулярными выражениями применяется библиотека PIRE, которая поддерживает стандартный синтаксис регулярных выражений с некоторыми особенностями. Синтаксис описан ниже и в README‑файле в репозитории PIRE.

Синтаксис регулярных выражений

Символы, которые не требуют экранирования:

  • Строчная латиница: a b c d e f g h i j k l m n o p q r s t u v w x y z
  • Прописная латиница: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  • Цифры: 0 1 3 4 5 6 7 8 9
  • Специальные символы: ! " # % ' , - / : ; < = > @ ] _ ` }
  • Пробелы

Символы, которые необходимо поместить в [] вместо экранирования через \:

  • . $ ^ { [ ( | ) * + ? \ & ~

Символы, которые необходимо конвертировать в ASCII по стандарту ISO‑8859:

  • Символы UTF‑8 (например, русская буква т в ASCII — т)

Группы символов:

  • . для всех символов кроме перехода на новую строку
  • () для группировки регулярных выражений, поиска совпадения со значением в (), установки приоритета условий в регулярном выражении
  • [] для одного из символов в [] (чувствительно к регистру); группа может использоваться для специфичных случаев:
    • для игнорирования регистра (например, [cC])
    • [a-z] для совпадения с любой буквой из строчной латиницы
    • [A-Z] для совпадения с любой буквой из прописной латиницы
    • [0-9] для совпадения с любой цифрой
    • [a-zA-Z0-9\.] для совпадения с любой буквой из строчной или прописной латиницы, цифрой или точкой

Логические операторы:

  • ~ для инверсии (=NOT). При этом инвертируемое выражение и логический оператор должны быть помещены в (), например: ^(~(a))$
  • | для дизъюнкции (=OR)
  • & для конъюнкции (=AND)

Символы для обозначения границ строки:

  • ^ для начала строки
  • $ для конца строки

Квантификаторы:

  • * для 0 или более повторений предшествующего регулярного выражения
  • + для 1 или более повторений предшествующего регулярного выражения
  • ? для 0 или 1 повторения предшествующего регулярного выражения
  • {m} для m повторений предшествующего регулярного выражения
  • {m,n} для повторений предшествующего регулярного выражения от m до n раз; если n опущено, от m до бесконечности повторений

Комбинации символов, которые работают с особенностями:

  • ^.*$ эквивалентно ^.+$ (пустая строка не совпадет с ^.*$)
  • ^.?$, ^.{0,}$, ^.{0,n}$ эквивалентно ^.+$

Временно не поддерживаются:

  • Классы символов: \W для небуквенного символа, \w для буквенного символа, \D для нецифрового символа, \d для цифрового символа, \S для непробельного символа, \s для пробела

Не поддерживаются:

  • Трехзначный восьмеричный код: \NNN, \oNNN, \ONNN
  • \cN задание управляющих символов через \c (например, \cC для CTRL+C)
  • \A для начала строки
  • \z для конца строки
  • \b для границы строки (до или после пробельного символа)
  • Ленивые квантификаторы: ??, *?, +?
  • Условные конструкции

Тестирование регулярных выражений

Для проверки регулярных выражений вы можете использовать утилиту cpire на поддерживаемой версии Debian или Ubuntu:

  1. Добавьте репозиторий Вебмониторэкс:

    sudo apt update
    sudo apt install dirmngr
    curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node buster/4.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    sudo apt install dirmngr
    curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node bullseye/4.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/wallarm-node bionic/4.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/wallarm-node focal/4.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add -
    sh -c "echo 'deb https://repo.webmonitorx.ru/ubuntu/webmonitorx-node jammy/4.8/' | sudo tee /etc/apt/sources.list.d/wmx.list"
    sudo apt update
    
  2. Установите утилиту cpire:

    sudo apt install libcpire-utils
    
  3. Запустите улититу cpire:

    cpire-runner -r '<YOUR_REGULAR_EXPRESSION>'
    
  4. Введите строку для проверки совпадения с регулярным выражением. Утилита вернет ответ:

    • 0, если строка совпадает с регулярным выражением
    • FAIL, если строка не совпадает с регулярным выражением
    • Сообщение об ошибке, если регулярное выражение невалидное

    Особенности обработки символа \

    Если в регулярном выражении есть символ \, экранируйте его через [] и \ (например, [\\]).

Примеры регулярных выражений, добавленных через Консоль управления Вебмониторэкс

  • Для совпадения со строкой, которая содержит /.git

    /[.]git
    
  • Для совпадения со строкой, которая содержит .example.com

    [.]example[.]com
    
  • Для совпадения со строкой, которая заканчивается на /.example.*.com, где * - любой символ любое количество раз

    /[.]example[.].*[.]com$
    
  • Для совпадения с любым IP‑ адресом кроме 1.2.3.4 и 5.6.7.8

    ^(~((1[.]2[.]3[.]4)|(5[.]6[.]7[.]8)))$
    
  • Для совпадения со строкой, которая заканчивается на /.example.com.php

    /[.]example[.]com[.]php$
    
  • Для совпадения со строкой, которая содержит sqlmap с буквами любого регистра: sqLmAp, SqLMap и т.д.

    [sS][qQ][lL][mM][aA][pP]
    
  • Для совпадения со строкой, которая содержит одно или несколько значений: admin\.exe, admin\.bat, admin\.sh, cmd\.exe, cmd\.bat, cmd\.sh

    (admin|cmd)[\].(exe|bat|sh)
    
  • Для совпадения со строкой, которая содержит одно или несколько значений: onmouse с буквами любого регистра, onload с буквами любого регистра, win\.ini, prompt

    [oO][nN][mM][oO][uU][sS][eE]|[oO][nN][lL][oO][aA][dD]|win[\].ini|prompt
    
  • Для совпадения со строкой, которая начинается с Mozilla, но не содержит 1aa875F49III

    ^(Mozilla(~(.*1aa875F49III.*)))$
    
  • Для совпадения со строкой, которая имеет одно из значений: python‑requests/, PostmanRuntime/, okhttp/3.14.0, node-fetch/1.0

    ^(python-requests/|PostmanRuntime/|okhttp/3.14.0|node-fetch/1.0)
    

Тип условия ABSENT ()

В запросе не должно быть указанного point'а. Аргумент сравнения в этом случае не используется.

Правило

В секции Тогда располагается описание добавляемого правила обработки запросов.

Поддерживаются следующие правила: