Race Condition
Last updated
Last updated
Yarış şərti, tətbiqin işləməsi kodun hissələrinin yerinə yetirilmə ardıcıllığından asılı olan çox yivli proqramın memarlıq zəifliyidir.
Əksər hallarda yarış vəziyyətini yoxlamaq və ya istismar etmək üçün müştəri kimi çox yivli proqram istifadə olunur, məsələn. Burp Suite Intruder, yəni bir http sorğusu birdən çox mövzuya daxil olur.
Bu, əgər server öz resursunda birdən çox mövzudan istifadə etməyə icazə verirsə, bu, kifayət qədər işləyən bir yoldur. Ancaq fakt budur ki, bəzi hallarda bu, təsirli olmaya bilər.
Server tərəfində hər bir ip TCP bağlantısı qurur, məlumat göndərir, cavab gözləyir, əlaqəni bağlayır, yenidən açır, məlumat göndərir və s. İlk baxışdan bütün məlumatlar eyni vaxtda göndərilir. Lakin HTTP sorğuları paketlərin şəbəkə üzərindən çatdırılmasında gecikmələr, təhlükəsiz əlaqə yaratmaq ehtiyacı, DNS həlli və məlumatların şəbəkə cihazına göndərilmədən əvvəl keçdiyi bir çox abstraksiya təbəqələri kimi bir çox amillərə görə asinxron şəkildə gələ bilər.
RFC 7230 6.3.2 spesifikasiyası HTTP məzmununun yüklənmə vaxtını əhəmiyyətli dərəcədə azalda bilən HTTP Boru Təchizat texnikasını müəyyən edir. Yükləmə vaxtı müvafiq cavabları gözləmədən bir TCP bağlantısı üzərindən çoxsaylı HTTP sorğuları göndərməklə azaldılır.
Bu texnika sorğular arasındakı vaxtı minimuma endirmək üçün istifadə edilə bilər.
HTTP Pipelining-in əsas məqamı veb serverin sorğuları ardıcıl olaraq qəbul etməsi və cavabları eyni ardıcıllıqla emal etməsidir. Bu özəllikdən minimum vaxt ərzində ardıcıl olaraq iki hərəkəti yerinə yetirmək və ya hücumun müvəffəqiyyətini artırmaq üçün ilk sorğuda serveri yavaşlatmaq lazım olduqda bir neçə addımda hücum etmək üçün istifadə oluna bilər.
RFC 7230 2.1 sorğu xətti (metod, URI və protokol versiyası) ilə başlayan sorğu mesajının ümumi görünüşünü, ardınca başlıq sahələri, başlıq bölməsinin sonunu göstərmək üçün boş sətir və nəhayət, aşağıdakıları ehtiva edən mesaj gövdəsini müəyyən edir. faydalı yük orqanı (əgər varsa). Mesajın mətni Bölmə 3.3-də müəyyən edilmişdir.
Mesaj gövdəsinin sonu Transfer-Encoding və ya Content-Length başlıqlarına əsasən aşkar edilir. Bu başlıqların istifadəsi ilə bağlı ətraflı məlumat üçün HTTP Sorğu Qaçaqmalçılığı üçün fırıldaqçı vərəqinə baxın.
Komanda xəttindən aşağıdakı sorğunu göndərsəniz:
sonra HTTP sorğusu tamamlanacağı üçün cavab alacaqsınız. Amma sonuncu simvolu silsəniz bu baş verməyəcək, bu halda server son simvolu gözləyəcək.
Beləliklə, siz eyni vaxtda serverə bir çox əlaqə aça, HTTP sorğunuzun 99%-ni göndərə və məlumatların əsas hissəsinin göndərildiyi aydın olan kimi son baytı və ya bir neçə baytı göndərə bilərsiniz.\
Bu, böyük bir POST sorğusuna gəldikdə, məsələn, bir fayl yükləmək lazım olduqda xüsusilə vacibdir. Bununla belə, bu, hətta kiçik sorğularla da məna kəsb edir, çünki bir neçə baytın çatdırılması eyni vaxtda kilobayt məlumat göndərməkdən daha sürətlidir.
Sessiyanın özü yarış vəziyyətinin istismarının qarşısını ala bilər. Məsələn, PHP-də session_start() funksiyasından sonra sessiya faylı kilidlənir və onun kilidini açmaq yalnız skriptin sonunda baş verir (əgər session_write_close çağırışı olmadıqda). Bu anda sessiyadan istifadə edən başqa bir skript çağırılırsa, o, gözləyəcək.
Bu imkandan qaçmaq üçün sadə bir hiylədən istifadə edə bilərsiniz: lazım olan qədər autentifikasiya etmək. Əgər veb tətbiqi sizə bir istifadəçi üçün çoxlu seans yaratmağa imkan verirsə, sadəcə olaraq bütün PHPSESSID-ləri toplayın və hər sorğunu öz ID-si ilə təyin edin.
Hücum etmək istədiyiniz sayt AWS-də yerləşdirilibsə, AWS-də host icarəyə götürün. Server DigitalOcean-dadırsa, onu orada icarəyə götürün. Əsas vəzifə göndərilən sorğular arasındakı intervalı minimuma endirmək olduqda, veb serverə dərhal yaxınlıq bir artı olacaq. Bu vəziyyətdə serverə hansı ping-in 200 və ya 10 ms olması həqiqətən vacibdir. Üstəlik, şanslısınızsa, hətta eyni fiziki serverə də gedə bilərsiniz, onda istismar bir az asan olacaq.