Некоторые наши клиенты стали использовать файервол веб-приложений или по-другому WAF (Web application firewall), и думаю нужно дать некоторые советы по использованию подобных внешних систем.
Первое что хочется отметить, это то-что WAF часто анализирует именно поведение, и поэтому требует постоянного внимание. Если вы что-то меняете в системе SimpleOne, то это изменение нужно обязательно промониторить в вашем WAF.
Обратите внимание на такие сообщения как:
-
Инъекции (Injections- JS, SQL, и т.д.).
-
Внешние объекты XML (XXE) (XML External Entities (XXE)).
-
Межсайтовый скриптинг (XSS) (Cross Site Scripting (XSS)).
-
Небезопасная десериализация (Insecure Deserialization).
-
Использование компонентов с известными уязвимостями (Using Components with known vulnerabilities).
Примеры ложных срабатываний WAF
Пример 1: Параметр не соответствует модели
Риск: Средний
Аномалии:
LibinjectionDetector
SQL injection detected
Topics
SYNTAX, INJECTION, SQL_INJECTION
Location
PARSE_TREE, body,api,1
{
"fingerprint": "nkf(n"
}
LibinjectionDetector
XSS injection detected
Topics
SYNTAX, INJECTION, XSS
Location
PARSE_TREE, body,addInfo,rows,0,information,model,database_value
LibinjectionDetector
XSS injection detected
Topics
SYNTAX, INJECTION, XSS
Location
PARSE_TREE, body,addInfo,rows,0,information,model,display_value
Тело запроса:
{"api":["const Waiter = function (time){\n this._time = time;\n\n this.wait = async function () {\n return new Promise(resolve => {\n setTimeout(() => { resolve(); }, this._time);\n });\n }\n}\n\nconst ConditionWaiter = function(condition, time) {\n this._interval = 0;\n this._condition = condition;\n this._time = time;\n\n this.wait = async function () {\n return new Promise(resolve => {\n this._interval = setInterval(() => {\n if (this._condition()) {\n clearInterval(this._interval);\n\n resolve();\n }\n }, this._time);\n });\n }\n}\n\nwindow.customAPI = window.customAPI || {};\nwindow.customAPI.Waiter = Waiter;\nwindow.customAPI.ConditionWaiter = ConditionWaiter;","async function translate(message) {\n return new Promise(resolve => {\n s_i18n.getMessage(message, (translation) => {\n resolve(translation);\n });\n });\n}\n\nwindow.customAPI.translate = translate;"],"eventAPI":"","currentUser":"12345678","targetUser":"12345678","response":{"messages":[{"type":"success","message":"Сообщение системы"}]},"addInfo":{"rows":[{"information":{"model":{"database_value":"<div>\n\n<h3>Заголовок:</h3>\n <ul>\n <li type=\"disc\" style=\"line-height: 1.2; font-size:12pt; font-variant:normal; white-space:pre-wrap; font-family:'Times New Roman';color:
Пример 2: Внедрение javascript-кода в страницы
Риск: Высокий
Атака на внедрение вредоносного javascript-кода в возвращаемые легитимным клиентам страницы приложения.
Аномалии:
LibinjectionDetector
SQL injection detected
Topics
SYNTAX, INJECTION, SQL_INJECTION
Location
PARSE_TREE, body,api,1
{
"fingerprint": "nkf(n"
}
LibinjectionDetector
XSS injection detected
Topics
SYNTAX, INJECTION, XSS
Location
PARSE_TREE, body,addInfo,rows,0,information,model,database_value
LibinjectionDetector
XSS injection detected
Topics
SYNTAX, INJECTION, XSS
Location
PARSE_TREE, body,addInfo,rows,0,information,model,display_value
Запрос и заголовки:
host
my.simpleone.com
accept-encoding
gzip, deflate, br
x-q-domid
19653
authorization
Bearer kyzifYaQJzkzJusnFWdbfqUEWATLgK-a
x-forwarded-for
5.3.148.52
x-qrator-tcp-info
56014, 22520, 11260
x-q-geoip
RU
sec-fetch-dest
empty
accept
application/json, text/plain, */*
sec-fetch-site
same-origin
accept-language
ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
sec-fetch-mode
cors
content-length
9968
referer
https://my.simpleone.com/portal/my_accounts
content-type
application/json
x-qrator-ip-source
5.3.148.52
x-qrator-requestid
5eb7b53a6690fb427dee116283416281
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
origin
https://my.simpleone.ru
HTTP-method
POST
URI
/v1/widget/run-server-script/167647392392099683
Тело запроса:
{"api":["const Waiter = function (time){\n this._time = time;\n\n this.wait = async function () {\n return new Promise(resolve => {\n setTimeout(() => { resolve(); }, this._time);\n });\n }\n}\n\nconst ConditionWaiter = function(condition, time) {\n this._interval = 0;\n this._condition = condition;\n this._time = time;\n\n this.wait = async function () {\n return new Promise(resolve => {\n this._interval = setInterval(() => {\n if (this._condition()) {\n clearInterval(this._interval);\n\n resolve();\n }\n }, this._time);\n });\n }\n}\n\nwindow.customAPI = window.customAPI || {};\nwindow.customAPI.Waiter = Waiter;\nwindow.customAPI.ConditionWaiter = ConditionWaiter;","async function translate(message) {\n return new Promise(resolve => {\n s_i18n.getMessage(message, (translation) => {\n resolve(translation);\n });\n });\n}\n\nwindow.customAPI.translate = translate;"],"eventAPI":"","currentUser":"12345678","targetUser":"12345678","response":{"messages":[{"type":"success","message":"Сообщение системы"}]},"addInfo":{"rows":[{"information":{"model":{"database_value":"<div>\n\n<h3>Типы учетных записей:</h3>\n <ul>\n <li type=\"disc\" style=\"line-height: 1.2; font-size:12pt; font-variant:normal; white-space:pre-wrap; font-family:'Times New Roman';color:
Пример 3: Внедрение операторов языка SQL-запросов
Риск: Высокий
Атака на изменение логики работы SQL-запросов от приложения к СУБД, в ходе которой злоумышленник внедряет SQL-операторы в параметры, обрабатываемые приложением, для считывания из СУБД недоступных через интерфейс данных, или для выполнения служебных функций СУБД (например, команду ОС).
Все примеры приведенные выше являются тестовыми и не несут реальных данных, но основаны на реальных инцидентах.