100864523

Page 1


SZCZEGÓ Ł OWY SPIS TRE Ś

CI

PRZEDMOWA

PODZIĘKOWANIA

WSTĘP

Dla kogo jest ta książka?

Jak czytać tę książkę?

Co znajdziesz w tej książce?

Zastrzeżenie dotyczące hakowania

1

PODSTAWY BUG BOUNTY

Podatności i Bug Bounty.

Klient i serwer

Co się dzieje, kiedy odwiedzasz stronę

Krok 1: Identyfikacja domeny internetowej

Krok 2: Ustalanie adresu IP

Krok 3: Nawiązanie połączenia TCP

Krok 4: Wysyłanie zapytania HTTP

Krok 5: Odpowiedź serwera

Krok 6: Renderowanie odpowiedzi

żądań

ł HTTP jest bezstanowy

Jak działają otwarte przekierowania?

Otwarte przekierowanie przy instalacji motywu Shopify

Otwarte przekierowanie przy logowaniu do Shopify

xix

xxi

xxii

xxiii

xxiii

2

3

3

3

HPP po stronie serwera

HPP po stronie klienta

Przyciski do udostępniania na HackerOne

Wnioski

Anulowanie subskrypcji powiadomień na Twitterze

Wnioski

Web Intents Twittera

Wnioski

Podsumowanie

CROSS-SITE

Uwierzytelnianie.

CSRF przez żądanie GET

CSRF przez żądanie POST

Ochrona przed atakami CSRF

Odłączenie Twittera z Shopify.

Zmiana stref użytkowników Instacart.

Przejęcie konta Badoo

CROSS-SITE SCRIPTING

Rodzaje podatności XSS

Hurtownia Shopify

Wnioski

Formatowanie walut w Shopify

Wnioski

Stored XSS w mailu

Wnioski

Wyszukiwarka zdjęć Google

Stored XSS w menedżerze tagów Google

Wnioski

United Airlines XSS

Wnioski

Podsumowanie

8 TEMPLATE INJECTION

Template injection po stronie serwera

Template injection po stronie klienta.

Template injection w Uberze przez AngularJS

Wnioski

Template Injection w Uberze przez Flask i Jinja2

Dynamiczne renderowanie w Rails

Template injection w Smarty

Wnioski

Podsumowanie

Bazy danych

Przeciwdziałanie SQLi

Blind SQLi w Yahoo! Sports

Wnioski

Uber Blind SQLi

SQLi w Drupal

Podsumowanie

Demonstracja zagrożeń podatności SSRF

Wywoływanie żądań GET vs. POST

Wykonywanie “ślepych” SSRF-ów

Atakowanie użytkowników przy użyciu odpowiedzi SSRF

SSRF w ESEA oraz wysyłanie zapytań o metadane AWS .

Wnioski

SSRF wewnętrznego DNS Google

Wnioski

Wewnętrzne skanowanie portów przy użyciu webhooków

Wnioski

Podsumowanie

11 XML EXTERNAL ENTITY

eXtensible Markup Language

Document Type Definition

Zewnętrzny DTD

Wewnętrzny DTD

Encje XML

Jak działają ataki XXE

Dostęp do odczytu w Google

Wnioski

XXE w Facebooku

Wnioski

XXE w Wikiloc

Wnioski

Podsumowanie

ZDALNE WYKONANIE KODU

Wykonywanie poleceń shell

Wykonywanie funkcji

Strategie na eskalację zdalnego wykonania kodu

RCE w bibliotece ImageMagick

Wnioski

Algolia RCE na facebooksearch.algolia.com

Wnioski

RCE przez SSH

Wnioski

Podsumowanie

Przepełnienie bufora

Odczyt poza granicami bufora.

Przepełnienie typu całkowitego w PHP ftp_genlist()

Wnioski

Moduł hotshot w Pythonie

Wnioski

Odczyt poza granicami bufora w Libcurl

Wnioski

Podsumowanie

14

PRZEJĘCIE SUBDOMENY

Jak działają nazwy domen?

Jak działa przejęcie subdomeny?

Przejęcie subdomeny Ubiquiti

Wnioski

Przypisanie Scan.me do Zendesk

Wnioski

Przejęcie subdomeny Shopify Windsor

