# HTTP Response Smuggling / Desync
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!
Інші способи підтримки HackTricks:
* Якщо ви хочете побачити вашу **компанію рекламовану в 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)
* **Приєднуйтесь до** 💬 [**групи 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.
**Техніка цього посту була взята з відео:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
## Десинхронізація черги HTTP-запитів
По-перше, ця техніка **зловживає вразливістю HTTP-запиту на підмішування**, тому вам потрібно знати, що це таке:
**Основна** **відмінність** між цією технікою та звичайним підмішуванням HTTP-запитів полягає в тому, що **замість атаки запиту жертви, додавши до нього префікс**, ми збираємося **витікати або змінювати відповідь, яку отримує жертва**. Це робиться шляхом відправлення не 1 запиту та півтора для зловживання підмішуванням HTTP-запитів, а **відправлення 2 повних запитів для десинхронізації черги відповідей проксі**.
Це тому, що ми зможемо **десинхронізувати чергу відповідей**, так що **відповідь від законного запиту жертви буде відправлена зловмиснику**, або шляхом **впровадження контенту, керованого зловмисником, відповідь буде відправлена жертві**.
### Десинхронізація черги HTTP-каналів
HTTP/1.1 дозволяє запитувати **різні ресурси без очікування попередніх**. Тому, якщо є **проксі** посередині, це завдання проксі - **підтримувати синхронізоване відповідність відправлених запитів до сервера та отриманих від нього відповідей**.
Однак є проблема десинхронізації черг відповідей. Якщо зловмисник відправить атаку підмішування HTTP-відповідей і відповіді на **початковий запит та підмішаний запит будуть відповідати негайно**, підмішана відповідь не буде вставлена в чергу відповідей жертви, а **просто буде відкинута як помилка**.
![](<../.gitbook/assets/image (635) (1) (1) (1).png>)
Тому потрібно, щоб **підмішаний запит займав більше часу для обробки** на сервері. Таким чином, до моменту обробки підмішаного запиту спілкування з зловмисником буде завершено.
Якщо в цій конкретній ситуації **жертва відправила запит**, а **підмішаний запит відповідає раніше**, ніж законний запит, **підмішана відповідь буде відправлена жертві**. Таким чином, зловмисник буде **контролювати запит, "виконаний" жертвою**.
Більше того, якщо **зловмисник виконує запит**, а **легітимна відповідь на запит жертви відповідає раніше** **запиту зловмисника**, **відповідь жертві буде відправлена зловмиснику**, **викрадаючи** відповідь жертві (яка може містити, наприклад, заголовок **Set-Cookie**).
![](<../.gitbook/assets/image (658) (1).png>)
![](<../.gitbook/assets/image (655) (1) (1) (1).png>)
### Кілька Вкладених Впроваджень
Ще одна **цікава відмінність** від звичайного **підмішування HTTP-запитів** полягає в тому, що в звичайній атакі підмішування, **мета** полягає в **зміні початку запитів жертви**, щоб вони виконали неочікувану дію. У **атаках підмішування HTTP-відповідей**, оскільки ви **відправляєте повні запити**, ви можете **впроваджувати в одному пакеті десятки відповідей**, які будуть **десинхронізувати десятки користувачів**, які будуть **отримувати** **впроваджені** **відповіді**.
Крім можливості **розподілити більш легко десятки експлойтів** серед законних користувачів, це також може бути використано для спричинення **DoS** на сервері.
### Організація Експлойтів
Як пояснено раніше, для зловживання цією технікою потрібно, щоб **перше підмішане повідомлення** на сервері **вимагало багато часу для обробки**.
Цей **запит, який займає багато часу для обробки**, достатній, якщо ми просто хочемо **спробувати вкрасти відповідь жертви**. Але якщо ви хочете виконати більш складний експлойт, це буде загальною структурою для експлойту.
По-перше **початковий** запит, який зловживає **підмішуванням HTTP-запитів**, потім **запит, який займає багато часу**, і потім **1 або більше запитів з вмістом**, відповіді на які будуть відправлені жертвам.
## Зловживання десинхронізацією черги відповідей HTTP
### Захоплення запитів інших користувачів
Як і з відомими пакетами для підмішування HTTP-запитів, ви можете **вкрасти запити жертви** з однією важливою відмінністю: у цьому випадку вам просто потрібно, щоб **відправлений вміст відображався в відповіді**, **не потрібно постійного зберігання**.
Спочатку зловмисник відправляє пакет, що містить **останній POST-запит з відображеним параметром** в кінці та великим Content-Length
![](<../.gitbook/assets/image (625).png>)
Потім, коли **початковий запит** (синій) був **оброблений**, і **поки** **сплячий** запит обробляється (жовтий), **наступний запит, який надходить від жертви**, буде **доданий в чергу відразу після відображеного параметра**:
![](<../.gitbook/assets/image (634) (1).png>)
Потім **жертва** отримає **відповідь на сплячий** запит, і якщо за цей час **зловмисник відправить інший запит**, **відповідь на запит з відображеним вмістом буде відправлена йому**.
## Десинхронізація відповідей
До цього моменту ми вивчили, як зловживати атаками підмішування HTTP-запитів, щоб **контролювати запит**, **відповідь на який клієнт отримає**, і як ви можете потім **вкрасти відповідь, яка була призначена для жертви**.
Але все ще можливо **ще більше десинхронізувати відповіді**.
Є цікаві запити, такі як **HEAD**, які вказують, що **в тілі відповіді не повинно бути жодного вмісту**, і вони повинні (мають) **містити Content-Length** запиту, як **у випадку GET-запиту**.
Тому, якщо зловмисник **впроваджує** **HEAD**-запит, як на цих зображеннях:
![](<../.gitbook/assets/image (626).png>)
Тоді, **після того, як синій запит відповів зловмиснику**, наступний запит жертви буде введений в чергу:
![](<../.gitbook/assets/image (651) (1) (1) (1) (1) (1) (1).png>)
Потім **жертва** отримає **відповідь** на **HEAD**-запит, яка **буде містити Content-Length, але жодного вмісту** взагалі. Тому проксі **не відправить цю відповідь** жертві, а **почекає на якийсь вміст**, який фактично буде **відповіддю на жовтий запит** (також введений зловмисником):
![](<../.gitbook/assets/image (627) (1).png>)
### Плутанина контенту
Відомо, що ви можете **контролювати тіло** запиту, відповідь на який отримає жертва, і що **HEAD** **відповідь** зазвичай містить у своїх заголовках **Content-Type та Content-Length**, ви можете **надіслати запит, подібний до наступного**, щоб **спричинити XSS** у жертви без того, щоб сторінка була вразливою до XSS:
![](https://github.com/carlospolop/hacktricks/blob/ua/.gitbook/assets/image%20\(654\)%20\(1\)%20\(1\)%20\(1\)%20\(1\)%20\(1\).png)
### Отруєння кешу
Зловживання раніше згаданою атакою плутанини контенту відповіді, **якщо кеш зберігає відповідь на запит, виконаний жертвою, і ця відповідь є впровадженою, що спричиняє XSS, то кеш отруєний**.
Зловмисний запит, що містить навантаження XSS:
![](<../.gitbook/assets/image (644) (1).png>)
Зловмисна відповідь жертві, яка містить заголовок, що вказує кешу зберегти відповідь:
![](<../.gitbook/assets/image (629) (1).png>)
{% hint style="warning" %}
Зверніть увагу, що в цьому випадку, якщо **"жертва" є атакуючим**, він тепер може виконувати **отруєння кешу в довільних URL** так, як він може **контролювати URL, який буде збережений в кеші** за допомогою зловмисної відповіді.
{% endhint %}
### Обман веб-кешу
Ця атака схожа на попередню, але **замість впровадження навантаження всередині кешу, атакуючий буде кешувати інформацію жертви всередині кешу:**
![](<../.gitbook/assets/image (643) (1) (1).png>)
### Розділення відповіді
**Мета** цієї атаки полягає в зловживанні знову **розділенням відповіді** для того, щоб **проксі відправив відповідь, яка була 100% згенерована атакуючим**.
Для досягнення цього атакуючому потрібно знайти кінцеву точку веб-застосунку, яка **відображає деякі значення всередині відповіді** та **знати довжину вмісту HEAD-відповіді**.
Він надішле **експлойт** такий:
![](<../.gitbook/assets/image (649) (1) (1) (1).png>)
Після того, як перший запит вирішено і відправлено атакуючому, **запит жертви додається в чергу**:
![](<../.gitbook/assets/image (661) (1) (1) (1).png>)
Жертва отримає відповідь у вигляді **HEAD-відповіді + вмісту відповіді другого запиту (що містить частину відображених даних):**
![](<../.gitbook/assets/image (633) (1).png>)
Проте, зверніть увагу, що **відображені дані мали розмір відповідно до Content-Length** **HEAD** відповіді, що **згенерувала дійсну HTTP-відповідь у черзі відповідей**.
Отже, **наступний запит другої жертви** буде **отримувати** як **відповідь щось повністю створене атакуючим**. Оскільки відповідь повністю створена атакуючим, він також може **змусити проксі кешувати відповідь**.