<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks**або**завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або**слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
Селектори CSS створені для відповідності значень атрибутів `name` та `value` елемента `input`. Якщо значення атрибуту `value` елемента `input` починається з певного символу, завантажується попередньо визначений зовнішній ресурс:
Для обходу цього обмеження ви можете вибрати наступний елемент-сусід, використовуючи комбінатор загального сусіда `~`. Правило CSS потім застосовується до всіх сусідів, які слідують за прихованим елементом введення, що призводить до завантаження фонового зображення:
Практичний приклад використання цієї техніки детально описаний у наданому уривку коду. Ви можете переглянути його [тут](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
1.**Довжина Payload**: Вектор CSS ін'єкції повинен підтримувати достатньо довгі дані для вміщення створених селекторів.
2.**Повторна оцінка CSS**: Вам слід мати можливість оформити сторінку, що необхідно для спрацювання повторної оцінки CSS з новими згенерованими даними.
3.**Зовнішні ресурси**: Техніка передбачає можливість використання зовнішніх зображень. Це може бути обмежено політикою безпеки контенту (CSP) сайту.
Як [**пояснено в цьому пості**](https://portswigger.net/research/blind-css-exfiltration), можна поєднати селектори **`:has`** та **`:not`** для ідентифікації вмісту навіть зі сліпих елементів. Це дуже корисно, коли ви не знаєте, що знаходиться всередині сторінки, яка завантажує CSS ін'єкцію.\
Також можна використовувати ці селектори для вилучення інформації з кількох блоків одного типу, як у:
Поєднуючи це з наступною технікою **@import**, можливо ексфільтрувати багато **інформації, використовуючи внедрення CSS зі сліпих сторінок за допомогою** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
Попередня техніка має деякі недоліки, перевірте вимоги. Вам потрібно або мати можливість **надсилати кілька посилань жертві**, або мати можливість **вбудовувати уразливу сторінку для внедрення CSS у фрейм**.
Замість завантаження однієї й тієї ж сторінки з десятками різних навантажень кожного разу (як у попередньому варіанті), ми будемо **завантажувати сторінку лише один раз і лише з імпортом на сервер зловмисника** (це навантаження для відправлення жертві):
1.**Імпорт отримає деякий CSS-скрипт** від зловмисників, і**браузер завантажить його**.
2. Перша частина CSS-скрипту, яку зловмисник відправить, - це **ще один `@import` на сервер зловмисника**.
3. Сервер зловмисника ще не відповість на цей запит, оскільки ми хочемо витікати деякі символи, а потім відповісти на цей імпорт з навантаженням, щоб витікати наступні.
4. Друга і більша частина навантаження буде **навантаженням витоку атрибутів вибору**.
5. Це відправить на сервер зловмисника **перший символ секрету і останній**.
6. Як тільки сервер зловмисника отримає **перший і останній символи секрету**, він **відповість на імпорт, запитаний на кроці 2**.
7. Відповідь буде точно такою ж, як **кроки 2, 3 і 4**, але цього разу вона спробує **знайти другий символ секрету, а потім передостанній**.
Ви можете знайти оригінальний [**код Pepe Vila для експлуатації цього тут**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) або ви можете знайти майже [**той самий код, але з коментарями тут**.](./#css-injection)
Іноді скрипт **неправильно визначає, що префікс + суфікс, виявлені, вже є повним прапорцем**, і він продовжуватиме вперед (у префіксі) та назад (у суфіксі), і в певний момент він зупиниться.\
Не хвилюйтеся, просто перевірте **вивід**, оскільки **ви можете побачити прапор там**.
* **`.class-to-search:nth-child(2)`**: Це знайде другий елемент з класом "class-to-search" в DOM.
* Селектор **`:empty`**: Використовується, наприклад, у [**цьому описі**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
**Посилання:** [Атака на основі CSS: Зловживання unicode-range @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [PoC помилково заснованого XS-Search від @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
Загальна мета полягає в тому, щоб **використовувати власний шрифт з контрольованої точки доступу** та забезпечити, що **текст (у цьому випадку, 'A') відображається лише цим шрифтом, якщо вказаний ресурс (`favicon.ico`) не може бути завантажений**.
Псевдоклас **`:target`** використовується для вибору елемента, на який вказує **URL-фрагмент**, як вказано в [специфікації CSS Selectors Level 4](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Важливо розуміти, що `::target-text` не відповідає жодним елементам, якщо текст не є явно вказаним фрагментом.
Проблема безпеки виникає, коли зловмисники використовують функцію **прокрутки до тексту**, дозволяючи їм підтвердити наявність певного тексту на веб-сторінці, завантажуючи ресурс зі свого сервера через впровадження HTML. Метод полягає в впровадженні правила CSS, подібного до цього:
У таких сценаріях, якщо текст "Адміністратор" присутній на сторінці, ресурс`target.png` запитується з сервера, що вказує на наявність тексту. Приклад такого атаки може бути виконаний через спеціально підготовлений URL, який вбудовує впроваджений CSS разом із фрагментом прокрутки до тексту:
Тут атака маніпулює внедренням HTML для передачі CSS-коду, спрямованого на конкретний текст "Адміністратор" через фрагмент прокрутки до тексту (`#:~:text=Адміністратор`). Якщо текст знайдено, вказаний ресурс завантажується, ненавмисно сигналізуючи про свою присутність зловмиснику.
1.**Обмежене відповідність STTF**: Фрагмент прокрутки до тексту (STTF) призначений для відповідності лише словам або реченням, обмежуючи його можливість витікати довільні секрети або токени.
2.**Обмеження на верхні рівні контексту перегляду**: STTF працює виключно в контекстах перегляду верхнього рівня і не працює в межах фреймів, що робить будь-яку спробу експлуатації помітнішою для користувача.
3.**Необхідність активації користувача**: STTF потребує жесту активації користувача для роботи, що означає, що експлуатація можлива лише через користувацькі навігації, ініційовані користувачем. Це вимога значно пом'якшує ризик автоматизації атак без участі користувача. Тим не менш, автор блогу вказує на конкретні умови та обхідні шляхи (наприклад, соціальний інженерінг, взаємодія з поширеними розширеннями браузера), які можуть спрощувати автоматизацію атаки.
Для отримання додаткової інформації перевірте оригінальний звіт: [https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
Ви можете вказати **зовнішні шрифти для конкретних значень Unicode**, які будуть **зібрані лише у разі наявності цих значень Unicode** на сторінці. Наприклад:
Коли ви звертаєтеся до цієї сторінки, Chrome та Firefox витягують "?A" та "?B", оскільки текстовий вузол sensitive-information містить символи "A" та "B". Але Chrome та Firefox не витягують "?C", оскільки він не містить "C". Це означає, що нам вдалося прочитати "A" та "B".
**Посилання:** [Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
Техніка, описана включає в себе витягування тексту з вузла шляхом використання лігатур шрифту та відстеження змін у ширині. Процес включає кілька кроків:
- SVG-шрифти створюються з гліфами, які мають атрибут `horiz-adv-x`, який встановлює велику ширину для гліфа, що представляє двохсимвольну послідовність.
- Приклад гліфа SVG: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, де "XY" позначає двохсимвольну послідовність.
- Ці шрифти потім конвертуються у формат woff за допомогою fontforge.
- CSS використовується для того, щоб забезпечити, що текст не переноситься (`white-space: nowrap`) та налаштувати стиль прокрутки.
- Поява горизонтальної прокрутки, стилізованої відмінно, діє як індикатор (оракул), що певна лігатура, а отже, певна послідовність символів, присутня в тексті.
- **Крок 1**: Створюються шрифти для пар символів з великою шириною.
- **Крок 2**: Використовується трюк на основі прокрутки, щоб виявити, коли відображається гліф великої ширини (лігатура для пари символів), що вказує на наявність послідовності символів.
- **Крок 3**: Після виявлення лігатури створюються нові гліфи, що представляють трьохсимвольні послідовності, включаючи виявлену пару та додавання попереднього або наступного символу.
- **Крок 4**: Виконується виявлення трьохсимвольної лігатури.
- **Крок 5**: Процес повторюється, поступово розкриваючи весь текст.
### Витягування текстового вузла (II): витік набору символів за допомогою шрифту за замовчуванням (не потребує зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
Цей трюк був опублікований у цьому [**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what\_can\_we\_do\_with\_single\_css\_injection/). Набір символів, використаний у текстовому вузлі, може бути витіканий **за допомогою шрифтів за замовчуванням**, встановлених у браузері: не потрібні зовнішні - або власні - шрифти.
Концепція полягає в тому, щоб використовувати анімацію для поетапного розширення ширини `div`, дозволяючи по одному символу переходити з частини "суфіксу" тексту до частини "префіксу". Цей процес ефективно розбиває текст на дві секції:
Під час цього переходу використовується **трюк з діапазоном unicode**, щоб ідентифікувати кожен новий символ, як він приєднується до префіксу. Це досягається шляхом зміни шрифту на Comic Sans, який помітно вищий за шрифт за замовчуванням, що викликає вертикальну прокрутку. Поява цієї прокрутки опосередковано розкриває наявність нового символу в префіксі.
Фактично, **unicode-range використовується для виявлення символу**, але оскільки ми не хочемо завантажувати зовнішній шрифт, нам потрібно знайти інший спосіб.\
Коли **символ** знайдено, йому **надається встановлений шрифт Comic Sans**, який **робить** символ **більшим** та **запускає прокрутку**, яка **витікає знайдений символ**.
### Витік текстового вузла (III): витік кодування зі стандартним шрифтом шляхом приховування елементів (не потребує зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
У цьому випадку дуже схоже на попередній, однак у цьому випадку метою роблення певних **символів більшими, ніж інші, є приховування чогось**, наприклад кнопки, яку не може натиснути бот, або зображення, яке не завантажиться. Таким чином, ми можемо виміряти дію (або відсутність дії) і дізнатися, чи присутній певний символ у тексті.
### Витік текстового вузла (III): витік кодування за допомогою кешування часу (не потребує зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
Якщо є відповідність, **шрифт буде завантажено з `/static/bootstrap.min.css?q=1`**. Хоча він не буде успішно завантажений, **браузер повинен кешувати його**, і навіть якщо кешу немає, є механізм **304 not modified**, тому **відповідь повинна бути швидшою** ніж інші речі.
Однак, якщо різниця в часі між кешованою відповіддю та некешованою недостатньо велика, це не буде корисним. Наприклад, автор зазначив: Однак, після тестування я виявив, що перша проблема полягає в тому, що швидкість не дуже відрізняється, а друга проблема полягає в тому, що бот використовує прапорець `disk-cache-size=1`, що дійсно продумано.
### Витік текстового вузла (III): витік кодування за допомогою вимірювання завантаження сотень локальних "шрифтів" (не потребує зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
У цьому випадку ви можете вказати **CSS для завантаження сотень фейкових шрифтів** з того ж джерела, коли відбувається відповідність. Таким чином ви можете **вимірювати час**і дізнатися, чи з'являється символ чи ні за допомогою чогось на зразок:
Отже, якщо шрифт не відповідає, очікується, що час відповіді при відвідуванні бота становитиме приблизно 30 секунд. Однак, якщо є відповідність шрифту, буде відправлено кілька запитів для отримання шрифту, що призведе до постійної активності мережі. В результаті час на задоволення умови зупинки та отримання відповіді збільшиться. Тому час відповіді може бути використаний як показник для визначення відповідності шрифту.
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks**або**завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або**слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.