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

159 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTTP Yanıt Kaçırma / Desenkronizasyon
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks'i Destekleyin</summary>
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter**'da **bizi takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
</details>
{% endhint %}
**Bu gönderinin tekniği videodan alınmıştır:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
## HTTP İstek Kuyruğu Desenkronizasyonu
Öncelikle, bu teknik **bir HTTP İstek Kaçırma açığını istismar eder**, bu yüzden bunun ne olduğunu bilmelisiniz:
Bu tekniğin **ana** **farkı**, yaygın bir HTTP İstek kaçırmadan, **kurbanın isteğine bir ön ek ekleyerek saldırmak yerine**, **kurbanın aldığı yanıtı sızdırmak veya değiştirmek** için kullanmamızdır. Bu, HTTP İstek kaçırmayı istismar etmek için 1,5 istek göndermek yerine, **proxy yanıt kuyruklarını desenkronize etmek için 2 tam istek göndermemizle** yapılır.
Bunun nedeni, **yanıt kuyruğunu desenkronize edebilmemizdir**, böylece **kurbanın meşru isteğinden gelen yanıtın saldırgana gönderilmesi** veya **kurbanın yanıtına saldırganın kontrolündeki içeriğin enjekte edilmesi**dir.
### HTTP Pipeline Desenkronizasyonu
HTTP/1.1, **önceki isteklere beklemeden farklı kaynaklar istemeye** olanak tanır. Bu nedenle, eğer bir **proxy** varsa, proxy'nin görevi, **arka uca gönderilen isteklerin ve ondan gelen yanıtların senkronize bir eşleşmesini korumaktır**.
Ancak, yanıt kuyruklarını desenkronize etme konusunda bir sorun vardır. Eğer bir saldırgan bir HTTP Yanıt kaçırma saldırısı gönderirse ve **ilk isteğe ve kaçırılan isteğe yanıtlar hemen verilirse**, kaçırılan yanıt, kurban yanıtının kuyruğuna eklenmeyecek, **bir hata olarak atılacaktır**.
![](<../.gitbook/assets/image (633).png>)
Bu nedenle, **kaçırılan isteğin** arka uç sunucusunda işlenmesi için daha fazla zamana ihtiyacı vardır. Böylece, kaçırılan istek işlenene kadar, saldırganla iletişim sona erecektir.
Eğer bu özel durumda bir **kurban bir istek göndermişse** ve **kaçırılan istek meşru isteğinden önce yanıtlanırsa**, **kaçırılan yanıt kurbana gönderilecektir**. Böylece, saldırgan **kurban tarafından "gerçekleştirilen" isteği kontrol edecektir**.
Ayrıca, eğer **saldırgan bir istek gerçekleştirirse** ve **kurbanın isteğine verilen meşru yanıt**, saldırganın isteğinden **önce yanıtlanırsa**, **kurbanın yanıtı saldırgana gönderilecektir**, **kurbanın yanıtını çalarak** (örneğin, **Set-Cookie** başlığını içerebilir).
![](<../.gitbook/assets/image (1020).png>)
![](<../.gitbook/assets/image (719).png>)
### Çoklu İç İçe Enjeksiyonlar
Yaygın **HTTP İstek Kaçırma** ile bir diğer **ilginç fark**, yaygın bir kaçırma saldırısında **hedefin kurbanın isteğinin başlangıcını değiştirmek** olmasıdır, böylece beklenmedik bir eylem gerçekleştirilir. **HTTP Yanıt kaçırma saldırısında**, tam istekler gönderdiğiniz için, **bir yük içinde onlarca yanıt enjekte edebilir** ve bu da **onlarca kullanıcının** **enjekte edilen yanıtları almasına neden olacaktır**.
Ayrıca, **meşru kullanıcılar arasında daha kolay onca istismar dağıtma** imkanı sağlamanın yanı sıra, bu aynı zamanda sunucuda bir **DoS** oluşturmak için de kullanılabilir.
### İstismar Organizasyonu
Daha önce açıklandığı gibi, bu tekniği istismar etmek için, **sunucuya gönderilen ilk kaçırılan mesajın** **işlenmesi için çok zaman alması** gerekmektedir.
Bu **zaman alan istek**, sadece **kurbanın yanıtını çalmaya çalışmak** istiyorsak yeterlidir. Ancak daha karmaşık bir istismar gerçekleştirmek istiyorsanız, bu istismar için yaygın bir yapı olacaktır.
Öncelikle **HTTP İstek Kaçırma** istismarını kullanarak **ilk** isteği, ardından **zaman alan isteği** ve sonra **kurbanlara gönderilecek 1 veya daha fazla yük isteği**.
## HTTP Yanıt Kuyruğu Desenkronizasyonunu İstismar Etme
### Diğer kullanıcıların isteklerini yakalama <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
HTTP İstek Kaçırma ile bilinen yükler gibi, **kurbanın isteğini çalabilirsiniz** ama bir önemli farkla: Bu durumda, **yanıtın içinde yansıtılan içeriği göndermeniz yeterlidir**, **kalıcı depolama** gerekmez.
Öncelikle, saldırgan, **yansıtılan parametre ile son bir POST isteği içeren** bir yük gönderir ve büyük bir Content-Length ayarlar.
![](<../.gitbook/assets/image (1053).png>)
Ardından, **ilk istek** (mavi) **işlendiğinde** ve **uyku halindeki** istek işlenirken (sarı), **bir kurbandan gelen bir sonraki istek**, **yansıtılan parametrenin hemen ardından kuyruğa eklenecektir**:
![](<../.gitbook/assets/image (794).png>)
Sonrasında, **kurban**, **uyku halindeki** isteğin yanıtını **alacak** ve eğer bu arada **saldırgan** **başka bir istek gönderirse**, **yansıtılan içerik isteğinden gelen yanıt ona gönderilecektir**.
## Yanıt Desenkronizasyonu
Bu noktaya kadar, HTTP İstek Kaçırma saldırılarını nasıl istismar edeceğimizi öğrendik, böylece **bir istemcinin alacağı yanıtı kontrol edebiliriz** ve ardından **kurban için tasarlanmış yanıtı çalabiliriz**.
Ancak, yanıtları **daha da desenkronize etmek** mümkündür.
**Yanıt gövdesinde** **hiçbir içerik olmaması gereken** ve **GET isteğiymiş gibi** **Content-Length** içermesi gereken **HEAD** istekleri gibi ilginç istekler vardır.
Bu nedenle, eğer bir saldırgan **HEAD** isteği enjekte ederse, bu görüntülerdeki gibi:
![](<../.gitbook/assets/image (1107).png>)
O zaman, **mavi yanıt saldırgana verildiğinde**, bir sonraki kurban isteği kuyruğa eklenecektir:
![](<../.gitbook/assets/image (999).png>)
Sonrasında, **kurban**, **HEAD** isteğinden gelen **yanıtı alacak**, bu yanıt **bir Content-Length içerecek ama hiç içerik olmayacaktır**. Bu nedenle, proxy **bu yanıtı kurbana göndermeyecek**, ancak bazı **içerikler** bekleyecektir, bu da aslında **saldırgan tarafından enjekte edilen sarı isteğin yanıtı olacaktır**:
![](<../.gitbook/assets/image (735).png>)
### İçerik Karışıklığı
Önceki örneği takip ederek, **kurbanın alacağı yanıtın gövdesini kontrol edebildiğinizi** ve **HEAD** **yanıtının genellikle başlıklarında **Content-Type ve Content-Length** içerdiğini bilerek, **kurbanın XSS** oluşturmasına neden olacak aşağıdaki gibi bir istek gönderebilirsiniz:
![](<../.gitbook/assets/image (688).png>)
### Önbellek Zehirleme
Daha önce bahsedilen yanıt desenkronizasyonu İçerik Karışıklığı saldırısını istismar ederek, **eğer önbellek, kurban tarafından gerçekleştirilen isteğe verilen yanıtı depoluyorsa ve bu yanıt, bir XSS oluşturan enjekte edilmiş bir yanıt ise, o zaman önbellek zehirlenmiştir**.
XSS yükünü içeren kötü niyetli istek:
![](<../.gitbook/assets/image (614).png>)
Kurbana, yanıtı önbelleğe alması için başlık içeren kötü niyetli yanıt:
![](<../.gitbook/assets/image (566).png>)
{% hint style="warning" %}
Bu durumda, eğer **"kurban" saldırgansa**, artık **keyfi URL'lerde önbellek zehirlemesi** gerçekleştirebilir, çünkü **kötü niyetli yanıtla önbelleğe alınacak URL'yi kontrol edebilir**.
{% endhint %}
### Web Önbellek Aldatmacası
Bu saldırı, öncekiyle benzer, ancak **yükü önbelleğe enjekte etmek yerine, saldırgan kurban bilgilerini önbelleğe alacaktır**:
![](<../.gitbook/assets/image (991).png>)
### Yanıt Bölme
Bu saldırının **hedefi**, **yanıt** **desenkronizasyonunu** tekrar istismar ederek **proxy'nin %100 saldırgan tarafından üretilen bir yanıt göndermesini sağlamak**tır.
Bunu başarmak için, saldırgan, **yanıt içinde bazı değerleri yansıtan** bir web uygulaması uç noktası bulmalı ve **HEAD yanıtının içerik uzunluğunu bilmelidir**.
Bir **istismar** gönderecektir:
![](<../.gitbook/assets/image (911).png>)
İlk istek çözüldükten ve saldırgana geri gönderildikten sonra, **kurbanın isteği kuyruğa eklenir**:
![](<../.gitbook/assets/image (737).png>)
Kurban, yanıt olarak **HEAD yanıtı + ikinci isteğin yanıtının içeriğini (yansıtılan verilerin bir kısmını içeren)** alacaktır:
![](<../.gitbook/assets/image (356).png>)
Ancak, **yansıtılan verilerin, yanıt kuyruğunda geçerli bir HTTP yanıtı üreten HEAD yanıtının Content-Length'ine göre bir boyuta sahip olduğunu** unutmayın.
Bu nedenle, **ikinci kurbanın bir sonraki isteği**, **saldırgan tarafından tamamen oluşturulmuş bir yanıt alacaktır**. Yanıt tamamen saldırgan tarafından oluşturulduğundan, **proxy'nin yanıtı önbelleğe almasını da sağlayabilir**.
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks'i Destekleyin</summary>
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter**'da **bizi takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
</details>
{% endhint %}