Wnioski

Przejęcie Snapchata przez Fastly.

Wnioski

Przejęcie Legal Robot

Wnioski

Przejęcie Uber SendGrid

Wnioski

Podsumowanie

15

RACE CONDITION

Kilkukrotne zaakceptowanie zaproszenia do HackerOne

Wnioski

Przekroczenie limitu zaproszeń do Keybase.

Wnioski

Race condition w płatnościach HackerOne

Wnioski

Race condition w Shopify Partners

Wnioski

Podsumowanie

INSECURE

Szukanie prostych IDOR-ów

Szukanie bardziej złożonych IDOR-ów

Eskalacja uprawnień w Binary.com

Wnioski

Tworzenie aplikacji w Moneybird

Wnioski

Kradzież tokena API w Twitter Mopub

Wnioski

Ujawnianie informacji o klientach ACME

Wnioski

Podsumowanie

PODATNOŚCI OAUTH

Przepływ pracy OAuth

Kradzież tokenów OAuth w Slack

Wnioski

Logowanie z domyślnym hasłem

Wnioski

Kradzież tokenów logowania Microsoft

Wnioski

Przechwytywanie tokenów dostępu Facebooka

Wnioski

Podsumowanie

Omijanie uprawnień administratora w Shopify

Wnioski

Omijanie zabezpieczeń konta na Twitterze

Wnioski

Manipulacja wartością Signal w HackerOne

Wnioski

Niepoprawne uprawnienia bucket-u S3 w HackerOne

Wnioski

Omijanie dwuetapowej weryfikacji GitLab

Wnioski

Ujawnienie informacji o kodzie PHP Yahoo!

Wnioski

Głosowanie w Hacktivity

Wnioski

Dostęp do instalacji pamięci podręcznej PornHub

Wnioski

Podsumowanie

Rekonesans

Enumeracja subdomen

Skanowanie portów

Wykonywanie zrzutów ekranu

Odkrywanie zawartości

Historia błędów

Testowanie aplikacji

Zbiór technologii

Mapowanie funkcjonalności

Znajdowanie podatności

Idąc dalej

Automatyzacja swojej pracy

Sprawdzanie aplikacji mobilnych

Identyfikacja nowej funkcjonalności

Śledzenie plików JavaScript

Poznawanie technologii .

Podsumowanie

20

ZGŁASZANIE PODATNOŚCI

Sprawdź zasady programu bug bounty

Dodaj szczegóły; następnie dodaj ich więcej

Sprawdź podatność dwa razy

Twoja reputacja

Szacunek do drugiej strony

Atrakcyjne nagrody

Podsumowanie

Serwery proxy

Enumeracja subdomen

Rekonesans

Zrzuty ekranu

Skanowanie portów

Rozpoznanie aplikacji

Narzędzia do hakowania

Analiza aplikacji mobilnych

Wtyczki do przeglądarki

B

ŹRÓDŁA

Kursy online

Platformy Bug Bounty

Rekomendowane zasoby

Filmy

Rekomendowane blogi

SKOROWIDZ

WST Ę P

Ta książka wprowadzi Cię do obszernego

świata hackingu etycznego lub inaczej procesu odpowiedzialnego odkrywania podatności bezpieczeństwa i zgłaszania ich do właścicieli aplikacji. Kiedy sam zaczyna ł em naukę hakowania, nie tylko chciałem wiedzieć, jakie podatności hakerzy znajdują, ale również, jak to robią.

Szukałem wszędzie informacji, lecz zawsze pozostawałem z tymi samymi pytaniami:

• Jakie podatności hakerzy znajdują w aplikacjach?

• Jak hakerzy uczyli się o tych podatnościach?

• Jak hakerzy zaczynają infiltrację strony?

• Jak wygląda samo hakowanie? Wszystko jest zautomatyzowane, czy może robione ręcznie?

• Jak mogę zacząć hakować i znajdować podatności?

