Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Krótka historia strzału w HelloSign – serwis od Dropboxa. Nagroda ~70 000 PLN.
Badacz opisuje znalezioną przez siebie lukę tutaj. Opis luki może wydawać się nieco enigmatyczny:
This researcher pointed out that HelloSign’s Google Drive doc export feature had a URL parsing issue that could allow extra parameters to be passed to Google Drive API. By making use of an extra parameter in the Google Drive API, it was possible for researchers to force HelloSign to parse external JSON data which leads to an SSRF attack
więc spróbujmy wyjaśnić w żołnierskich słowach wyjaśnić, o co tutaj chodziło.
- Podatność to SSRF (Server-Side Request Forgery), tj. zmuszenie serwera (w tym przypadku jest to usługa HelloSign należąca do Dropboxa) do wykonania żądania HTTP np. do samego siebie (do localhost) lub do serwera w backendzie i zaserwowania odpowiedzi atakującemu, który znajduje się w internecie.
- Luka znajdowała się oczywiście w kodzie uruchamianym na serwerze DropBoxa. Kod w standardowy sposób integruje się z Google Drive – tj. umożliwia pobranie zewnętrznych plików z repozytorium użytkownika (atakującego).
- Standardowa metoda integracji Google Drive z zewnętrznymi aplikacjami, działa tak:
- Make a request to GDrive API for user’s provided file [kontrolujemy ten plik – bo leży on na naszym Google Drive]
https://www.googleapis.com/drive/v2/files/?file_id=id_naszego_pliku_na_gdrive&access_token=nasz_token - Parse the JSON response of Google Drive
- Extract
downloadUrl
key’s value from parsed JSON - Make request to the download url
- Render the response
4. I przechodzimy do istoty całej zabawy. Google w pierwszym kroku (bullecie) powyżej obsługuje parametr, który nazywa się alt=media
Jeśli go podamy podczas pobierania pliku, nie jest zwracany JSON automatycznie generowany przez Google Drive, a bezpośrednio sam plik. Czyli w kroku drugim biblioteka (działająca po stronie serwera DropBoxa) otrzyma JSONa którego my kontrolujemy (bo go sami zuploadowaliśmy do Google Drive :)
https://www.googleapis.com/drive/v2/files/?file_id=id_naszego_pliku_na_gdrive?alt=media&access_token=nasz_token
5. W JSONie zmieniliśmy złośliwie wartość klucza downloadUrl na dowolny adres (np. localhost) – biblioteka tam uderza i wyświetla nam odpowiedź.
6. Tutaj przykładowe wyciągnięcie sekretów z serwera:
7. $17,576 wpływa na konto :-)
~Michał Sajdak