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

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

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

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

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

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

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

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

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

Point

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

  • instance — ID приложения;

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

  • scheme — http или https;

  • url — полный URL запроса в том виде, как он передавался в первой строке HTTP‑запроса;

  • path, action_name, action_ext — части URL. Подробнее описаны в описании анализа запроса;

  • get — GET-параметры в запросе;

  • header — заголовки запроса;

  • method — методы запроса.

Типы условий

EQUAL

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

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)
  • | для дизъюнкции (=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. Добавьте репозиторий Валарм:

    apt-get update
    apt-get install dirmngr
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node jessie/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
    apt-get update
    apt-get install dirmngr
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node stretch/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
    apt-get update
    apt-get install dirmngr
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node buster/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
    apt-get update
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/ubuntu/wallarm-node trusty/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
    apt-get update
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/ubuntu/wallarm-node xenial/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
    apt-get update
    apt-key adv --keyserver keys.gnupg.net --recv-keys 72B865FD
    sh -c "echo 'deb http://repo.wallarm.com/ubuntu/wallarm-node bionic/2.14/' > /etc/apt/sources.list.d/wallarm.list"
    apt-get update
    
  2. Установите утилиту cpire:

    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
    

ABSENT

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

Правило

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

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