Добавление правил в профиле приложений¶
Чтобы добавить правило, перейдите во вкладку Правила.
Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.
Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.
При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.
Описание ветки¶
Описание ветки состоит из набора условий для различных параметров 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 после первой точки (
.). Может отсутствовать в запросе.
- path — массив с частями 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:
-
Добавьте репозиторий Вебмониторэкс:
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 updatesudo 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 updatesudo 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 updatesudo 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 updatesudo 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 updatesudo 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 -
Установите утилиту cpire:
sudo apt install libcpire-utils -
Запустите улититу cpire:
cpire-runner -r '<YOUR_REGULAR_EXPRESSION>' -
Введите строку для проверки совпадения с регулярным выражением. Утилита вернет ответ:
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'а. Аргумент сравнения в этом случае не используется.
Правило¶
В секции Тогда располагается описание добавляемого правила обработки запросов.
Поддерживаются следующие правила:
