Міжсайтовий скриптинг на основі DOM (DOM-based XSS) – це тип атаки, що експлуатує модель об’єктів документів (DOM, Document Object Model).
Як працює XSS на основі DOM?
DOM – це внутрішня структура даних, яка зберігає всі об’єкти та властивості вебсторінки. Наприклад, кожен тег, що використовується в HTML-коді, представляє об’єкт DOM.
Крім того, DOM вебсторінки містить інформацію про такі властивості, як URL-адреса сторінки та метадані. Розробники можуть звертатися до цих об’єктів та властивостей за допомогою JavaScript та змінювати їх динамічно.
Модель об’єктів документів – це те, що допомагає створити динамічні односторінкові програми. Однак, це також те, що робить можливим міжсайтовий скриптинг на основі DOM.
На відміну від усіх інших типів міжсайтового скриптингу, XSS на основі DOM – це виключно вразливість на стороні клієнта. Це означає, що корисне навантаження ніколи не досягає сервера. Вся атака відбувається у веббраузері.
Міжсайтовий скриптинг на основі DOM схожий на відображений XSS, оскільки під час атаки жодна інформація не зберігається. XSS на основі DOM також здійснюється шляхом обману цілі, щоб вона натиснула на шкідливу URL-адресу.
Джерела та приймачі в XSS на основі DOM
Кожна вразливість XSS на основі DOM має два елементи: джерело вхідних даних користувача та місце, куди вони записуються, що називається приймачем (sink).
Поширеними джерелами, якими можуть маніпулювати зловмисники, є document.URL, document.documentURI, location.href, location.search, location.*, window.name та document.referrer.
Популярними приймачами є document.write, (element).innerHTML, eval, setTimeout, setInterval та execScript.
Щоб код JavaScript був вразливим до XSS на основі DOM, він повинен отримувати інформацію з джерела, яке може контролювати зловмисник, а потім передавати її приймачу.
Приклад XSS на основі DOM
У цьому прикладі розробник хоче відобразити ім’я користувача на сторінці панелі інструментів (dashboard.html). Воно передається до програми як параметр в URL-адресі:
<html>
(...)
Dashboard for
<script>
var pos=document.URL.indexOf("context=")+8;
document.write(decodeURIComponent(document.URL.substring(pos)));
</script>
(...)
</html>
Скрипт шукає context= в URL-адресі (document.URL.indexOf(“context=”)), бере весь текст праворуч від нього (+8 означає 8 символів праворуч від початку context=) та використовує document.write для вставки цього тексту безпосередньо в HTML для інтерпретації браузером.
Якщо викликати цю URL-адресу:
http://www.example.com/dashboard.html?context=Thomas
На сторінці буде написано:
Dashboard for Thomas
Атака XSS на основі DOM
Важливо: інформація надана виключно для підвищення обізнаності щодо ризиків і не закликає до протиправних дій.
Зловмисник створює наступну URL-адресу:
http://www.example.com/dashboard.html?context=
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%4c%45
%41%56%45%20%54%48%49%53%20%50%41%47%45%21%20%59%4f
%55%20%41%52%45%20%42%45%49%4e%47%20%48%41%43%4b%45
%44%21%22%29%3b%3c%2f%73%63%72%69%70%74%3e
Довгий рядок шістнадцяткових кодів у цьому корисному навантаженні є URL-кодованою формою наступного вмісту:
<script>alert("LEAVE THIS PAGE! YOU ARE BEING HACKED!");</script>
Потім зловмисник надсилає URL-адресу цілі, наприклад, в електронному листі. Далі вона натискає на неї, браузер відкриває сторінку dashboard.html та запускає шкідливий скрипт. Це переписує вміст документа та вставляє наступний тег у HTML-код, інтерпретований браузером:
Dashboard for <script>alert("LEAVE THIS PAGE! YOU ARE BEING HACKED!");</script>
В результаті браузер відображає спливаюче вікно, яке закликає залишити сторінку. Наслідком цього є те, що цільові користувачі перестануть відвідувати вебзастосунок, побоюючись за свою безпеку.
Виправлення
Розробник переписує код, використовуючи безпечний приймач. В результаті, ненадійний вміст з джерела завжди буде інтерпретуватися як текст, а не як код:
<html>
(...)
Dashboard for <span id="contentholder"></span>
<script>
var pos=document.URL.indexOf("context=")+8;
document.getElementById("contentholder").textContent =
document.URL.substring(pos,document.URL.length);
</script>
(...)
</html>
Розробник створює плейсхолдер і записує ім’я користувача не безпосередньо в HTML, а у властивість textContent об’єкта (використовуючи безпечний приймач). Це гарантує, що браузер не інтерпретуватиме цей вміст як код і просто відображатиме його як текст.
Наслідки XSS на основі DOM
Ось деякі дії, які можуть виконати зловмисні хакери на основі простого прикладу, наведеного вище:
- Вони можуть створити фішингову кампанію та розіслати мільйони електронних листів, що містять шкідливе посилання з корисним навантаженням, яке перенаправляє користувачів на сторінку, розроблену для імітації вебпрограми. В результаті мільйони користувачів можуть втратити свої облікові дані та звинуватити вебсайт, що може серйозно зашкодити репутації.
- Зловмисники можуть створити корисне навантаження, яке перенаправляє юзера на сторінку, що імітує вхід до програми. Потім вони можуть надіслати цю шкідливу URL-адресу внутрішнім користувачам, навіть генеральному директору. Якщо навіть один із них попадеться на цю хитрість, зловмисник отримає його облікові дані для ескалації атаки. Зрештою, це може дозволити йому отримати доступ до інших комп’ютерних систем в організації.
Як запобігти XSS на основі DOM
Найкращий спосіб повністю уникнути вразливостей XSS на основі DOM у коді JavaScript – це використовувати правильний метод виводу (безпечний приймач).
Варто зазначити, що не всі елементи DOM мають безпечний метод виводу. Є випадки, коли просто потрібно уникати використання ненадійних даних.
Також можна застосовувати типові методи захисту від XSS (фільтрацію та екранування) для JavaScript. На жаль, на відміну від серверних мов, не існує універсальних бібліотек JavaScript, які допоможуть фільтрувати та екранувати дані, тому розробникам доводиться самостійно писати та підтримувати таку функціональність.
Як виявити XSS на основі DOM
Такі вразливості можна виявити за допомогою інструментів динамічного тестування безпеки додатків, як-от DAST. Наприклад, це може бути Invicti (на основі Acunetix та Netsparker). Щоб безкоштовно протестувати це рішення, залиште ваші контактні дані нижче, і ми звернемося до вас:







