Lekcja 23: Oczyszczanie HTML jest trudne
Spotkanie OWASP, rozwiązanie mini-konkursu
Mini-konkurs został rozstrzygnięty. Zwyciężył Kamil Reszczyk, gratuluję!
Nadesłane w trakcie konkursu rozwiązania (również te, które zaginęły w drodze) udostępniam tu: przykładowe rozwiązania zadania. Udostępniam również kod parsera wykorzystanego w przykładzie.
Wprowadzenie
Przykład ten jest inspirowany prezentacją The Presence and Future of Web Attacks Multi-Layer Attacks and XSSQLI, która chyba najbardziej podobała mi się na Confidence 2010.
Do tej pory przykłady dotyczyły prawidłowego kodowania (encodingu) danych. Ten przykład dotyczy oczyszczania (sanitization) przekazanych danych po to, by nie zawierały niebezpiecznego kodu. Jest to zadanie dalece trudniejsze niż prawidłowa walidacja oraz encoding danych.
Przykład dostępny pod adresem http://bootcamp.threats.pl/lesson23/ symuluje przypadek, w którym użytkownik może wpisać fragment kodu HTML. Może to być na przykład komentarz na forum czy opis aukcji internetowej. Aplikacja przed wyświetleniem wpisanych przez użytkownika danych dokonuje ich oczyszczenia usuwając (w założeniu) wszystkie niebezpieczne konstrukcje.
Przykład oparty jest na zasadzie białej listy dozwolonych tagów. Lista ta zawiera tagi:
- p
- b
- i
- a
- img
Wszystkie atrybuty z wyjątkiem href oraz src dla tagów (odpowiednio) a oraz img są usuwane. Zadanie polega na znalezieniu takiej konstrukcji HTML, w której:
- osadzony zostanie XSS aktywowany akcją użytkownika,
- osadzony zostanie XSS aktywowany automatycznie po wyświetleniu strony,
Przykład ten w zamyśle ma pokazać, że:
- oczyszczanie HTML jest trudnym zadaniem,
- implementacja funkcji oczyszczania HTML jest trudna,
- lepiej korzystać z gotowych, sprawdzonych bibliotek,
Ostatni punkt może być kontrowersyjny, ponieważ nawet gotowe, sprawdzone biblioteki mają błędy. Łatwiej jest jednak aktualizować bibliotekę do nowej wersji, niż śledzić i poprawiać własny kod.