Na tropie błędów. Przewodnik hakerski. Peter Yaworski
Читать онлайн книгу.jak przeglądarka wykona żądanie HTTP, na dwa sposoby. Po pierwsze, content określa, jak długo przeglądarka czeka przed wysłaniem żądania HTTP pod wskazany adres; w tym przypadku 0 sekund. Po drugie, atrybut content wyznacza parametr URL strony, do której wysyła żądanie GET; w tym przypadku http://www.google.com. Atakujący mogą wykorzystać te zachowania w sytuacjach, w których kontrolują atrybut content w tagu <meta> lub dodać własny tag przez inną podatność.
Atakujący może również użyć kodu JavaScript, by przekierować użytkowników przez modyfikację właściwości location okna przez obiektowy model dokumentu (DOM – Document Object Model). DOM jest interfejsem programowania dla dokumentów HTML i XML, który pozwala deweloperom na modyfikowanie struktury, stylów i zawartości strony internetowej. Ponieważ właściwość location wskazuje, gdzie żądanie powinno zostać przekierowane, przeglądarka niezwłocznie zinterpretuje szkodliwy JavaScript i przekieruje do określonego adresu URL. Atakujący może modyfikować własność location okna, używając jednego z wybranych skryptów:
window.location = https://www.google.com/
window.location.href = https://www.google.com
window.location.replace(https://www.google.com)
Zazwyczaj możliwość zmiany wartości window.location pojawia się jedynie tam, gdzie atakujący może wykonać kod JavaScript, przez podatność cross-site scripting (XSS), albo tam, gdzie strona celowo pozwala użytkownikom decydować o adresie URL do przekierowania, podobnie jak w podatności serwisu HackerOne omawianej później w tym rozdziale, na stronie 16.
Kiedy szukasz podatności na otwarte przekierowanie, najczęściej będziesz monitorował swoją historię proxy, szukając żądań GET wysłanych do strony, którą testujesz.
Otwarte przekierowanie przy instalacji motywu Shopify
Poziom trudności: Niski
URL: https://apps.shopify.com/services/google/themes/preview/ supply–blue?domain_name=<dowolnadomena>
Źródło: https://www.hackerone.com/reports/101962/
Data zgłoszenia: 25 listopada 2015
Nagroda: 500 $
Pierwszy przykład podatności na otwarte przekierowania, który poznasz, został znaleziony na platformie Shopify pozwalającej użytkownikom tworzyć sklepy internetowe. Shopify zezwala administratorom na dostosowywanie wyglądu swoich sklepów przez zmianę ich motywów. Jako część tej funkcjonalności, Shopify zaoferowało możliwość sprawdzenia wyglądu motywu przez przekierowanie właściciela sklepu na adres URL. Przekierowujący URL prezentował się następująco:
https://apps.shopify.com/services/google/themes/preview/supply–blue?domain_name=attacker.com
Parametr domain_name na końcu URL-a przekierowywał domenę sklepu użytkownika i dodawał /admin na końcu adresu. Shopify spodziewał się, że parametr domain_name zawsze będzie adresem sklepu użytkownika i nie weryfikował, czy należy do serwisu. W rezultacie atakujący mógł wykorzystać parametr do przekierowania ofiary na stronę http:/<attacker>.com/admin/, gdzie mógł podjąć się kolejnych ataków.
Wnioski
Nie wszystkie podatności są skomplikowane. W przypadku tego przekierowania, wystarczyło podmienić parametr domain_name na zewnętrzną stronę, by przenieść użytkownika poza Shopify.
Otwarte przekierowanie przy logowaniu do Shopify
Poziom trudności: Niski
URL: https://mystore.myshopify.com/account/login/
Źródło: https://www.hackerone.com/reports/103772/
Data zgłoszenia: 6 grudnia 2015
Nagroda: 500 $
Drugi przykład otwartego przekierowania jest podobny do pierwszego, z wyjątkiem tego, że zamiast parametru URL docelową domenę określa wartość parametru na końcu subdomeny Shopify. Normalnie ta funkcjonalność byłaby używana do odsyłania użytkownika na określoną stronę w obrębie jednego sklepu. Jednakże atakujący wciąż mogą manipulować tymi adresami, aby przekierować przeglądarkę z dala od subdomeny Shopify, na witrynę atakującego przez dodanie znaków, które zmienią znaczenie URL.
W przypadku tego błędu, po zalogowaniu do Shopify, serwis używał parametru checkout_url do przekierowania użytkownika. Dla zobrazowania powiedzmy, że ofiara odwiedza następujący adres:
http://mystore.myshopify.com/account/login?checkout_url=.attacker.com
Zostałaby przekierowana na URL http://mystore.myshopify.com.<attacker>.com/, który nie jest domeną Shopify.
Ponieważ URL kończy się .<attacker>.com, a wyszukiwarki DNS używają nazwy domeny wysuniętej najdalej na prawo w adresie, przekierowanie zostaje wykonane na domenę <attacker>.com. Zatem gdy http://mystore.myshopify.com.<attacker>.com/ zostaje wysłany do wyszukiwarki DNS, zostanie dopasowany do <attacker>.com, którego Shopify nie ma, a nie myshopify.com, tak jak Shopify miał w zamiarze. Mimo że atakujący nie byłby w stanie wysłać ofiary na dowolną stronę, mógłby go wysłać na inną domenę przez dodanie specjalnych znaków, takich jak kropka, do wartości, którymi może manipulować.
Wnioski
Jeśli tylko możesz kontrolować końcowy fragment adresu URL używanego przez stronę, dodanie specjalnych znaków URL może zmienić znaczenie danego adresu i przekierować użytkownika na inną domenę. Powiedzmy, że możesz kontrolować jedynie wartość parametru checkout_url oraz zauważysz, że parametr jest dodawany do gotowego adresu URL, takiego jak http://mystore.myshopify.com/. Spróbuj dodawać specjalne znaki URL, takie jak kropka lub @, w celu przetestowania możliwości kontroli lokalizacji przekierowania.
Przekierowanie pośrednie na HackerOne
Poziom trudności: Niski
URL: N/A
Źródło: https://www.hackerone.com/reports/111968/
Data zgłoszenia: 20 stycznia 2016
Nagroda: 500 $
Niektóre strony internetowe próbują się chronić przed otwartymi przekierowaniami przez implementację stron pośredniczących, które wyświetlają się przed ukazaniem oczekiwanej zawartości. Za każdym razem, gdy przekierowujesz użytkownika na URL, możesz wyświetlić pośredniczącą stronę z wiadomością wyjaśniającą użytkownikowi to, że opuszcza domenę, na której się znajduje. W rezultacie, jeżeli przekierowująca strona pokazuje fałszywy login lub próbuje udawać zaufaną stronę, użytkownik będzie wiedział, że jest przekierowywany. To podejście stosuje serwis HackerOne w przypadku większości linków ze swojej strony; na przykład dla linków w zgłoszeniach błędów.
Możesz używać stron pośredniczących, by uniknąć podatności na przekierowania, jednakże komplikacje, które wynikają z tego, w jaki sposób strona wchodzi w interakcję z innymi, może doprowadzić do uszkodzenia linków. HackerOne używa Zendesk, serwisu obsługi klienta w systemie ticketowym, na subdomenie https://support.hackerone.com/.