Pokazanie przykładów niewłaściwego encodingu mamy za sobą (patrz: #1, #2, #3, #4 i #5). Na koniec przykład: http://bootcamp.threats.pl/lesson09b/, w którym encoding jest realizowany za pośrednictwem ESAPI (konkretnie owasp-esapi-php, jest to jeszcze wersja nieprodukcyjna). Dane wpisane przez użytkownika wypisywane są w trzech miejscach, w których encodowane są przy pomocy funkcji:
- encodeForJavaScript,
- encodeForJavaScript i encodeForHTMLAttribute
- encodeForJavaScript,
Funkcja doStuff obecnie coś robi, konkretnie wypisuje wartość otrzymanego parametru w drugim textarea. Zrobiłem to po to, by każdy mógł się przekonać, że te dziwne znaczki, które generuje ESAPI to rzeczywiście to, co zostało oryginalnie przekazane. A te dziwne znaczki wyglądają tak:
Dla encodeForJavaScript w kontekście atrybutu HTML:
<a href="#" onclick="javascript:doStuff('\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B,\x2D.\x2F\x3A\x3B\x3C\x3D\x3E\x3F\x40\x5B\x5C\x5D\x5E_\x60\x7B\x7C\x7D\x7E')">demo 1</a><br />
Dla encodeForJavaScript i encodeForHTMLAttribute w kontekście atrybutu HTML:
<a href="#" onclick="javascript:doStuff('\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B,\x2D.\x2F\x3A\x3B\x3C\x3D\x3E\x3F\x40\x5B\x5C\x5D\x5E_\x60\x7B\x7C\x7D\x7E')">demo 2</a><br />
Jeszcze raz dla encodeForJavaScript, tym razem w kontekście skryptu:
<script type="text/javascript"> doStuff('\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B,\x2D.\x2F\x3A\x3B\x3C\x3D\x3E\x3F\x40\x5B\x5C\x5D\x5E_\x60\x7B\x7C\x7D\x7E'); </script>
Mam nadzieję, że ten przykład wystarczająco dobrze pokazuje, że:
- encoding może być prosty, wystarczy wywołać odpowiednią dla kontekstu funkcję,
- encoding może być skuteczny (ktoś potrafi obejść encoding implementowany przez ESAPI i wykorzystany w tym przykładzie?),
- mimo encodingu wszystko może nadal działać,
I tym optymistycznym akcentem kończę ten temat. Przynajmniej na jakiś czas.
Czyli rozumiem, że jak trafię na stronę gdzie ktoś stosuje poprawny encoding dla pól formularza, to w tym miejscu nie da się wstrzyknąć XSS??
Pozdr.,
Piotr Bratkowski