W końcu znalazłem się na HackerOne, platformie bug bounty stworzonej do łączenia hakerów etycznych z firmami, które szukają osób do przetestowania ich aplikacji. HackerOne pozwala hakerom i firmom upubliczniać błędy, które zostały znalezione i naprawione. Czytając te ujawnione zgłoszenia, starałem się zrozumieć, w jaki sposób ludzie znajdują podatności oraz jak je wykorzystują. Często musiałem przeczytać to samo zgłoszenie dwa lub trzy razy, zanim je zrozumiałem. Tak samo jak pozostali początkujący, zdałem sobie sprawę z tego, że mógłbym wynieść o wiele więcej z objaśnień znalezionych podatności, gdyby były napisane prostym językiem.

Na tropie błędów. Przewodnik hakerski jest na to autorską odpowiedzią, która pomoże Ci zrozumieć wiele rodzajów podatności w aplikacjach internetowych. Nauczysz się szukać podatności, zgłaszać je, zarabiać na tym oraz, przy okazji, pisać bezpieczny kod. Książka ta nie omawia jedynie pomyślnych przykładów: znajdziesz w niej również błędy i wyciągnięte wnioski, z których wiele należy do mnie.

Do czasu, gdy skończysz czytanie, postawisz swój pierwszy krok w kierunku zwiększania bezpieczeństwa oraz powinieneś być w stanie zarabiać na tym pieniądze.

Dla kogo jest ta książka?

Ta książka została napisana z myślą o początkujących hakerach. Nie ma znaczenia, czy tworzysz strony internetowe, czy projektujesz je, czy jesteś rodzicem przebywającym w domu, 10-letnim dzieckiem, czy 75-letnim emerytem.

Powiedziawszy to, choć nie jest to warunek konieczny do hakowania, pewne doświadczenie w programowaniu i znajomość z technologiami internetowymi mogą okazać się pomocne. Na przykład nie musisz być programistą internetowym, aby być hakerem, jednak znajomość podstawowego hipertekstowego języka znaczników (HTML), struktury strony internetowej, wyglądu kaskadowych arkuszy stylów (CSS) oraz tego, w jaki sposób JavaScript dynamicznie wchodzi w interakcję z witrynami, pomogą Ci odkrywać podatności i oceniać znaczenie znalezionych błędów.

Umiejętność programowania moż e pomóc, gdy szukasz podatnoś ci dotyczących logiki aplikacji oraz przy domysłach, gdzie programista mógł popełnić błędy. Jeśli potrafisz patrzeć z punktu widzenia programistów, zgadywać, w jaki sposób coś zostało zaimplementowane, bądź czytać ich kod (o ile jest dostępny), będziesz miał większą szansę na powodzenie.

Jeśli chcesz nauczyć się programowania, polecam Ci sprawdzić darmowe kursy na platformach Udacity oraz Coursera. Dodatkowe materiały znajdziesz w załączniku B.

Jak czytać tę książkę?

Każdy rozdział, który omawia określony rodzaj podatności, zbudowany jest w następujący sposób:

1. Opis rodzaju podatności.

2. Przykłady podatności.

3. Podsumowanie wraz z wnioskami.

Każdy przykład podatności zawiera następujące części:

1. Moją ocenę trudności w szukaniu i udowadnianiu tej podatności.

2. Adres URL powiązany z miejscem, w którym dana podatność została znaleziona.

3. Link do oryginalnego zgłoszenia bądź artykułu.

4. Data zgłoszenia podatności.

5. Kwota otrzymana za przesłanie informacji.

6. Przejrzysty opis podatności.

7. Wnioski, które warto zapamiętać

Nie ma potrzeby czytania tej książki od deski do deski. Jeśli znajdziesz konkretny rozdział, którym jesteś zainteresowany, przeczytaj go najpierw. W niektórych przypadkach odnoszę się do pojęć omawianych w poprzednich rozdziałach, jednak robiąc to, staram się odnotować miejsce, w którym zdefiniowałem ten termin, dzięki czemu łatwiej Ci będzie znaleźć odpowiednią sekcję. Podczas hakowania trzymaj tę książkę otwartą

Co znajdziesz w tej książce?

Oto przegląd tego, co znajdziesz w każdym z rozdziałów:

Rozdział 1: Podstawy Bug Bounty wyjaśnia, czym są podatności oraz programy bug bounty, oraz tłumaczy różnice między klientem a serwerem. Omawia również, w jaki sposób działa internet, a w tym żądania HTTP, odpowiedzi i metody, oraz co to znaczy, że HTTP jest bezstanowy.

