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.
Bootcamp IX: encoding (przykład)
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.
[url, hidden, span]: Test" onmouseover="alert(1)" style="display: block; position: fixed; top: 0px; left: 0px; width: 2000px; height: 2000px
[js]: Test'; alert(1);//
[url]: javascript:alert(1);
0'; alert(1);//