W aplikacjach sieciowych często zamiast "czystych" linków, wykorzystywany jest JavaScript. Po kliknięciu na obiekt (link, obrazek, paragraf), wykonuje się pewna akcja, na przykład otwiera się nowa strona w nowym oknie przeglądarki. Czasami adres tej nowej strony budowany jest na podstawie parametrów przesłanych przez użytkownika. Jeśli wartość wstawiana jest "wprost", jest oczywiście XSS. Zamiast tego znaki specjalne powinny być kodowane z wykorzystaniem URL Encoding. Tylko jest jedna, mała niespodzianka.
a href=javascript jest... no niespodzianka - ZŁE!
Poniżej przykład tej niespodzianki:
W obu przypadkach wołana jest prosta funkcja fTest, której jedynym zadaniem jest wypisanie wartości przekazanego do niej parametru. W obu przypadkach wywołanie wygląda w sposób następujący:
javascript:fTest('testowy%27%29%7C%7Calert%28%2FXSS%2F%29%3B%2F%2Fstring')
Różnica między dwoma przypadkami jest taka, że w pierwszym przypadku funkcja ta wywołana jest w zdarzeniu onclick, w drugim przypadku wywołanie tej funkcji jest po prostu w href. Parametr ma wartość testowy%27%29%7C%7Calert%28%2FXSS%2F%29%3B%2F%2Fstring, gdzie między testowy a string wstawiony jest fragment w url encoding. Fragment ten w oryginale to ')||alert(/XSS/);//. Jeśli wartość ta zostałaby wstawiona do skryptu bez encodingu, wówczas fakt istnienia XSS byłby oczywisty. Dlaczego ten powyższy przykład działa (sprawdzałem w Firefox, Internet Explorer i Opera)? Wygląda na to, że w przypadku href do interpretera JavaScript przekazywany jest odkodowany łańcuch znaków, czyli zdejmowane jest zastosowane zabezpieczenie. Dlaczego tak się dzieje - nie wiem, ale chyba ma to sens, skoro trzy wymienione przeglądarki zachowują się w opisywany sposób. Pozostaje więc przyjąć, że umieszczanie kodu JavaScript w href jest ZŁE i zamiast tego umieszczać go w zdarzeniu onclick (lub innym odpowiednim dla danej sytuacji).
Wiele razy pisałem i mówiłem, że encoding musi być właściwy dla kontekstu, w którym dane będą użyte. Tu kolejny przykład, w którym kontekst został źle zidentyfikowany: Twitter misidentifying context. Przypomina mi to przypadek, który opisałem w a href=jav
Przesłany: Nov 24, 16:14