Rozdział 2: Otwarte przekierowanie omawia ataki, które wykorzystują zaufanie użytkowników do określonej domeny w celu przekierowywania ich do innej.

Rozdział 3: HTTP Parameter Pollution omawia sposób, w jaki hakerzy manipulują żądaniami HTTP, wstrzykując dodatkowe parametry, którym dana witryna ufa, prowadząc w ten sposób do nieoczekiwanych rezultatów.

Rozdział 4: Cross-Site Request Forgery wyjaśnia sposób, w jaki atakujący może wykorzystać złośliwą stronę, aby przeglądarka ofiary wykonała żądanie HTTP do innej strony. Strona, która otrzymuje żądanie, postępuje tak, jakby żądanie zostało wysłane umyślnie przez ofiarę.

Rozdział 5: HTML Injection i fałszowanie treści tłumaczy, w jaki sposób złośliwy użytkownik może wstrzykiwać własne elementy HTML na docelowe strony internetowe.

Rozdział 6: Carriage Return Line Feed Injection pokazuje, jak atakujący wstrzykują zakodowane znaki do wiadomości HTTP, aby zmienić to, w jaki sposób interpretują je serwery, proxy i przeglądarki.

Rozdział 7: Cross-Site Scripting wyjaśnia, w jaki sposób atakują cy wykorzystują strony, które nie filtrują danych wejściowych użytkownika, w celu wykonywania na nich własnego kodu JavaScript.

Rozdział 8: Template Injection pokazuje, jak atakujący wykorzystują template engine’y w przypadku, gdy strona nie filtruje odpowiednio wejścia użytkownika i używa ich w swoich szablonach. Rozdział pokrywa zarówno przypadki po stronie klienta, jak i serwera.

Rozdział 9: SQL Injection opisuje, jak podatność po stronie aplikacji (serwera) może pozwolić atakującemu na zaatakowanie bazy danych.

Rozdział 10: Server-Side Request Forgery wyjaśnia, w jaki sposób atakujący sprawiają, że serwer wykonuje niezamierzone żądania.

Rozdział 11: XML External Entity pokazuje, jak atakujący wykorzystują sposób, w jaki aplikacja parsuje dane wejściowe XML i przetwarza w nich zewnętrzne encje.

Rozdział 12: Zdalne wykonanie kodu dotyczy wykorzystywania serwera bądź aplikacji do uruchomienia na nich własnego kodu.

Rozdzia ł 13: Podatno ś ci w manualnej obs ł udze pami ę ci omawia sposoby, w jakie hakerzy wykorzystują zarządzanie pamięcią aplikacji do powodowania niezamierzonych działań, włączając w to możliwość wykonywania własnych poleceń.

Rozdział 14: Przejęcie subdomeny pokazuje, w jaki sposób atakujący może przejąć kontrolę nad subdomeną w imieniu uprawnionej domeny.

Rozdział 15: Race Condition wyjaśnia, jak atakujący wykorzystują sytuacje, w których zmiana warunku początkowego danego procesu ma wpływ na jego końcowy wynik.

Rozdzia ł 16: Insecure Direct Object Reference omawia wszelkie podatności pojawiające się, gdy atakujący ma dostęp do odniesienia do obiektu, do którego nie powinien mieć dostępu, na przykład pliku, rekordu w bazie danych bądź konta.

Rozdział 17: Podatności OAuth pokazuje błędy w implementacji protokołu stworzonego do uproszczenia i ustandaryzowania bezpiecznego uwierzytelniania w aplikacjach internetowych, mobilnych i desktopowych.

Rozdział 18: Podatności w logice i konfiguracji aplikacji wyjaśnia, w jaki sposób atakujący mogą wykorzystać wadliwą logikę w kodzie lub błąd w konfiguracji do wykonania niezamierzonych działań.

Rozdział 19: Poszukiwanie podatności na własną  rękę dostarcza wskazówki, gdzie i jak szukać podatności, bazując na moich doświadczeniach i metodologii. Ten rozdział nie jest jednak poradnikiem krok po kroku do włamywania się na stronę.

Rozdział 20: Zgłaszanie podatności omawia, w jaki sposób pisać wiarygodne i informacyjne zgłoszenia podatności, dzięki czemu programy nie odrzucą twoich raportów.

