# 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: - **Mtandao wa Udhaifu**: Tovuti lengwa ambayo taarifa inakusudiwa kuchotwa. - **Mtandao wa Mshambuliaji**: Tovuti mbaya iliyoundwa na mshambuliaji, ambayo mwathirika anatembelea, ikihifadhi exploit. - **Mbinu ya Kujumuisha**: Mbinu inayotumika kuingiza Mtandao wa Udhaifu katika Mtandao wa Mshambuliaji (mfano, window.open, iframe, fetch, tag ya HTML yenye href, n.k.). - **Mbinu ya Leak**: Mbinu zinazotumika kubaini tofauti katika hali ya Mtandao wa Udhaifu kulingana na taarifa zilizokusanywa kupitia mbinu ya kujumuisha. - **Hali**: Masharti mawili yanayoweza kutokea ya Mtandao wa Udhaifu, ambayo mshambuliaji anajaribu kutofautisha. - **Tofauti Zinazoweza Kugundulika**: Mabadiliko yanayoweza kuonekana ambayo mshambuliaji anategemea ili kubaini hali ya Mtandao wa Udhaifu. ### Detectable Differences Mambo kadhaa yanaweza kuchambuliwa ili kutofautisha hali za Mtandao wa Udhaifu: - **Nambari ya Hali**: Kutofautisha kati ya **nambari mbalimbali za majibu ya HTTP** cross-origin, kama vile makosa ya seva, makosa ya mteja, au makosa ya uthibitisho. - **Matumizi ya API**: Kutambua **matumizi ya Web APIs** kati ya kurasa, ikifunua ikiwa ukurasa wa cross-origin unatumia API maalum ya JavaScript. - **Mwelekeo**: Kugundua mwelekeo kwenda kurasa tofauti, si tu mwelekeo wa HTTP bali pia wale wanaosababishwa na JavaScript au HTML. - **Maudhui ya Ukurasa**: 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. - **Header ya HTTP**: 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. - **Muda**: Kutambua tofauti za muda zinazofanana 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 rasilimali kilichowekwa 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. - **Maombi ya JavaScript**: 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 mwelekeo wa HTTP. ### 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. - **Ujumbe wa Makosa**: Makaratasi ya JavaScript au kurasa maalum za makosa zinaweza kutoa taarifa za leak moja kwa moja kutoka kwa ujumbe wa kosa au kwa kutofautisha kati ya uwepo na ukosefu wake. - **Mipaka ya Ulimwengu**: Mipaka ya kimwili ya kivinjari, kama vile uwezo wa kumbukumbu au mipaka mingine iliyowekwa, inaweza kuashiria wakati kigezo kinapofikiwa, ikitumikia kama mbinu ya leak. - **Hali ya Ulimwengu**: Maingiliano yanayoweza kugundulika na **hali za ulimwengu** 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 muda wa mtandao kwa hati na rasilimali zilizopakiwa, ikiruhusu maelezo kuhusu rasilimali zilizohitajika. - **Mali Zinazoweza Kusomwa**: Baadhi ya mali za HTML ni **zinazoweza kusomwa 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 chombo cha kiotomatiki cha **kuangalia vivinjari dhidi ya XS-Leaks kadhaa zinazojulikana** zilizoelezwa katika karatasi yake: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Unaweza **kupata chombo hicho 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 nambari ya hali. - **Code example**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} 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 ``` In this case if `example.com/404` is not found `attacker.com/?error` will be loaded. ### Onload Timing - **Inclusion Methods**: HTML Elements - **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **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** can be used to measure how much time it takes to perform a request. However, other clocks could be used, such as [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) which can identify tasks running for more than 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) another example in: {{#ref}} performance.now-example.md {{#endref}} #### Onload Timing + Forced Heavy Task Teknolojia hii ni kama ile ya awali, lakini **mshambuliaji** pia atachochea hatua fulani kuchukua **muda muhimu** wakati **jibu ni chanya au hasi** na kupima muda huo. {{#ref}} performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **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) can be used to measure how much time it takes to perform a request. Other clocks could be used. - **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 [`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) matukio. 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 (generally due to Page Content, Status Code) - **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 can be used to measure how much time it takes to perform a request. Other clocks could be used. - **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 kupakia kupitia mtandao unaweza kupimwa na mshambuliaji. Kipimo hiki kwa kawaida kinawezekana kwa sababu `onload` handler ya iframe inasababisha tu baada ya kukamilika kwa upakiaji 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 **kubadilisha** 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 nyeti**, **au** maudhui ambayo yanaweza **kudhibitiwa** na mtumiaji. Mtumiaji anaweza kuweka **msimbo wa JS halali katika kesi hasi**, na **kuhifadhi** kila jaribio ndani ya **`