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

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

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

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

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

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

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

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

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

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

Значение 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 stretch/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    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 stretch/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node stretch-backports/2.18/' | sudo tee --append /etc/apt/sources.list.d/wallarm.list"
    # for correct Вебмониторэкс node operation, uncomment the following line in /etc/apt/sources.list`:
    # deb http://deb.debian.org/debian stretch-backports main contrib non-free
    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 buster/2.18/' | 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 xenial/2.18/' | 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/2.18/' | 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/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.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'а. Аргумент сравнения в этом случае не используется.

Правило

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

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