Załącznik A: Narzędzia omawia popularne narzędzia stworzone do hakowania, włączając w to przechwytywanie ruchu sieciowego, enumerację subdomen, wykonywanie zrzutów ekranu i wiele więcej.

Załącznik B: Źródła stanowi listę dodatkowych materiałów do dalszego rozwoju w dziedzinie hackingu. Znajdziesz tu między innymi ćwiczenia online, popularne platformy bug bounty i polecane blogi.

Zastrzeżenie dotyczące hakowania

Patrząc na upublicznione zgłoszenia podatności, a dokładniej na kwoty pieniędzy, które hakerzy za nie otrzymują, naturalnie może się wydawać, że hacking to łatwa i szybka droga do wzbogacenia się. Tak jednak nie jest.

Poszukiwanie błędów potrafi być satysfakcjonujące, jednak mało prawdopodobne jest, że napotkasz wiele historii o porażkach, które zdarzają się po drodze (z wyjątkiem tej książki, gdzie dzielę się kilkoma naprawę kompromitującymi opowieściami). Ponieważ będziesz głównie słyszał o sukcesach hakerów, możesz rozwinąć nierealistyczne oczekiwania wobec swojej hakerskiej przygody.

Sukces może przyjść do Ciebie bardzo szybko. Jednak jeśli masz problemy ze znajdowaniem błędów, nie przestawaj się zagłębiać. Programiści zawsze będą pisać nowy kod, a błędy stanowią nieuniknioną część tego procesu. Im bardziej się starasz, tym więcej błędów będziesz znajdował. W tej sprawie możesz śmiało do mnie napisać na Twitterze @yaworsk i dać znać, jak sobie radzisz. Nawet jeśli nie odnosisz sukcesów, chciałbym to od Ciebie usłyszeć. Bug hunting potrafi być samotną pracą, szczególnie jeśli sprawia Ci trudności. Jednak wspaniale jest też wspólnie świętować, a może nawet znajdziesz coś, co będę mógł zamieścić w następnym wydaniu tej książki.

Powodzenia i szczęśliwego hakowania.

Wappalyzer b d BuiltWith, lub przegl daj c ród o strony i szukaj c atrybutów ng-. Jak ju wspomnia em, starsze wersje AngularJS implementowa y Sandboxa, lecz wersja, której u ywa Uber, by a podatna na ucieczk . W tym przypadku zatem podatno CSTI oznacza a mo liwo wykonania XSS. U ywaj c poni szego JavaScriptu w adresie URL, Kettle dokona ucieczki z Sandboxa AngularJS i uruchomi funkcj alert:

https://developer.uber.com/docs/deep-linking?q=wrtz{{(_="".sub).call. call({}[$="constructor"].getOwnPropertyDescriptor(_.__proto__,$). value,0,"alert ")()}}zzzz

Dekonstrukcja tego payloadu wychodzi poza zakres tej ksi ki, bior c pod uwag publikacje licznych obej Sandboxa AngularJS oraz usuni cia ich w wersji 1.6. W ka dym b d razie ko cowym rezultatem payloadu alert jest okno pop-up. Ten dowód pokaza Uberowi, e atakuj cy móg wykorzysta t podatno CSTI do wykonania XSS-a, co mog o skutkowa zagro eniem kont deweloperów i powi zanych aplikacji.

Wnioski

Po ustaleniu, czy witryna korzysta z template engine’a po stronie klienta, rozpocznij testy od przes ania prostych adunków, korzystaj c ze standardowej sk adni dla danego engine’a, takiej jak {{7*7}} dla AngularJS, i sprawdzania renderowanych rezultatów. Je li adunek zosta wykonany, sprawd wersj AngularJS, której strona u ywa, wpisuj c Angular.version w przegldarkowej konsoli dla deweloperów. Je li wersja jest wy sza ni 1.6, mo esz przes a payload z wy ej wymienionych róde bez omijania Sandboxa. Je li jest ni sza ni 1.6, b dziesz musia znale obej cie dostosowane do wersji AngularJS, której aplikacja u ywa.

Template Injection w Uberze przez Flask i Jinja2

Poziom trudno ci: redni

URL: https://riders.uber.com/

