Gru
4

JavaScript, a URLencoding

autor: p____h  //  ::medium::, Security

W porównaniu do kilku poprzednich wpisów, dziś nazwa tematu zdecydowanie mniej finezyjna, ale sam temat za to zdecydowanie bardziej techniczny. Spotkałem się już kilka razy ze stwierdzeniem, że urlencode jest całkiem niezłym pomysłem nad zabezpieczeniem przed Cross-Site Scripting. Poniżej – kilka słów o tym, że nie jest jednak tak kolorowo.


Poniżej znajduje się prosta funkcja JavaScript, której zadaniem jest porównać jakąś liczbę i wyświetlić stosowny komunikat:

function calculate(num)
{
	if (parseInt(num) == 1000) alert('ok');
	else if (parseInt(num) > 1000) alert('too big');
	else alert('too small');
}

Następnie, kawałek kodu, który generuje pewne linki na podstawie zmiennej GET. To co znajduje się w tej zmiennej jest kodowane za pomocą urlencode, a następnie wrzucane do funkcji calculate. Także javascriptowa funkcja przyjmuje parametr, który został już poddany URL-encodingowi:

echo '<div id="PoC">';
echo '<a href="javascript:calculate(\''.urlencode($_GET['test']).'\');">click</a><br />';
echo '<a href="#" onclick="calculate(\''.urlencode($_GET['test']).'\');">click</a><br />';
echo '</div>';

Naszym zadaniem jest znalezienie w powyższym kodzie podatności typu XSS. Powiedzmy, że po kliknięciu w dany link, chcemy zrobić coś więcej, niż wywołać alert z funkcji calculate. W pierwszym przypadku mamy do czynienia z odpaleniem akcji wprost z a href, w drugim – w zdarzeniu onclick. Który z nich jest zły?
Okazuje się, że pierwszy z nich, zachowuje się tak, jakby przekazywał interpreterowi JavaScript odkodowany (czyli ze ściągniętym URL-encodingiem) kod. A to oznacza, że zabezpieczenie, którego użyliśmy nie zadziała w sposób, jaki chcieliśmy.

Jak więc wyglądałby XSS w tym przypadku? Wystarczyłoby uciec z funkcji calculate i wywołać kolejną akcję. Oto przykłady:

?test=test');window.location='http://google.pl';('
?test=test');document.getElementById('PoC').innerHTML+='xssed'+parseInt('0

Jeśli ktoś chciałby upewnić się, że w obu przypadkach funkcja calculate dostaje identyczny parametr, ale zachowuje się różnie – polecam zerknąć do źródła. A wniosek z tej krótkiej ciekawotski to: event handling jest zdecydowanie lepszy niż href=javascript.

  

2 komentarze to “JavaScript, a URLencoding”

  • dlaczego wszyskie kursy xss pokazują alert(‚xss’), a ty jakiś inny skrypt???

  • Zgadzam się – większość materiałów dotyczących Cross-Site Scripting pokazuje prosty alert() wyświetlony na stronie. I szczerze mówiąc, to nie za bardzo mi się podoba – bo tego typu przykłady banalizują efekty, jakie można uzyskać za pomocą tej podatności. Już wiele razy spotkałem się z opinią [cyt.] "XSS to tylko niegroźny atak, polegający na wyświetleniu uciążliwego komunikatu" – co jest oczywiście nieprawdą.

    Wklejony przeze mnie przykład pokazuje, że XSS może być również dobrym zalążkiem dla phisingerów (a phising to problem znacznie poważniejszy, niż "uciążliwy komunikat"). Także odejdźmy od ukazywania XSSów jako niegroźnych alertów z komunikatem i pokazujmy przykłady, które rzeczywiście stanowią jakieś zagrożenie.

Dodaj komentarz

*

Audio-CAPTCHA