hacktricks/pentesting-web/http-response-smuggling-desync.md

144 lines
15 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# HTTP Response Smuggling / Desync
2022-04-28 16:01:33 +00:00
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2023-12-31 01:25:17 +00:00
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
2024-04-06 19:41:21 +00:00
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
2024-03-29 18:49:46 +00:00
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
2022-04-28 16:01:33 +00:00
</details>
2024-04-06 19:41:21 +00:00
**Техніка цього посту була взята з відео:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
2024-02-06 03:10:38 +00:00
2024-03-29 18:49:46 +00:00
## Десинхронізація черги HTTP-запитів
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
По-перше, ця техніка **зловживає вразливістю HTTP-запиту на підмішування**, тому вам потрібно знати, що це таке:
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
**Основна** **відмінність** між цією технікою та звичайним підмішуванням HTTP-запитів полягає в тому, що **замість атаки запиту жертви, додавши до нього префікс**, ми збираємося **витікати або змінювати відповідь, яку отримує жертва**. Це робиться шляхом відправлення не 1 запиту та півтора для зловживання підмішуванням HTTP-запитів, а **відправлення 2 повних запитів для десинхронізації черги відповідей проксі**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Це тому, що ми зможемо **десинхронізувати чергу відповідей**, так що **відповідь від законного запиту жертви буде відправлена зловмиснику**, або шляхом **впровадження контенту, керованого зловмисником, відповідь буде відправлена жертві**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Десинхронізація черги HTTP-каналів
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
HTTP/1.1 дозволяє запитувати **різні ресурси без очікування попередніх**. Тому, якщо є **проксі** посередині, це завдання проксі - **підтримувати синхронізоване відповідність відправлених запитів до сервера та отриманих від нього відповідей**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Однак є проблема десинхронізації черг відповідей. Якщо зловмисник відправить атаку підмішування HTTP-відповідей і відповіді на **початковий запит та підмішаний запит будуть відповідати негайно**, підмішана відповідь не буде вставлена в чергу відповідей жертви, а **просто буде відкинута як помилка**.
2021-11-05 20:59:42 +00:00
2022-03-09 12:12:51 +00:00
![](<../.gitbook/assets/image (635) (1) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Тому потрібно, щоб **підмішаний запит займав більше часу для обробки** на сервері. Таким чином, до моменту обробки підмішаного запиту спілкування з зловмисником буде завершено.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Якщо в цій конкретній ситуації **жертва відправила запит**, а **підмішаний запит відповідає раніше**, ніж законний запит, **підмішана відповідь буде відправлена жертві**. Таким чином, зловмисник буде **контролювати запит, "виконаний" жертвою**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Більше того, якщо **зловмисник виконує запит**, а **легітимна відповідь на запит жертви відповідає раніше** **запиту зловмисника**, **відповідь жертві буде відправлена зловмиснику**, **викрадаючи** відповідь жертві (яка може містити, наприклад, заголовок **Set-Cookie**).
2021-11-05 20:59:42 +00:00
2022-03-09 12:12:51 +00:00
![](<../.gitbook/assets/image (658) (1).png>)
2021-11-05 20:59:42 +00:00
2022-04-22 08:32:18 +00:00
![](<../.gitbook/assets/image (655) (1) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Кілька Вкладених Впроваджень
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Ще одна **цікава відмінність** від звичайного **підмішування HTTP-запитів** полягає в тому, що в звичайній атакі підмішування, **мета** полягає в **зміні початку запитів жертви**, щоб вони виконали неочікувану дію. У **атаках підмішування HTTP-відповідей**, оскільки ви **відправляєте повні запити**, ви можете **впроваджувати в одному пакеті десятки відповідей**, які будуть **десинхронізувати десятки користувачів**, які будуть **отримувати** **впроваджені** **відповіді**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Крім можливості **розподілити більш легко десятки експлойтів** серед законних користувачів, це також може бути використано для спричинення **DoS** на сервері.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Організація Експлойтів
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Як пояснено раніше, для зловживання цією технікою потрібно, щоб **перше підмішане повідомлення** на сервері **вимагало багато часу для обробки**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Цей **запит, який займає багато часу для обробки**, достатній, якщо ми просто хочемо **спробувати вкрасти відповідь жертви**. Але якщо ви хочете виконати більш складний експлойт, це буде загальною структурою для експлойту.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
По-перше **початковий** запит, який зловживає **підмішуванням HTTP-запитів**, потім **запит, який займає багато часу**, і потім **1 або більше запитів з вмістом**, відповіді на які будуть відправлені жертвам.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
## Зловживання десинхронізацією черги відповідей HTTP
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Захоплення запитів інших користувачів <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Як і з відомими пакетами для підмішування HTTP-запитів, ви можете **вкрасти запити жертви** з однією важливою відмінністю: у цьому випадку вам просто потрібно, щоб **відправлений вміст відображався в відповіді**, **не потрібно постійного зберігання**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Спочатку зловмисник відправляє пакет, що містить **останній POST-запит з відображеним параметром** в кінці та великим Content-Length
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (625).png>)
2024-03-29 18:49:46 +00:00
Потім, коли **початковий запит** (синій) був **оброблений**, і **поки** **сплячий** запит обробляється (жовтий), **наступний запит, який надходить від жертви**, буде **доданий в чергу відразу після відображеного параметра**:
2021-11-05 20:59:42 +00:00
2022-03-09 12:12:51 +00:00
![](<../.gitbook/assets/image (634) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Потім **жертва** отримає **відповідь на сплячий** запит, і якщо за цей час **зловмисник відправить інший запит**, **відповідь на запит з відображеним вмістом буде відправлена йому**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
## Десинхронізація відповідей
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
До цього моменту ми вивчили, як зловживати атаками підмішування HTTP-запитів, щоб **контролювати запит**, **відповідь на який клієнт отримає**, і як ви можете потім **вкрасти відповідь, яка була призначена для жертви**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Але все ще можливо **ще більше десинхронізувати відповіді**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Є цікаві запити, такі як **HEAD**, які вказують, що **в тілі відповіді не повинно бути жодного вмісту**, і вони повинні (мають) **містити Content-Length** запиту, як **у випадку GET-запиту**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Тому, якщо зловмисник **впроваджує** **HEAD**-запит, як на цих зображеннях:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (626).png>)
2024-03-29 18:49:46 +00:00
Тоді, **після того, як синій запит відповів зловмиснику**, наступний запит жертви буде введений в чергу:
2021-11-05 20:59:42 +00:00
2022-04-28 14:00:21 +00:00
![](<../.gitbook/assets/image (651) (1) (1) (1) (1) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Потім **жертва** отримає **відповідь** на **HEAD**-запит, яка **буде містити Content-Length, але жодного вмісту** взагалі. Тому проксі **не відправить цю відповідь** жертві, а **почекає на якийсь вміст**, який фактично буде **відповіддю на жовтий запит** (також введений зловмисником):
2021-11-05 20:59:42 +00:00
2021-12-24 01:52:37 +00:00
![](<../.gitbook/assets/image (627) (1).png>)
2024-04-06 19:41:21 +00:00
2024-03-29 18:49:46 +00:00
### Плутанина контенту
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Відомо, що ви можете **контролювати тіло** запиту, відповідь на який отримає жертва, і що **HEAD** **відповідь** зазвичай містить у своїх заголовках **Content-Type та Content-Length**, ви можете **надіслати запит, подібний до наступного**, щоб **спричинити XSS** у жертви без того, щоб сторінка була вразливою до XSS:
2021-11-05 20:59:42 +00:00
2024-04-06 19:41:21 +00:00
![](https://github.com/carlospolop/hacktricks/blob/ua/.gitbook/assets/image%20\(654\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\).png)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Отруєння кешу
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Зловживання раніше згаданою атакою плутанини контенту відповіді, **якщо кеш зберігає відповідь на запит, виконаний жертвою, і ця відповідь є впровадженою, що спричиняє XSS, то кеш отруєний**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Зловмисний запит, що містить навантаження XSS:
2021-11-05 20:59:42 +00:00
2022-03-09 12:12:51 +00:00
![](<../.gitbook/assets/image (644) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Зловмисна відповідь жертві, яка містить заголовок, що вказує кешу зберегти відповідь:
2021-11-05 20:59:42 +00:00
2022-02-02 15:35:20 +00:00
![](<../.gitbook/assets/image (629) (1).png>)
2021-11-05 20:59:42 +00:00
{% hint style="warning" %}
2024-03-29 18:49:46 +00:00
Зверніть увагу, що в цьому випадку, якщо **"жертва" є атакуючим**, він тепер може виконувати **отруєння кешу в довільних URL** так, як він може **контролювати URL, який буде збережений в кеші** за допомогою зловмисної відповіді.
2021-11-05 20:59:42 +00:00
{% endhint %}
2024-03-29 18:49:46 +00:00
### Обман веб-кешу
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Ця атака схожа на попередню, але **замість впровадження навантаження всередині кешу, атакуючий буде кешувати інформацію жертви всередині кешу:**
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (643) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
### Розділення відповіді
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
**Мета** цієї атаки полягає в зловживанні знову **розділенням відповіді** для того, щоб **проксі відправив відповідь, яка була 100% згенерована атакуючим**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Для досягнення цього атакуючому потрібно знайти кінцеву точку веб-застосунку, яка **відображає деякі значення всередині відповіді** та **знати довжину вмісту HEAD-відповіді**.
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Він надішле **експлойт** такий:
2021-11-05 20:59:42 +00:00
2022-04-25 12:04:04 +00:00
![](<../.gitbook/assets/image (649) (1) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Після того, як перший запит вирішено і відправлено атакуючому, **запит жертви додається в чергу**:
2021-11-05 20:59:42 +00:00
2022-04-05 22:13:36 +00:00
![](<../.gitbook/assets/image (661) (1) (1) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Жертва отримає відповідь у вигляді **HEAD-відповіді + вмісту відповіді другого запиту (що містить частину відображених даних):**
2021-11-05 20:59:42 +00:00
2022-02-19 19:42:58 +00:00
![](<../.gitbook/assets/image (633) (1).png>)
2021-11-05 20:59:42 +00:00
2024-03-29 18:49:46 +00:00
Проте, зверніть увагу, що **відображені дані мали розмір відповідно до Content-Length** **HEAD** відповіді, що **згенерувала дійсну HTTP-відповідь у черзі відповідей**.
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Отже, **наступний запит другої жертви** буде **отримувати** як **відповідь щось повністю створене атакуючим**. Оскільки відповідь повністю створена атакуючим, він також може **змусити проксі кешувати відповідь**.