Mój niezbyt trudny przykład doczekał się rozwiązania. Jego autorem jest ^radekk, a zobaczyć je można (podobnie jak wcześniejsze ^koto) na blipie (tag #thrts). Jak wspominałem, sam przykład nie jest specjalnie trudny, ciekawsza może być stojąca za nim historia.
Bootcamp XXIV: rozwiązanie
Pierwszy impuls do tego przykładu pojawił się, gdy w wykorzystywanym na blogu szablonie znalazłem potencjalny XSS. Opisałem to we wpisie Nie jestem purystą, ale... czyli spot the bug. By ten błąd wykorzystać, należało utworzyć wpis o określonej nazwie, a w dodatku zmieścić się z payloadem w ograniczonej długości znaków. Oczywiście - można. Tylko po co? Po co, skoro osoba, która ma możliwość nadania wpisowi określonego tytułu, XSS może osadzić również na kilkanaście innych, łatwiejszych sposobów. Cała sytuacja uległaby zdecydowanej zmianie, gdyby tytuły były na przykład brane z zewnętrznego źródła.
Drugi impuls pojawił się wówczas, gdy pisałem krótki kod do wstawiania statusu z blipa. Standardowy gadżet mi się nie podobał, więc na szybko napisałem taką prostą funkcję:
function blip_widget_run(w) { var blipStatus = document.getElementById('blip-status'); blipStatus.innerHTML = w.body; blipStatus.href = 'http://blip.pl/s/' + w.id; }
Co jest z nią nie tak? Dokładnie to samo, co w obecnym przykładzie z bootcamp. No, prawie to samo, bo w przykładzie zasymulowałem encoding znaków < oraz > by nie było tak prosto. Do kilku szczegółów związanych z tym przykładem wrócę zresztą w najbliższej(?) przyszłości.
Jeśli ktoś nie zorientował się, co jest nie tak z tym kodem - wyjaśniam. Korzystając z innerHTML wpisuję fragment kodu, który może zawierać znaczniki HTML. Innymi słowy - proszę się o XSS, wspomina o tym MSDN. Ten fragment kodu długo czekał na poprawkę, specjalnie zresztą mi się z nią nie spieszyło, bo musiałbym sam sobie tego XSS zafundować, a mam ku temu sporo innych sposobów. Ewentualność wysłania przez kogoś czegoś w moim imieniu chwilowo tu pomijam.
Temat ponownie zaświtał mi w głowie wówczas, gdy Gynvael zastanawiał się nad prasówką, a ja w całej swojej leniwości, nad automatycznym sposobem jej realizacji. W tym wariancie mamy "full wypas" czyli dane wstawiane na stronę i przetwarzane przez hipotetyczny gadżet pochodzą z niezaufanego źródła i potencjalnie są ZŁE.
Trzeci impuls, choć chronologicznie powinien być wymieniony dużo wcześniej, to pewien specyficzny przykład XSS, na który się kiedyś natknąłem. Strona tworzona była w dość dziwny sposób, w szczególności niektóre jej fragmenty były dość intensywnie przekształcane przy pomocy jQuery. Serwer zwracał dane wpisane przez klienta zakodowane w odpowiedni sposób, ale... co zrobi(ł) następujący kod:
$('#test2').html($('#test1').text());
I czego się nauczyliśmy?
Dzisiaj pierwsza część rozwinięcia rozwiązania zadania XXIV z bootcamp.Przykłady były ostatecznie dwa, dostępne są one pod adresami: http://bootcamp.threats.pl/lesson24/, http://bootcamp.threats.pl/lesson24a/, Przykłady te różnią się w bardzo niewi
Przesłany: Nov 04, 07:31