ród o: https://hackerone.com/reports/125980/

Data zg oszenia: 25 marca 2016

Nagroda: 10 000 $

Podczas hakowania wa na jest identy kacja technologii u ywanej przez dan rm . Kiedy Uber uruchomi swój publiczny program bug bounty na portalu HackerOne, do czy do niego „map skarbów” pod adresem https://eng.uber.com/bug-bounty/ (ulepszona wersja mapy zosta a opublikowana w sierpniu 2017 roku na stronie https://medium.com/uber-security-privacy/

uber-bug-bounty-treasure-map-17192af85c1a/). Mapa zidenty kowa a szereg wra liwych funkcjonalno ci obs ugiwanych przez Ubera, do czaj c do tego oprogramowanie, którego u ywa a ka da z nich.

Na tej mapie Uber ujawni , e witryna riders.uber.com zosta a zbudowana przy u yciu Node.js Express i Backbone.js, z których adne nie wyró nia si jako potencjalne zagro enie atakiem SSTI. Jednak strony vault.uber.com i partners.uber.com zosta y napisane przy u yciu Flask oraz Jinja2. Jinja2 to template engine, który w przypadku niepoprawnej kon guracji pozwala na zdalne wykonanie kodu. Mimo e witryna riders.uber.com nie u ywa a Jinja2, je li dostarcza a dane wej ciowe do subdomeny valut b d partners, a te strony ufa y wej ciu, które otrzymuj , atakuj cy móg by w stanie wykona atak SSTI.

Orange Tsai, haker, który odkry t podatno , w celu rozpocz cia testów na podatno SSTI wpisa {{1+1}} jako swoj nazw . Szuka jakiejkolwiek interakcji, która odbywa a si mi dzy subdomenami.

W swoim artykule Orange wyja nia, e jakakolwiek zmiana w pro lu na riders.uber.com skutkowa a wiadomo ci e-mail z powiadomieniem dla w a ciciela pro lu o zmianach (jest to cz sta praktyka bezpiecze stwa). Zmieniaj c swoj nazw na {{1+1}}, otrzyma wiadomo z 2 w swojej nazwie, tak jak pokazuje to rysunek 8.1.

Rysunek 8.1. E-mail, który otrzyma Orange, wykonywa kod wstrzykni ty do nazwy pro lu

Widz c to zachowanie, hakerowi od razu za wieci a si czerwona lampka, poniewa Uber obliczy jego wyra enie i umie ci wynik jako nazw prolu. Orange nast pnie próbowa przes a kod w Pythonie {% for c in [1,2,3]%} {{c,c,c}} {% endfor %} w celu sprawdzenia dzia ania odkrytej podatno ci na bardziej z o onych operacjach. Ten kod iteruje przez tablic [1,2,3] i wypisuje ka dy numer trzy razy. E-mail na rysunku 8.2 pokazuje nazw Orange’a wy wietlan w postaci dziewi ciu cyfr, które s rezultatem wykonania p tli for, potwierdzaj c tym samym jego odkrycie. Jinja2 równie implementuje Sandboxa, co ogranicza mo liwo wykonywania dostarczonego kodu, lecz w niektórych sytuacjach mo na go omin . W tym przypadku Orange by w stanie to zrobi od razu.

SERVER-SIDE REQUES T FORGERY

Podatność typu Server-Side Request Forgery (SSRF) pozwala atakującemu na manipulację żądaniami serwera. Podobnie jak podatno ść cross-site request forgery (CSRF), SSRF nadu ż ywa innego systemu, aby wykona ć niezamierzone akcje. Podczas gdy CSRF wykorzystuje innego u ż ytkownika, SSRF wykorzystuje serwer docelowej aplikacji. Tak samo jak CSRF, podatności SSRF mogą by ć ró ż ne w skutkach i sposobach wykonania. Sam jednak fakt, że możesz wysyłać żądania z docelowego serwera do innych serwerów, nie oznacza, ż e aplikacja jest podatna. Aplikacje mogą umyślnie zezwalać na takie zachowanie. Z tego powodu ważne jest, aby zademonstrować możliwości wykorzystania, które otwiera znaleziony SSRF.

Demonstracja zagrożeń podatności SSRF

