Добавление правил в профиле приложений¶
Чтобы добавить правило, перейдите во вкладку Правила.
Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.
Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.
При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.
Описание ветки¶
Описание ветки состоит из набора условий для различных параметров 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 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
-
Установите утилиту 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'а. Аргумент сравнения в этом случае не используется.
Правило¶
В секции Тогда располагается описание добавляемого правила обработки запросов.
Поддерживаются следующие правила: