Добавление правил в профиле приложений¶
Чтобы добавить правило, перейдите во вкладку Правила.
Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.
Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.
При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.
Описание ветки¶
Описание ветки состоит из набора условий для различных параметров 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
будет преобразован в:
...где something-1.example.com
является элементом header
-HOST
. Мы упоминали, что классические подстановочные знаки (wildcard) не могут быть использованы внутри элементов запроса. Поэтому понадобится регулярное выражение: установите для элемента header
-HOST
тип условия REGEX и затем задайте регулярное выражение, используя синтаксис PIRE:
-
Не используйте
*
в значении "любое количество символов". -
Поместите все
.
, которые должны быть интерпретированы буквально как точки, в квадратные скобки:something-1[.]example[.]com
-
Используйте
.
без скобок как замену "1 любого символа" и*
после нее как квантификатор "0 или более повторений предшествующего", то есть.*
и:.*[.]example[.]com
-
Добавьте
$
в конце выражения, чтобы обозначить, что строка должна заканчиваться тем, что вы ввели:.*[.]example[.]com$
Более простой способ
Вы можете пропустить
.*
и оставить только[.]example[.]com$
. В обоих случаях Вебмониторэкс будет считать, что перед[.]example[.]com$
может встречаться любой символ любое количество раз.
Расширенная форма редактирования¶
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 (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:
-
Добавьте репозиторий Вебмониторэкс:
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
-
Установите утилиту 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'а. Аргумент сравнения в этом случае не используется.
Правило¶
В секции Тогда располагается описание добавляемого правила обработки запросов.
Поддерживаются следующие правила: