# XSS (Cross Site Scripting)
Якщо вас цікавить **кар'єра хакера** і взламати невзламне - **ми шукаємо співробітників!** (_вимагається вільне письмо і мовлення польською_).
{% embed url="https://www.stmcyber.com/careers" %}
## Методологія
1. Перевірте, чи **будь-яке значення, яким ви керуєте** (_параметри_, _шлях_, _заголовки_?, _куки_?) відображається в HTML або **використовується** **JS** кодом.
2. **Знайдіть контекст**, де воно відображається/використовується.
3. Якщо **відображається**
4. Перевірте, **які символи ви можете використовувати** і в залежності від цього підготуйте навантаження:
5. У **чистому HTML**:
6. Чи можете ви створити нові HTML теги?
7. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
8. Чи можете ви обійти захисти?
9. Чи HTML-контент інтерпретується будь-яким клієнтським JS движком (_AngularJS_, _VueJS_, _Mavo_...), ви можете використати [**Внедрення шаблонів на клієнтському боці**](../client-side-template-injection-csti.md).
10. Якщо ви не можете створити HTML теги, які виконують JS код, чи можете ви використати [**Висячий маркер - HTML внедрення без скриптів**](../dangling-markup-html-scriptless-injection/)?
11. У межах **HTML тегу**:
12. Чи можете ви вийти в чистий HTML контекст?
13. Чи можете ви створити нові події/атрибути для виконання JS коду?
14. Чи атрибут, де ви застрягли, підтримує виконання JS?
15. Чи можете ви обійти захисти?
16. У межах **JS коду**:
17. Чи можете ви вийти з тегу ``** сторінки HTML, всередині файлу `.js` або всередині атрибуту, використовуючи протокол **`javascript:`**:
* Якщо відображається між тегами **``**, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати впровадити `` та вийти з цього контексту. Це працює, оскільки **браузер спочатку аналізує теги HTML**, а потім вміст, тому він не помітить, що ваш впроваджений тег `` знаходиться всередині HTML-коду.
* Якщо відображається **всередині рядка JS** і попередній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **перебудувати** код JS (якщо виникне помилка, вона не буде виконана):
* `'-alert(1)-'`
* `';-alert(1)//`
* `\';alert(1)//`
* Якщо відображається всередині шаблонних літералів, ви можете **вбудовувати вирази JS** за допомогою синтаксису `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
* **Кодування Unicode** працює для написання **дійсного коду JavaScript**:
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
#### Підняття Javascript
Підняття Javascript посилається на можливість **оголошення функцій, змінних або класів після їх використання, щоб ви могли використовувати сценарії, де XSS використовується невизначені змінні або функції.**\
**Перевірте наступну сторінку для отримання додаткової інформації:**
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md)
{% endcontent-ref %}
### Функція Javascript
На декількох веб-сторінках є кінцеві точки, які **приймають як параметр назву функції для виконання**. Загальним прикладом, який можна побачити в дикій природі, є щось на зразок: `?callback=callbackFunc`.
Добрим способом виявити, чи щось, що надається користувачем, намагається бути виконаним, є **зміна значення параметра** (наприклад, на 'Vulnerable') та перегляд консолі за помилками, подібними до:
![](<../../.gitbook/assets/image (651) (2).png>)
У разі вразливості ви можете **спровокувати сповіщення**, просто відправивши значення: **`?callback=alert(1)`**. Однак дуже поширено, що ці кінцеві точки будуть **перевіряти вміст**, щоб дозволяти лише літери, цифри, крапки та підкреслення (**`[\w\._]`**).
Однак, навіть з таким обмеженням, все ще можливо виконати деякі дії. Це тому, що ви можете використовувати ці дійсні символи для **доступу до будь-якого елемента в DOM**:
![](<../../.gitbook/assets/image (662).png>)
Деякі корисні функції для цього:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
Ви також можете спробувати **запустити функції Javascript** безпосередньо: `obj.sales.delOrders`.
Проте, зазвичай кінцеві точки, які виконують вказану функцію, є кінцевими точками без цікавого DOM, **інші сторінки в тому ж походженні** матимуть **цікавіший DOM** для виконання більше дій.
Отже, для того, щоб **зловживати цією вразливістю в іншому DOM**, було розроблено використання **експлуатації методу виконання з тієї ж самої початкової точки (SOME)**:
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
{% endcontent-ref %}
### DOM
Є **JS-код**, який **небезпечно** використовує деякі **дані, керовані зловмисником**, такі як `location.href`. Зловмисник може скористатися цим для виконання довільного JS-коду.
{% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md)
{% endcontent-ref %}
### **Універсальний XSS**
Цей тип XSS можна знайти **буде де**. Вони не залежать лише від використання клієнта веб-додатку, але від **будь-якого** **контексту**. Цей тип **довільного виконання JavaScript** може бути використаний навіть для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах та серверах, та інше.\
Деякі **приклади**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %}
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %}
## Обхід WAF кодуванням зображення
![з https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg)
## Впровадження всередину обробленого HTML
Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете вибрати і впровадити HTML-код в цьому контексті, **перше**, що вам потрібно зробити - перевірити, чи можете ви зловживати `<` для створення нових тегів: просто спробуйте **відобразити** цей **символ** та перевірте, чи він **кодується в HTML**, чи **видаляється**, чи він **відображається без змін**. **Тільки в останньому випадку ви зможете використати цей випадок**.\
Для цих випадків також **пам'ятайте** [**Впровадження шаблонів на клієнтському боці**](../client-side-template-injection-csti.md)**.**\
_**Примітка: HTML-коментар можна закрити за допомогою\*\*\*\***** ****`-->`**** ****або \*\*\*\*****`--!>`**_
У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати навантаження, подібні до:
```html