Особенности работы SimpleOne через WAF

Некоторые наши клиенты стали использовать файервол веб-приложений или по-другому 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-операторы в параметры, обрабатываемые приложением, для считывания из СУБД недоступных через интерфейс данных, или для выполнения служебных функций СУБД (например, команду ОС).

Все примеры приведенные выше являются тестовыми и не несут реальных данных, но основаны на реальных инцидентах.

Ссылки для ознакомления:

4 лайка