W zależności od tego, w jaki sposób witryna jest zorganizowana, serwer podatny na SSRF może wykonywać żądania HTTP do wewnętrznej sieci albo na zewnętrzny adres. Zdolność podatnego serwera do wykonywania żądań decyduje o tym, co można zrobić ze znalezionym SSRF-em.

Niektóre wi ę ksze strony internetowe maj ą zapory, które blokuj ą zewnętrzny ruch przed dostępem do wewnętrznych serwerów: na przykład witryna ma ograniczoną liczbę publicznych serwerów, które przyjmują żądania HTTP od odwiedzających. Następnie wysyłają otrzymane żądania na pozostałe serwery, które są już poza dostępem publicznym. Częstym przykładem jest serwer z bazą danych, będący zazwyczaj niedostępny dla internetu. Kiedy logujesz się na stronę, która komunikuje się z serwerem bazy danych, przesyłasz nazwę użytkownika i hasło przez standardowy formularz internetowy. Następnie witryna, która otrzyma Twoje żądanie, wykonuje swoje własne żądanie do serwera z bazą danych przy użyciu podanych przez Ciebie danych. Potem serwer z bazą danych wyśle odpowiedź do serwera aplikacji, a ten przekaże informacje do Ciebie. Podczas tego procesu często nie zdajesz sobie sprawy z tego, że zewnętrzny serwer bazy danych w ogóle istnieje. Podatne serwery, które pozwalają atakującemu kontrolować żądania do wewnętrznych serwerów, mogą doprowadzić do ujawnienia prywatnych informacji. Na przykład, jeżeli w poprzednim przykładzie istniałby SSRF, to móg ł by on pozwoli ć atakuj ą cemu przesy ł a ć żą dania do serwera bazy danych i uzyskać informacje, do których nie powinien mieć dostępu. Podatności SSRF dostarczają atakującym możliwość komunikacji z wewnętrzną siecią.

Załóżmy, że znalazłeś SSRF, jednak podatna strona nie ma wewnętrznych serwerów lub serwery te nie są dostępne przez podatność. W takim przypadku sprawdź, czy możesz wykonywać żądania do zewnętrznych stron z podatnego serwera. Jeżeli uda Ci się wykorzystać docelowy serwer tak, aby komunikował się z twoim własnym serwerem, możesz użyć żądanych informacji, aby poznać szczegóły oprogramowania, z którego korzysta docelowa aplikacja. Być może będziesz też w stanie kontrolować odpowiedź Na przyk ł ad mo ż liwe jest konwertowanie zewn ę trznych żą da ń na wewnętrzne, pod warunkiem, że podatny serwer śledzi przekierowania –trik, który pokazał mi Justin Kennedy. W niektórych przypadkach strona nie pozwoli na dostęp do wewnętrznych adresów IP, ale nawiąże połączenie z zewnętrznymi witrynami. Jeśli tak będzie, możesz zwrócić odpowiedź HTTP z kodem 301, 302, 303 lub 307, które oznaczają przekierowanie. Ponieważ masz kontrolę nad odpowiedziami, możesz skierować serwer na wewnętrzny adres IP, aby przetestować, czy prześledzi on odpowiedź 301 i wykona żądanie HTTP do wewnętrznej sieci.

Alternatywą jest użycie odpowiedzi z własnego serwera, aby sprawdzić obecność innych podatności, takich jak SQLi albo XXS, tak jak zostało to

Niektórzy b ęd ą importowa ć jedn ą , a niektórzy tysią c. W j ę zykach bez zarządzania pamięcią musisz sprawdzić liczbę importowanych transakcji, a następnie przydzielić im odpowiednią ilość pamięci. W przypadku gdy programista nie bierze pod uwagę tego, ile pamięci potrzebuje aplikacja, pojawiają się takie błędy, jak przepełnienie bufora.

Szukanie i exploitowanie podatności pamięci jest na tyle skomplikowane, że na sam ten temat zostały napisane całe książki. Z tego powodu ten rozdział jest jedynie wstępem do tematu omawiającym tylko dwa z wielu innych rodzajów podatności pamięci: przepełnienie bufora oraz odczyt poza granicami bufora. Jeśli jesteś zainteresowany dalszym zgłębianiem wiedzy w tym zakresie, polecam przeczytać Hacking: The Art of Exploitation autorstwa

