diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 4a3b0fd98..78ed382d0 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -10,8 +10,8 @@ 1. Чи можете ви створити нові HTML теги? 2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`? 3. Чи можете ви обійти захист? -4. Чи інтерпретується HTML контент будь-яким клієнтським JS двигуном (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Якщо ви не можете створити HTML теги, які виконують JS код, чи можете ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +4. Чи інтерпретується HTML контент будь-яким клієнтським JS движком (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Якщо ви не можете створити HTML теги, які виконують JS код, чи могли б ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Всередині **HTML тегу**: 1. Чи можете ви вийти в сирий HTML контекст? 2. Чи можете ви створити нові події/атрибути для виконання JS коду? @@ -19,13 +19,13 @@ 4. Чи можете ви обійти захист? 3. Всередині **JavaScript коду**: 1. Чи можете ви втекти з тегу ``** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол: -- Якщо відображається між **``** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `` знаходиться всередині HTML-коду. -- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний): +- Якщо відображається між **``** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `` і вийти з цього контексту. Це працює, тому що **браузер спочатку парсить HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений `` тег знаходиться всередині HTML-коду. +- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** ваш код і **відновити** JS код (якщо є помилка, він не буде виконаний): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Якщо відображається всередині шаблонних літералів, ви можете **вбудувати JS вирази**, використовуючи синтаксис `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- Якщо відображається всередині шаблонних літералів, ви можете **вбудувати JS вирази** за допомогою синтаксису `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` - **Unicode кодування** працює для написання **дійсного javascript коду**: ```javascript alert(1) @@ -92,13 +92,13 @@ js-hoisting.md ### Javascript Function -Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в реальному житті, це щось на кшталт: `?callback=callbackFunc`. +Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в дії, це щось на зразок: `?callback=callbackFunc`. -Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається виконатися, це **модифікувати значення параметра** (наприклад, на 'Vulnerable') і шукати в консолі помилки, такі як: +Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як: ![](<../../images/image (711).png>) -У разі, якщо це вразливо, ви могли б **викликати alert**, просто надіславши значення: **`?callback=alert(1)`**. Однак, дуже поширено, що ці кінцеві точки **перевіряють вміст**, щоб дозволити лише літери, цифри, крапки та підкреслення (**`[\w\._]`**). +У разі, якщо це вразливо, ви могли б **викликати сповіщення**, просто надіславши значення: **`?callback=alert(1)`**. Однак, дуже поширено, що ці кінцеві точки **перевіряють вміст**, щоб дозволити лише літери, цифри, крапки та підкреслення (**`[\w\._]`**). Проте, навіть з цим обмеженням, все ще можливо виконати деякі дії. Це пов'язано з тим, що ви можете використовувати ці допустимі символи, щоб **отримати доступ до будь-якого елемента в DOM**: @@ -114,7 +114,7 @@ parentElement ``` Ви також можете спробувати **викликати функції Javascript** безпосередньо: `obj.sales.delOrders`. -Однак, зазвичай кінцеві точки, що виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій. +Однак, зазвичай кінцеві точки, які виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій. Тому, щоб **зловживати цією вразливістю в іншому DOM**, була розроблена експлуатація **Same Origin Method Execution (SOME)**: @@ -132,7 +132,7 @@ dom-xss.md ### **Універсальний XSS** -Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, а й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах та багато іншого.\ +Ці види XSS можуть бути знайдені **де завгодно**. Вони не залежать лише від експлуатації клієнта веб-додатку, а від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах, і більше.\ Деякі **приклади**: {{#ref}} @@ -149,8 +149,8 @@ server-side-xss-dynamic-pdf.md ## Впровадження всередині сирого HTML -Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти та впровадити HTML код у цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML кодується** або **видаляється**, або чи він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\ -Для цих випадків також **пам'ятайте** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти і впровадити HTML код в цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML кодується** або **видаляється**, або якщо він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\ +Для цих випадків також **пам'ятайте** про [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ _**Примітка: HTML коментар може бути закритий за допомогою\*\*\*\*\*\***\***\*`-->`\*\***\***\*або \*\*\*\*\*\***`--!>`\*\*_ У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати payloads, такі як: @@ -161,12 +161,12 @@ alert(1) ``` -Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **брутфорсити, які теги** ви можете створити.\ -Коли ви **знайдете, які теги дозволені**, вам потрібно буде **брутфорсити атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст. +Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **перебрати, які теги** ви можете створити.\ +Коли ви **знайдете, які теги дозволені**, вам потрібно буде **перебрати атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст. -### Брутфорс тегів/подій +### Перебір тегів/подій -Перейдіть на [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **брутфорсити всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше). +Перейдіть на [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **перебрати всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше). ### Користувацькі теги @@ -243,14 +243,14 @@ onerror=alert`1` ### Неможливо - Dangling Markup -Якщо ви просто вважаєте, що **неможливо створити HTML тег з атрибутом для виконання JS коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду. +Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду. -## Впровадження всередині HTML тегу +## Впровадження всередині HTML-тегу ### Всередині тегу/вихід з значення атрибута -Якщо ви **всередині HTML тегу**, перше, що ви можете спробувати, це **вийти** з тегу і використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS код.\ -Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS код, наприклад, використовуючи деякі пейлоади, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_): +Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS-код.\ +Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться, якщо ваш ввід відображається безпосередньо всередині тегу_): ```bash " autofocus onfocus=alert(document.domain) x=" " onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t @@ -267,7 +267,7 @@ onerror=alert`1` ``` ### Всередині атрибута -Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете виконати довільний код, коли на неї натиснуть.\ +Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код при натисканні.\ Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`** **Обхід всередині події за допомогою HTML кодування/URL кодування** @@ -357,7 +357,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко %27-alert(1)-%27 ``` -Зверніть увагу, що якщо ви спробуєте **використати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**. +Зверніть увагу, що якщо ви спробуєте **використовувати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**. **Використання Hex та Octal кодування з `javascript:`** @@ -377,7 +377,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко ```javascript Click me ``` -І в **meta тегах**: +І в **meta tags**: ```html ```html ``` -**Payload XSS буде виглядати приблизно так:** `" accesskey="x" onclick="alert(1)" x="` +**Payload XSS буде щось на зразок цього: `" accesskey="x" onclick="alert(1)" x="`** ### Обхід чорного списку -Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати: +Вже було виявлено кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати: - **HTML кодування (HTML теги)** - **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)` @@ -438,17 +438,17 @@ onbeforetoggle="alert(2)" /> - **Шістнадцяткове та вісімкове кодування** - **кодування даних** -**Обхід для HTML тегів та атрибутів** +**Обходи для HTML тегів та атрибутів** -Прочитайте [Обхід чорного списку попередньої секції](#blacklist-bypasses). +Прочитайте [Обходи чорного списку попередньої секції](#blacklist-bypasses). -**Обхід для JavaScript коду** +**Обходи для JavaScript коду** -Прочитайте [чорний список обходу JavaScript наступної секції](#javascript-bypass-blacklists-techniques). +Прочитайте [чорний список обходів JavaScript наступної секції](#javascript-bypass-blacklists-techniques). ### CSS-Гаджети -Якщо ви знайшли **XSS в дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання. +Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання. Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` @@ -472,7 +472,7 @@ onbeforetoggle="alert(2)" /> ### Вихід з \`, ви можете легко **вийти, закривши тег ``, ви можете легко **вийти, закривши тег ` ``` @@ -503,7 +503,7 @@ return loop } loop`` ``` -### Закодоване виконання коду +### Виконання коду з кодуванням ```html @@ -941,9 +942,9 @@ import { partition } from "lodash" ``` ### Спеціальні шаблони заміни -Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", )`**, зловмисник може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", )`**, атакуючий може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **втечі JSON рядка** всередині скрипта та виконання довільного коду. +Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **екранування JSON рядка** всередині скрипта та виконання довільного коду. ### Chrome Cache до XSS @@ -999,7 +1000,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) // our actual module code }) ``` -Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з цієї функції для доступу до **`require`**: +Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з тієї функції для доступу до **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1267,7 +1268,7 @@ steal-info-js.md ``` > [!NOTE] -> Ви **не зможете отримати доступ до куків з JavaScript**, якщо у куці встановлено прапор HTTPOnly. Але тут ви маєте [декілька способів обійти цю захист](../hacking-with-cookies/index.html#httponly), якщо вам пощастить. +> Ви **не зможете отримати доступ до куків з JavaScript**, якщо у куку встановлено прапор HTTPOnly. Але тут ви маєте [декілька способів обійти цю захист](../hacking-with-cookies/index.html#httponly), якщо вам пощастить. ### Вкрасти вміст сторінки ```javascript @@ -1360,7 +1361,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms") ``` _Короткі часи вказують на відповідний порт_ _Довші часи вказують на відсутність відповіді._ -Перегляньте список заборонених портів у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist). +Перегляньте список портів, заборонених у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist). ### Поле для запиту облікових даних ```html @@ -1429,7 +1430,7 @@ shadow-dom.md https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### Сліпі XSS пейлоади +### Сліпі XSS-пейлоади Ви також можете використовувати: [https://xsshunter.com/](https://xsshunter.com) ```html @@ -1518,7 +1519,7 @@ xss-in-markdown.md ### XSS у динамічно створеному PDF Якщо веб-сторінка створює PDF, використовуючи введення, контрольоване користувачем, ви можете спробувати **обманути бота**, який створює PDF, щоб він **виконував довільний JS код**.\ -Отже, якщо **бот для створення PDF знаходить** якийсь **HTML** **теги**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**. +Отже, якщо **бот створення PDF знаходить** якийсь **HTML** **теги**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**. {{#ref}} server-side-xss-dynamic-pdf.md