Bootcamp IX: encoding (przykład)
Tym razem trochę pracy u podstaw. Jest to praktyczna demonstracja tego, że encoding danych wyjściowych jest potrzebny oraz tego, że powinien być realizowany w sposób zależny od kontekstu, w którym dane są użyte.
Przykład dostępny jest pod adresem: http://bootcamp.threats.pl/lesson09/. W przykładzie dostępne są trzy możliwości encodingu:
- brak encodingu (niespodzianka),
- encoding dla użycia w HTML,
- encoding dla użycia w atrybucie HTML,_
Encoding jest realizowany za pośrednictwem funkcji htmlentities z różnymi parametrami wywołania. W planach miałem użycie funkcji z ESAPI, ale wersja dla PHP jest jeszcze w powijakach. Rezultat funkcji encodeForHtml oraz encodeForHtmlAttribute zaimplementowanych przeze mnie przy pomocy htmlentities mniej więcej odpowiada temu, co wielokrotnie spotykałem w testowanych przeze mnie aplikacjach.
Przekaazna przez użytkownika wartość jest encodowana przy pomocy wskazanej funkcji i wypisywana w kilku kontekstach:
- treść HTML,
- URL i treść odnośnika,
- atrybut (pole hidden),
- atrybut (znacznik span),
- skrypt JavaScript,
Można sobie poeksperymentować jak w tych kontekstach osadzić XSS i co powoduje zastosowanie dostępnych do wyboru funkcji w danym kontekście.
UWAGA: w ramach premii schowałem “niezamierzonego” XSS, którego mechanizm widziałem w kilku testowanych przeze mnie aplikacjach różnych producentów.
Oryginał tego wpisu dostępny jest pod adresem Bootcamp IX: encoding (przykład)
Autor: Paweł Goleń