Jona Ericksona bądź A Bug Hunter’s Diary: A Guided Tour Through the Wilds of Software Security napisaną przez Tobiasa Kleina.

Przepełnienie bufora

Przepełnienie bufora następuje tam, gdzie aplikacja zapisuje dane, których jest zbyt wiele dla przypisanej im pamięci. Przepełnienie bufora prowadzi w najlepszym przypadku do nieprzewidywalnego zachowania aplikacji, a w najgorszym do poważnej podatności bezpieczeństwa. Kiedy atakujący może kontrolować przepełnienie w celu wykonania własnego kodu, jest on w stanie narazić aplikację bądź nawet, zależnie od uprawnień użytkownika, cały serwer. Ten typ podatności jest podobny do przykładów RCE z rozdziału 12. Przepełnienie bufora najczęściej pojawia się wtedy, gdy programista zapomni sprawdzić wielkość zapisywanych danych do zmiennej. Zdarzają się również pomyłki w obliczeniach co do ilości pamięci, jakiej wymagają dane. Ponieważ tego rodzaju błędy zdarzają się na wiele sposobów, zbadamy tylko jeden typ – pominięcie kontroli długości. W języku C pominięcie kontroli długości zazwyczaj wiąże się z użyciem funkcji, które modyfikują pamięć, takich jak strcpy() i memcpy(). Ten typ błędu może pojawić się również tam, gdzie programiści używają funkcji alokacji pamięci, takich jak malloc() lub calloc(). Funkcja strcpy() (oraz memcpy()) przyjmuje dwa parametry: bufor, do którego mają zostać skopiowane dane, oraz dane do skopiowania. Oto przykład w języku C:

#include <string.h> int main()

{

 char src[16]="hello world";

 char dest[16];

 strcpy(dest, src);

 printf("src is %s\n", src); printf("dest is %s\n", dest); return 0; }

W tym przykładzie scr  przyjmuje ciąg "hello world" , który ma 11 znaków długości, wliczając w to spację. Ten kod przydziela 16 bajtów dla src oraz dest  (każdy znak zajmuje 1 bajt). Ponieważ każdy znak wymaga 1 bajta pamięci, a ciąg znaków musi się kończyć znakiem null (\0), ciąg "hello world" wymaga w sumie 12 bajtów, co oczywiście mieści się w granicach przydzielonych 16 bajtów. Funkcja strcpy() kopiuje ciąg z src do dest . Sformułowania printf w  wyświetlają poniższy tekst:

src is hello world dest is hello world

Powyższy kod działa tak, jakbyśmy tego oczekiwali. Co jeśli jednak ktoś chciałby wyraźnie zaakcentować to powitanie? Rozważmy następujący przykład:

#include <string.h>

#include <stdio.h> int main()

{

 char src[17]="hello world!!!!!";  char dest[16];  strcpy(dest, src); printf("src is %s\n", src); printf("dest is %s\n", dest); return 0; }

Mamy tutaj pięć dodatkowych wykrzykników, co zwiększa sumę znaków w ciągu do 16. Programista pamiętał, że wszystkie ciągi w języku C muszą być zakończone znakiem null (\0). Przydzielił 17 bajtów do src , jednakże zapomniał zrobić to samo dla dest . Po skompilowaniu i uruchomieniu programu oczom programisty ukazuje się następujące wyjście: src is dest is hello world!!!!!

Zmienna src jest pusta mimo przypisania do niej 'hello world!!!!!'. Dzieje się to z powodu tego, w jaki sposób C alokuje pamięć na stosie. Adresy pamięci na stosie są przydzielane rosnąco, tak więc zmienna zdefiniowana w programie wcześniej będzie mieć niższy adres pamięci od tej zdefiniowanej później. W tym przypadku src jest dodany do stosu pierwszy, a dopiero za nim dest. Kiedy następuje przepełnienie, 17 znaków dla 'hello world!!!!!!' zostaje zapisane w zmiennej dest, jednak znak null (\0) zostaje wypchnięty do pierwszego znaku zmiennej src. Ponieważ znaki null oznaczają koniec ciągu, src ukazuje się jako pusty.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.
100864523 by WN PWN - Issuu