# XS-Search/XS-Leaks {{#include ../banners/hacktricks-training.md}} ## Basic Information XS-Search ni mbinu inayotumika kwa **kuchota taarifa za cross-origin** kwa kutumia **udhaifu wa njia za pembeni**. Vipengele muhimu vinavyohusika katika shambulio hili ni pamoja na: - **Web Inayoweza Kuathirika**: Tovuti lengwa ambayo taarifa inakusudiwa kuchukuliwa. - **Web ya Mshambuliaji**: Tovuti mbaya iliyoundwa na mshambuliaji, ambayo mwathirika anatembelea, ikihifadhi exploit. - **Mbinu ya Kujumuisha**: Mbinu inayotumika kuingiza Web Inayoweza Kuathirika katika Web ya Mshambuliaji (mfano, window.open, iframe, fetch, tag ya HTML yenye href, n.k.). - **Mbinu ya Leak**: Mbinu zinazotumika kubaini tofauti katika hali ya Web Inayoweza Kuathirika kulingana na taarifa zilizokusanywa kupitia mbinu ya kujumuisha. - **Hali**: Masharti mawili yanayoweza kutokea ya Web Inayoweza Kuathirika, ambayo mshambuliaji anajaribu kutofautisha. - **Tofauti Zinazoweza Kugundulika**: Mabadiliko yanayoonekana ambayo mshambuliaji anategemea ili kubaini hali ya Web Inayoweza Kuathirika. ### Detectable Differences Mambo kadhaa yanaweza kuchambuliwa ili kutofautisha hali za Web Inayoweza Kuathirika: - **Status Code**: Kutofautisha kati ya **mifumo mbalimbali ya majibu ya HTTP** cross-origin, kama vile makosa ya seva, makosa ya mteja, au makosa ya uthibitisho. - **API Usage**: Kutambua **matumizi ya Web APIs** kati ya kurasa, ikifunua ikiwa ukurasa wa cross-origin unatumia API maalum ya JavaScript Web. - **Redirects**: Kugundua mwelekeo kwenda kurasa tofauti, si tu HTTP redirects bali pia zile zinazochochewa na JavaScript au HTML. - **Page Content**: Kuangalia **mabadiliko katika mwili wa majibu ya HTTP** au katika rasilimali ndogo za ukurasa, kama vile **idadi ya fremu zilizojumuishwa** au tofauti za ukubwa katika picha. - **HTTP Header**: Kurekodi uwepo au labda thamani ya **header maalum ya majibu ya HTTP**, ikiwa ni pamoja na headers kama X-Frame-Options, Content-Disposition, na Cross-Origin-Resource-Policy. - **Timing**: Kutambua tofauti za muda kati ya hali hizo mbili. ### Inclusion Methods - **HTML Elements**: HTML inatoa vipengele mbalimbali kwa **kujumuisha rasilimali za cross-origin**, kama vile stylesheets, picha, au scripts, ikilazimisha kivinjari kuomba rasilimali isiyo ya HTML. Mkusanyiko wa vipengele vya HTML vinavyoweza kutumika kwa kusudi hili unaweza kupatikana kwenye [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). - **Frames**: Vipengele kama **iframe**, **object**, na **embed** vinaweza kuingiza rasilimali za HTML moja kwa moja kwenye ukurasa wa mshambuliaji. Ikiwa ukurasa **hauna ulinzi wa fremu**, JavaScript inaweza kufikia kituo cha fremu kupitia mali ya contentWindow. - **Pop-ups**: Mbinu ya **`window.open`** inafungua rasilimali katika tab au dirisha jipya, ikitoa **handle ya dirisha** kwa JavaScript kuingiliana na mbinu na mali zinazofuata SOP. Pop-ups, ambazo mara nyingi hutumiwa katika uthibitisho wa moja, hupita vizuizi vya fremu na vidakuzi vya rasilimali lengwa. Hata hivyo, vivinjari vya kisasa vinakandamiza uundaji wa pop-up kwa vitendo fulani vya mtumiaji. - **JavaScript Requests**: JavaScript inaruhusu maombi ya moja kwa moja kwa rasilimali lengwa kwa kutumia **XMLHttpRequests** au **Fetch API**. Mbinu hizi zinatoa udhibiti sahihi juu ya ombi, kama vile kuchagua kufuata HTTP redirects. ### Leak Techniques - **Event Handler**: Mbinu ya kawaida ya leak katika XS-Leaks, ambapo waendeshaji wa matukio kama **onload** na **onerror** hutoa taarifa kuhusu mafanikio au kushindwa kwa upakiaji wa rasilimali. - **Error Messages**: Makaribisho ya JavaScript au kurasa maalum za makosa zinaweza kutoa taarifa za leak moja kwa moja kutoka kwa ujumbe wa makosa au kwa kutofautisha kati ya uwepo na ukosefu wake. - **Global Limits**: Mipaka ya kimwili ya kivinjari, kama vile uwezo wa kumbukumbu au mipaka mingine iliyowekwa, inaweza kuashiria wakati kigezo kinapofikiwa, ikihudumu kama mbinu ya leak. - **Global State**: Maingiliano yanayoweza kugundulika na **hali za kimataifa** za vivinjari (mfano, kiolesura cha Historia) yanaweza kutumika. Kwa mfano, **idadi ya entries** katika historia ya kivinjari inaweza kutoa vidokezo kuhusu kurasa za cross-origin. - **Performance API**: API hii inatoa **maelezo ya utendaji wa ukurasa wa sasa**, ikiwa ni pamoja na wakati wa mtandao kwa hati na rasilimali zilizopakiwa, ikiruhusu maelezo kuhusu rasilimali zilizohitajika. - **Readable Attributes**: Baadhi ya mali za HTML ni **zinazosomeka cross-origin** na zinaweza kutumika kama mbinu ya leak. Kwa mfano, mali ya `window.frame.length` inaruhusu JavaScript kuhesabu fremu zilizojumuishwa katika ukurasa wa wavuti cross-origin. ## XSinator Tool & Paper XSinator ni zana ya kiotomatiki ya **kuangalia vivinjari dhidi ya XS-Leaks kadhaa zinazojulikana** zilizoelezwa katika karatasi yake: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Unaweza **kupata zana hiyo katika** [**https://xsinator.com/**](https://xsinator.com/) > [!WARNING] > **XS-Leaks Zilizotengwa**: Ilibidi tutenge XS-Leaks zinazotegemea **wafanyakazi wa huduma** kwani zingeingiliana na leaks nyingine katika XSinator. Zaidi ya hayo, tulichagua **kutenga XS-Leaks zinazotegemea makosa ya usanidi na makosa katika programu maalum ya wavuti**. Kwa mfano, makosa ya usanidi ya CrossOrigin Resource Sharing (CORS), uvujaji wa postMessage au Cross-Site Scripting. Aidha, tulitenga XS-Leaks za muda kwa sababu mara nyingi huwa na matatizo ya kuwa polepole, kelele na zisizo sahihi. ## **Timing Based techniques** Baadhi ya mbinu zifuatazo zitatumia muda kama sehemu ya mchakato wa kugundua tofauti katika hali zinazowezekana za kurasa za wavuti. Kuna njia tofauti za kupima muda katika kivinjari cha wavuti. **Clocks**: API ya [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) inaruhusu wabunifu kupata vipimo vya muda vya hali ya juu.\ Kuna idadi kubwa ya APIs ambazo mshambuliaji anaweza kuzitumia kuunda saa zisizo za moja kwa moja: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animations za CSS, na nyingine.\ Kwa maelezo zaidi: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## Event Handler Techniques ### Onload/Onerror - **Inclusion Methods**: Frames, HTML Elements - **Detectable Difference**: Status Code - **More info**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Summary**: ikiwa unajaribu kupakia rasilimali, matukio ya onerror/onload yanachochewa wakati rasilimali imepakiwa kwa mafanikio/kushindwa, inawezekana kubaini status code. - **Code example**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} xs-search/cookie-bomb-+-onerror-xs-leak.md {{#endref}} Mfano wa msimbo unajaribu **kupakia vitu vya scripts kutoka JS**, lakini **vitambulisho vingine** kama vile vitu, stylesheets, picha, sauti vinaweza pia kutumika. Aidha, inawezekana pia kuingiza **tag moja kwa moja** na kutangaza matukio ya `onload` na `onerror` ndani ya tag (badala ya kuingiza kutoka JS). Pia kuna toleo lisilo na script la shambulio hili: ```html ``` Katika kesi hii ikiwa `example.com/404` haipatikani `attacker.com/?error` itapakuliwa. ### Onload Timing - **Inclusion Methods**: HTML Elements - **Detectable Difference**: Timing (kwa ujumla kutokana na Maudhui ya Ukurasa, Kiwango cha Hali) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Summary:** The [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** inaweza kutumika kupima ni muda gani inachukua kufanya ombi. Hata hivyo, saa nyingine zinaweza kutumika, kama [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) ambayo inaweza kubaini kazi zinazofanyika kwa zaidi ya 50ms. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) mfano mwingine katika: {{#ref}} xs-search/performance.now-example.md {{#endref}} #### Onload Timing + Forced Heavy Task Teknolojia hii ni kama ile ya awali, lakini **attacker** pia at **lazimisha** hatua fulani kuchukua **muda muhimu** wakati **jibu ni chanya au hasi** na kupima muda huo. {{#ref}} xs-search/performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (kwa ujumla kutokana na Maudhui ya Ukurasa, Kiwango cha Hali) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Summary:** The [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) inaweza kutumika kupima ni muda gani inachukua kufanya ombi. Saa nyingine zinaweza kutumika. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) Muda unaochukuliwa kupata rasilimali unaweza kupimwa kwa kutumia matukio ya [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) na [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Tukio la **`beforeunload`** linatokea wakati kivinjari kinakaribia kuhamia kwenye ukurasa mpya, wakati tukio la **`unload`** linatokea wakati mchakato wa kuhamia unafanyika. Tofauti ya muda kati ya matukio haya mawili inaweza kuhesabiwa ili kubaini **muda ambao kivinjari kilitumia kupata rasilimali**. ### Sandboxed Frame Timing + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (kwa ujumla kutokana na Maudhui ya Ukurasa, Kiwango cha Hali) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Summary:** The [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API inaweza kutumika kupima ni muda gani inachukua kufanya ombi. Saa nyingine zinaweza kutumika. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) Imethibitishwa kuwa katika ukosefu wa [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/), muda unaohitajika kwa ukurasa na rasilimali zake ndogo kupakuliwa kupitia mtandao unaweza kupimwa na mshambuliaji. Kipimo hiki kwa kawaida kinawezekana kwa sababu handler ya `onload` ya iframe inasababisha tu baada ya kukamilika kwa upakuaji wa rasilimali na utekelezaji wa JavaScript. Ili kupita tofauti inayosababishwa na utekelezaji wa script, mshambuliaji anaweza kutumia sifa ya [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) ndani ya ` ``` ### #ID + error + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary**: Ikiwa unaweza kufanya ukurasa uwe na kosa wakati maudhui sahihi yanapofikiwa na kufanya upakue vizuri wakati maudhui yoyote yanapofikiwa, basi unaweza kufanya mzunguko kutoa taarifa zote bila kupima muda. - **Code Example**: Kufikiria kwamba unaweza **kuingiza** **ukurasa** ambao una maudhui ya **siri** **ndani ya Iframe**. Unaweza **kufanya mwathirika atafute** faili ambayo ina "_**bendera**_" kwa kutumia **Iframe** (ukitumia CSRF kwa mfano). Ndani ya Iframe unajua kwamba _**tukio la onload**_ litakuwa **linatekelezwa kila wakati angalau mara moja**. Kisha, unaweza **kubadilisha** **URL** ya **iframe** lakini kubadilisha tu **maudhui** ya **hash** ndani ya URL. Kwa mfano: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 Ikiwa URL ya kwanza ilipakuliwa **kwa mafanikio**, basi, wakati **ukibadilisha** sehemu ya **hash** ya URL tukio la **onload** **halitazinduliwa** tena. Lakini **ikiwa** ukurasa ulikuwa na aina fulani ya **kosa** wakati wa **upakuaji**, basi, tukio la **onload** litazinduliwa **tena**. Kisha, unaweza **kutofautisha kati ya** ukurasa ulio **pakuliwa vizuri** au ukurasa ambao una **kosa** unapofikiwa. ### Javascript Execution - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary:** Ikiwa **ukurasa** unarudisha maudhui ya **siri**, **au** maudhui ambayo yanaweza **kudhibitiwa** na mtumiaji. Mtumiaji anaweza kuweka **msimbo sahihi wa JS katika kesi hasi**, na **kupakia** kila jaribio ndani ya **`