Broken Access Control

Cross-site Request Forgery (CSRF)

Cross-site Request Forgery (CSRF) — to atak polegający na tym, że użytkownik zostanie nieświadomie zmuszony do wykonania nieautoryzowanego żądania w aplikacji, w której jest zalogowany. Przykładowo: kliknięcie spreparowanego linku może sprawić, że zostanie zmienione hasło lub wykonany przelew, bez wiedzy ofiary. Warunkiem powodzenia ataku jest aktywna sesja użytkownika w aplikacji docelowej. ...

Przykłady testów

  1. GET CSRF — automatyczne wykonanie działania przez ofiarę
    Zadanie: Wymusić wykonanie żądania GET przez zalogowanego użytkownika (admina).
    Szczegółowy opis: Umieszczenie kodu przekierowującego w polu formularza w celu wymuszenia wykonania żądania GET przez zalogowanego użytkownika.
    Target:
    [Target_IP1] - przygotowanie payloadu.
    [Target_IP2] - zasymulowanie kliknięcia odpowiedniego przycisku.

    KROKI:

    1: Wejdz na [TARGET_IP2] następnie wyświetl kod źródłowy aplikacji, klikając prawym przyciskiem myszy i wybierając „View Page Source”. Znajdź element, który chcesz odtworzyć.

    REZULTAT:

    Odnaleziono przycisk z parametrem ?solve, który zostanie użyty do przygotowania payloadu.
    SCREEN: task-CSRF1 - scr1
    Na [TARGET_IP2] przycisk zawiera atrybut onclick, który wywołuje przekierowanie do adresu z parametrem ?solve. Parametr ten symuluje kliknięcie przycisku przez administratora.


    2: Zasymulowanie akcji przycisku, używając skryptu w polu „Payload Delivery”:

    <script>location.href="/site1/?solve";</script>
    
    Zwróć uwagę, jak parametr z przycisku ?solve został dołączony na końcu łącza, aby emulować przycisk naciśnięty przez administratora.

    REZULTAT:

    Automatyczne wykonanie żądania GET w przeglądarce zalogowanego użytkownika doprowadziło do wykonania zdalnej akcji na serwerze.
    SCREEN: task-CSRF1 - scr2
    SCREEN: task-CSRF1 - scr3


  1. POST CSRF — automatyczne przesłanie formularza w imieniu ofiary
    Zadanie: Wymusić wykonanie żądania POST przez zalogowanego użytkownika (admina), bez jego wiedzy i interakcji.
    Szczegółowy opis: Utworzenie sfałszowanego formularza HTML, który zawiera ukryte pole solve i wykorzystuje metodę POST do przesłania danych do punktu końcowego /site2/ na [Target_IP2]. Formularz zostaje automatycznie przesłany poprzez osadzony skrypt JavaScript (submit()), bez potrzeby interakcji użytkownika. Po odwiedzeniu strony z payloadem przez zalogowanego administratora, żądanie zostaje natychmiast wysłane, co prowadzi do wykonania chronionej akcji.
    Target:
    [Target_IP1] - przygotowanie payloadu.
    [Target_IP2] - zasymulowanie kliknięcia odpowiedniego przycisku.

    KROKI:

    1: Wejdz na [TARGET_IP2] następnie wyświetl kod źródłowy aplikacji, klikając prawym przyciskiem myszy i wybierając „View Page Source”. Znajdź element, który chcesz powielić.

    REZULTAT:

    Odnaleziono formularz HTML z metodą POST i ukrytym polem solve, który nie posiada atrybutu action. Wysłanie formularza odbywa się po kliknięciu przycisku, który wywołuje funkcję submit() w JavaScript. Znając ten mechanizm, możliwe jest przygotowanie payloadu, który zasymuluje kliknięcie przycisku przez zalogowanego użytkownika. (Wymagana jest interakcja użytkownika (kliknięcie przycisku). Jednak wykorzystując payload będziemy w stanie symulować kliknięcie tego przycisku przez użytkownika).
    SCREEN: task-CSRF2 - scr1


    2: Dodajmy kod JavaScript, który sam przesyła formularz:

    <form method="post" action="/site2/" id="f">
    <input type="hidden" name="solve">
    </form>
    <script>document.getElementById('f').submit();</script>
    
    To formularz CSRF, który używa metody POST, aby udawać prawidłowe wysłanie danych. Ma na stałe ustawiony adres /site2/ i ukryte pole solve, które uruchamia akcję po stronie serwera — tak jakby użytkownik kliknął przycisk.

    REZULTAT:

    Skrypt został poprawnie wklejony do formularza na stronie [Target_IP1], zapisany przyciskiem Save!, a następnie wysłany do administratora za pomocą Deliver to admin!. Po otwarciu strony przez zalogowanego admina, przeglądarka automatycznie wykonała osadzony skrypt JavaScript, który przesłał formularz metodą POST do /site2/, doprowadzając do realizacji zdalnej akcji po stronie serwera.
    SCREEN: task-CSRF2 - scr2


  1. POST TOKEN — ominięcie zabezpieczenia CSRF poprzez przejęcie tokena z istniejącego formularza
    Zabezpieczenie: Strona zabezpieczona jest tokenem CSRF.
    Zadanie: Zbudować formularz CSRF, który automatycznie pobierze wartość tokena z istniejącego formularza i wykorzysta go do wykonania żądania POST jako zalogowany użytkownik.
    Szczegółowy opis: Zidentyfikowanie formularza na stronie ofiary, który zawiera ukryte pole token oraz solve, a następnie odtworzenie jego struktury w złośliwym payloadzie. Skrypt JavaScript automatycznie odczytuje wartość tokena z pierwszego formularza na stronie i przypisuje ją do drugiego — kontrolowanego przez atakującego — formularza, który następnie jest automatycznie przesyłany. Działanie to symuluje poprawne kliknięcie przycisku przez ofiarę, omijając zabezpieczenie CSRF.
    Target:
    [Target_IP1] - przygotowanie payloadu.
    [Target_IP2] - zasymulowanie kliknięcia odpowiedniego przycisku.

    SCENARIUSZ TESTOWY:

    KROK 1: Wejdz na [TARGET_IP2] następnie wyświetl kod źródłowy aplikacji, klikając prawym przyciskiem myszy i wybierając „View Page Source”. Zidentyfikuj formularz HTML lub przycisk na stronie ofiary, który wykonuje określoną akcję.
    REZULTAT: Zlokalizowano formularz POST z ukrytym polem solve, który jest wyzwalany kliknięciem przycisku. Ten element zostanie powielony w payloadzie CSRF, aby wykonać akcję automatycznie za użytkownika.
    SCREEN: task-CSRF3 - scr1


    KROK 2: Wejdz na [TARGET_IP1]. Skopiuj cały formularz HTML, a następnie wklej go do edytora tekstu:

    <form method="post" action="/site3/">
       <input type="hidden" name="solve">
       <input type="hidden" name="token” id="t">
    </form>
    <script>document.forms[1].t.value=document.forms[0].token.value;document.forms[1].submit()</script>
    
      • form method="post" id="f" — formularz wysyłany metodą POST, identyfikowany przez id="f".
      • input type="hidden" name="solve" — ukryty parametr, którego obecność pokazuje, że użytkownik chce rozwiązać zadanie.
      • input type="hidden" name="token" value="6836f2488cfa6" — token ochrony CSRF wymagany przez serwer.
      • button onclick="document.getElementById('f').submit()" — przycisk, który po kliknięciu powoduje przesłanie formularza.

      Skrypt JavaScript, który:

      • document.forms[1].t.value = document.forms[0].token.value; — kopiuje wartość tokena CSRF z oryginalnego formularza (forms[0]) do formularza ataku (forms[1]).
      • document.forms[1].submit(); — automatycznie przesyła formularz ataku, tak jakby zrobił to użytkownik.
    Formularz wykorzystuje dwa ukryte pola — solve oraz token. Formularz przesyłany jest za pomocą przycisku z funkcją submit() w JavaScript. Element ten zostanie wykorzystany do skonstruowania złośliwego payloadu CSRF.

    REZULTAT: Zlokalizowano formularz POST z ukrytym polem solve, który jest wyzwalany kliknięciem przycisku. Ten element zostanie powielony w payloadzie CSRF, aby wykonać akcję automatycznie za użytkownika.
    SCREEN: task-CSRF3 - scr2



References