Dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturmak ve **otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) kullanın.\
AWS Hacking'i öğrenin ve pratik yapın:<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* [**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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** bizi takip edin.**
Bu tekniği derinlemesine anlamak için orijinal raporu [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) adresinde kontrol edin.
Race condition'ları avantaja çevirmenin ana engeli, birden fazla isteğin **işleme sürelerinde çok az farkla—idealde, 1ms'den az**—aynı anda işlenmesini sağlamaktır.
* **HTTP/2**: Tek bir TCP bağlantısı üzerinden iki isteğin gönderilmesini destekler, ağ jitter etkisini azaltır. Ancak, sunucu tarafındaki varyasyonlar nedeniyle, iki istek tutarlı bir race condition istismarına yeterli olmayabilir.
* **HTTP/1.1 'Son-Bayt Senkronizasyonu'**: 20-30 isteğin çoğu kısmının önceden gönderilmesini sağlar, küçük bir parçayı saklayarak, bu parça daha sonra birlikte gönderilir ve sunucuya eşzamanlı varış sağlanır.
Saklanan çerçevelerin sonraki gönderimi, Wireshark ile doğrulanabilir şekilde tek bir pakette varış sağlamalıdır. Bu yöntem, genellikle RC saldırılarında yer almayan statik dosyalara uygulanmaz.
Hedefin mimarisini anlamak çok önemlidir. Ön uç sunucular, istekleri farklı yönlendirebilir ve zamanlamayı etkileyebilir. Önleyici sunucu tarafı bağlantıısıtma, önemsiz istekler aracılığıyla istek zamanlamasını normalleştirebilir.
PHP'nin oturum yöneticisi gibi çerçeveler, istekleri oturum bazında serileştirir ve potansiyel olarak zafiyetleri gizleyebilir. Her istek için farklı oturum jetonları kullanmak bu sorunu aşabilir.
Bağlantıısıtma etkili değilse, web sunucularının hız veya kaynak limit gecikmelerini kasıtlı olarak bir dizi sahte istekle tetiklemek, sunucu tarafında race condition'lara uygun bir gecikme oluşturarak tek paket saldırısını kolaylaştırabilir.
* **Tubo Intruder - HTTP2 tek-paket saldırısı (1 uç nokta)**: İsteği **Turbo intruder**'a (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`) gönderebilirsiniz, istekte **`%s`** için brute force yapmak istediğiniz değeri değiştirebilirsiniz, örneğin `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` ve ardından açılır menüden **`examples/race-single-packer-attack.py`**'yi seçin:
* **Tubo Intruder - HTTP2 tek paketli saldırı (Birçok uç nokta)**: Eğer 1 uç noktaya bir istek göndermeniz ve ardından RCE'yi tetiklemek için diğer uç noktalara birden fazla istek göndermeniz gerekiyorsa, `race-single-packet-attack.py` scriptini şu şekilde değiştirebilirsiniz:
* Ayrıca **Burp Suite**'teki yeni '**Grupları paralel gönder**' seçeneği aracılığıyla **Repeater**'da da mevcuttur.
* **Limit-aşımı** için gruba **aynı isteği 50 kez** ekleyebilirsiniz.
* **Bağlantıısınması** için grubun **başına** web sunucusunun bazı statik olmayan kısımlarına **istekler** ekleyebilirsiniz.
* **Bir isteği işleme** ile **diğerini** işleme **arasında** süreci **geciktirmek** için, her iki isteğin arasına **ekstra istekler** ekleyebilirsiniz.
* **Çoklu uç nokta** RC için, **gizli duruma** giden **isteği** göndermeye başlayabilir ve ardından **gizli durumu** istismar eden **50 isteği** hemen arkasından gönderebilirsiniz.
* **Otomatik python scripti**: Bu scriptin amacı, bir kullanıcının e-posta adresini değiştirirken sürekli olarak doğrulamak ve yeni e-posta adresinin doğrulama token'ı son e-posta adresine ulaşana kadar bunu yapmaktır (bu, kodda bir e-posta adresinin değiştirilip doğrulamanın eski adrese gönderilebildiği bir RC görüldüğü içindir çünkü e-posta adresini gösteren değişken zaten ilk e-posta ile doldurulmuştu).\
"objetivo" kelimesi alınan e-postalarda bulunduğunda, değiştirilmiş e-posta adresinin doğrulama token'ını aldığımızı biliyoruz ve saldırıyı sonlandırıyoruz.
Orijinal araştırmada bu saldırının 1,500 baytlık bir sınırı olduğu açıklanmıştır. Ancak, [**bu yazıda**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) tek paket saldırısının 1,500 baytlık sınırlamasını**IP katmanı parçalama** (tek bir paketi birden fazla IP paketine bölme) kullanarak **TCP'nin 65,535 B pencere sınırlamasına** nasıl genişletilebileceği açıklanmıştır ve bunların farklı bir sırayla gönderilmesi, tüm parçalar sunucuya ulaşana kadar paketin yeniden birleştirilmesini engellemiştir. Bu teknik, araştırmacının yaklaşık 166ms içinde 10,000 istek göndermesine olanak tanımıştır. 
Bu iyileştirmenin, aynı anda yüzlerce/binlerce paketin ulaşmasını gerektiren RC'de saldırıyı daha güvenilir hale getirdiğini unutmayın, ancak bazı yazılım sınırlamaları da olabilir. Apache, Nginx ve Go gibi bazı popüler HTTP sunucuları, `SETTINGS_MAX_CONCURRENT_STREAMS` ayarını sırasıyla 100, 128 ve 250 olarak belirlemiştir. Ancak, NodeJS ve nghttp2 gibi diğerleri sınırsızdır.\
Bu, temelde Apache'nin tek bir TCP bağlantısından yalnızca 100 HTTP bağlantısını dikkate alacağı anlamına gelir (bu RC saldırısını sınırlayarak).
Bu tekniği kullanan bazı örnekleri [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main) reposunda bulabilirsiniz.
* **Tekrar Edici:** Önceki bölümden örneklere bakın.
* **Saldırgan**: **İsteği****Saldırgana** gönderin, **Seçenekler menüsünde****iş parçacığı sayısını****30** olarak ayarlayın ve yük olarak **Null yükleri** seçin ve **30** oluşturun.
Bu, **hareketi gerçekleştirebileceğiniz zaman sayısını sınırlayan** yerlerde **görünmeye başlayan****zayıflıkların** bulunduğu en temel yarış durumu türüdür. Örneğin, bir web mağazasında aynı indirim kodunu birkaç kez kullanmak. Çok basit bir örnek [**bu raporda**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) veya [**bu hatada**](https://hackerone.com/reports/759247)** bulunabilir.**
Karmaşık yarış durumlarını istismar etmek genellikle gizli veya **istenmeyen makine alt durumlarıyla** etkileşimde bulunmak için kısa fırsatları değerlendirmeyi içerir. İşte buna yaklaşmanın yolu:
* **Eylem**: Mevcut verileri değiştiren işlemleri arayın; bunlar yeni veri ekleyenlere göre istismar edilebilir koşullar yaratma olasılığı daha yüksektir.
* Belirlenen uç noktaları yarış durumu saldırılarıyla test edin, beklenen sonuçlardan herhangi bir sapma olup olmadığını gözlemleyin. Beklenmedik yanıtlar veya uygulama davranışındaki değişiklikler bir zayıflığın sinyalini verebilir.
* Zayıflığı istismar etmek için gereken en az istek sayısını daraltın, genellikle sadece iki. Bu adım, hassas zamanlama gerektirdiğinden birden fazla deneme veya otomasyon gerektirebilir.
İsteklerin zamanlamasındaki hassasiyet, özellikle güvenlik belirteçleri için tahmin edilebilir yöntemler (örneğin, zaman damgaları) kullanıldığında zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama belirteçleri oluşturmak, eşzamanlı istekler için aynı belirteçlerin oluşmasına neden olabilir.
* Eşzamanlı şifre sıfırlama istekleri yapmak için tek bir paket saldırısı gibi hassas zamanlama kullanın. Aynı belirteçler bir zayıflığın göstergesidir.
Bunu görmek için [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) kontrol edin, nasıl **ödeme** yapacağınızı ve **ekstra** bir ürünü **ödemeden ekleyeceğinizi** öğrenin.
Amaç, **bir e-posta adresini doğrulamak ve aynı anda farklı birine değiştirmek**; böylece platformun yeni değiştirilen e-postayı doğrulayıp doğrulamadığını öğrenmektir.
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre, Gitlab bu şekilde bir ele geçirmeye karşı savunmasızdı çünkü **bir e-posta için e-posta doğrulama belirtecini diğer e-postaya gönderebilir**.
Eğer **2 farklı yazma** işlemi **veri eklemek** için kullanılıyorsa, veritabanına **yalnızca ilk verinin yazıldığı** küçük bir zaman dilimi vardır. Örneğin, bir kullanıcı oluştururken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **belirteç** yazılabilir. Bu, **bir hesabı onaylamak için belirtecin null olduğu** küçük bir zaman dilimi olduğu anlamına gelir.
Bu nedenle, **bir hesap kaydetmek ve hemen onaylamak için boş bir belirteçle** (`token=` veya `token[]=` veya başka bir varyasyon) birkaç istek göndermek, e-posta kontrolünüz olmayan bir hesabı**onaylamanıza** olanak tanıyabilir.
Aşağıdaki pseudo-kod, çok kısa bir süre içinde **2FA'nın uygulanmadığı** için yarış durumuna karşı savunmasızdır; bu süre zarfında oturum oluşturulmaktadır:
Birçok [**OAUth sağlayıcısı**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers) bulunmaktadır. Bu hizmetler, bir uygulama oluşturmanıza ve sağlayıcının kaydettiği kullanıcıları kimlik doğrulamanıza olanak tanır. Bunu yapmak için, **istemci****uygulamanıza****OAUth sağlayıcısı** içindeki bazı verilerine erişim izni vermelidir.\
Buraya kadar, sadece bir google/linkedin/github... ile giriş yapma durumu var; karşınıza "_Uygulama \<InsertCoolName> bilgilerinize erişmek istiyor, izin vermek ister misiniz?_" diyen bir sayfa çıkıyor.
**Sorun**, **izin verdiğinizde** ve otomatik olarak kötü niyetli uygulamaya bir **`authorization_code`** gönderdiğinizde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Durumunu kötüye kullanarak hesabınız için **`authorization_code`**'dan birden fazla AT/RT (_Authentication Token/Refresh Token_) üretir. Temelde, uygulamanın verilerinize erişim izni verdiğinizi kötüye kullanarak **birden fazla hesap oluşturur**. Sonrasında, eğer **uygulamanın verilerinize erişim iznini durdurursanız, bir çift AT/RT silinecek, ancak diğerleri geçerli kalacaktır**.
Bir **geçerli RT** elde ettiğinizde, **birden fazla AT/RT üretmek için bunu kötüye kullanmayı** deneyebilirsiniz ve **kullanıcı kötü niyetli uygulamanın verilerine erişim izinlerini iptal etse bile**, **birden fazla RT hala geçerli olacaktır.**
[**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) içinde, **Yarış Durumlarını Web Sockets'te de kötüye kullanmak için** websocket mesajlarını**paralel** olarak gönderen bir PoC bulabilirsiniz.
AWS Hacking'i öğrenin ve pratik yapın:<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="../.gitbook/assets/arte.png"alt=""data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="../.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* [**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)**.**
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=race-condition) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **iş akışlarını** kolayca oluşturun ve **otomatikleştirin**.\