JavaScript Injection

Scopul acestui material este de a descrie vulnerabilitatile unui formular Web pentru a ajuta la protejarea site-urilor si nu de a descrie metode care sa fie utilizate in scopuri rau intentionate. Din punctul de vedere al securitatii informatice, un administrator trebuie sa stie cum poate fi atacat site-ul pentru a implementa masuri de protectie.

JavaScript Injection reprezinta o tehnica prin care un utilizator poate sa insereze sau sa execute cod JavaScript in pagina Web vizitata (NU in sursa ei de pe server, ci in sursa html care a fost primita de la server si care se gaseste pe calculatorul utilizatorului). Acest lucru este posibil deoarece:

  • JavaScript este un limbaj scriptic ce este inserat in sursa paginii Web sau in fisiere separate cu extensia .js;
  • secventele JavaScript sunt interpretate de browser si nu sunt prelucrate de server (asa cum se intampla la un limbaj de programare – C#, VB.NET, Java, PHP);
  • la cererile HTTP facute de browser-ele clientilor, serverul raspunde cu pagina Web ce contine script-urile JavaScript (daca exista) si cod HTML (definit static sau generat prin interpretarea instructiunilor din paginile ASP.NET, JSP sau PHP);
  • script-urile JavaScript din pagina Web vizualizata in browser se executa intotdeauna pe masina clientului.

Caracteristicile descrise anterior NU fac din JavaScript Injection o metoda de atac asupra unui site pentru a modifica sursele paginilor Web (doar daca input-ul dintr-un formular, genereaza continut intr-o alta pagina; de exemplu ).
JavaScript Injection este o tehnica utilizata pentru a trece peste anumite validari care se fac in pagina Web, direct pe masina clientului, sau pentru a insera cod JavaScript in pagini Web generate automat pe baza datelor introduse de vizitatori.
Zone abordate in atacuri:

  • controale ce permit input, iar din aceasta categorie cele mai folosite sunt TexBox-urile sau Field-urile;
  • address bar-ul (URL bar-ul) din browser; codul JavaScript este rulat utilizand protocolul javascript: si va afecta pagina curenta (incarcata anterior in browser).

Pentru a exemplifica metodele prezentate se considera pagina Web Hello.aspx dezvoltata pe platforma .NET si care contine cod C#. Complexitatea exemplului este extrem de redusa (chiar daca nu exista cunostinte de ASP.NET) si nu influenteaza major intelegerea exemplelor de JavaScript Injection.

Vizual, pagina este

Hello.aspx ASP.NET page
Hello.aspx ASP.NET page

Dupa cum se vede, aceasta pagina contine

  • un control de tip TextBox cu id-ul TextBox_Name in care utilizatorul poate introduce un nume;
  • un control de tip Hidden cu id-ul HiddenValue in care este stocat numele site-ului, My Web Site;
  • un control de tip Label cu id-ul LabelHello in care este afisat mesajul “Welcome <nume> to My Web Site”;
  • un control de tip buton a carui activare executa functia Button1_Click ce preia numele utilizatorului si afiseaza mesajul in eticheta LabelHello.

Tehnici si metode utilizate:

  • inserare script-uri executabile

Prin inserarea de script-uri JavaScript executabile, pagina aflata pe calculatorul utilizatorului si pe care acesta o vede in browser isi va modifica continutul (NU sursa paginii care se gaseste pe server).
Daca in TextBox-ul din exemplul considerat se introduce script-ul

si se activeaza butonul Send, atunci va aparea un pop-up cu mesajul „This is my first JavaScript injection!” iar in pagina apare mesajul Welcome to My Web Site (ATENTIE, daca acest lucru nu se intampla si se primeste o eroare, atunci vedeti postul Solutie pentru A potentially dangerous Request.Form value was detected from the client… pentru a remedia situatia).
Daca avem curiozitatea sa ne uitam in sursa acestei pagini, vom observa ca s-a modificat, in special zona

Welcome

to My Web Site

Explicatia acestei situatii se afla in mecanismul de prelucrare a paginilor dinamice de catre server. In momentul in care se activeaza butonul, browser-ul face o cerere de tip POST catre server-ul Web. Aceasta cerere contine valorile controalelor din formular si evenimentul care a declansat aceasta cerere (in cazul de fata, click pe buton). Serverul executa functia abonata la acest eveniment (Button1_Click) si retrimite, ca raspuns catre browser, pagina curenta, dar cu modificarile facute de functia respectiva (in control-ul de tip Label este scris mesajul

Welcome <script type="text/javascript">alert("This is my first JavaScript!");</script> to My Web Site.

Browser-ul primeste raspunsul si executa script-ul JavaScript intalnit in zona controlului de tip Label.
Ce trebuie inteles este ca s-a modificat doar pagina pe care o vede acest utilizator. Aceasta metoda NU permite modificarea surselor paginilor (astfel incat toti vizitatorii site-ului sa primeasca acest script), doar daca………….formularul anterior este utilizat pentru a prelua mesaje de la utilizatori care sa fie salvate si apoi afisate in alte pagini (ceva gen pagina de inserare a comentariilor sau forum). In acest ultim scenariu, administratorul site-ului nu trebuie sa permita inserare de text in care se gasesc siruri cu formatul <text> (adica Java Script, cod HTMl, XML), sau daca permite sa le valideze cu atentie.

  • vizualizare si editare cookie-uri;

Acest lucru este posibil si fara JavaScript Injection deoarece aceste cooki-uri reprezinta fisiere text create in directorul Temporary Internet Files (pentru Windows) si care au forma user@url.txt. Pentru a testa daca pagina curenta creaza fisiere de tip cookie, in URL-bar se insereaza textul

javascript:alert(document.cookie);

Aceasta functie va afisa intr-un MessageBox sau PopUp Window continutul fisierului de tip cookie. Daca acesta nu exista, atunci textul afisat este unul vid.
Pentru a edita continutul acestui fisier se insereaza in adress-bar comenzi de tipul:

javascript:void(document.cookie="Field = value");

De exemplu, daca se doreste inserarea sau modificarea atributului Autentificare cu valoarea true atunci se lanseaza comanda

javascript:void(document.cookie="Autentificare = true");
  • editare campuri formular

Aceasta metoda se bazeaza pe faptul ca fiecare document html genereaza genereaza o structura arborescenta DOM (Document Object Model) prin intermediul careia pot fi accesate elemente din pagina Web. Revenim la exemplul anterior si punem pentru controlul de tip TextBox o proprietate suplimentara MaxLength=”8″ (ce nu va permite utilizatorului sa introduca mai mult de 8 caractere)

…

…

Valoarea control-ului TextBox_Name este afisat prin instructiunea (numele controalelor este vizibil in sursa paginii)

javascript:alert(document.forms[0].TextBox_Name.value)

Modificarea campului poate fi facuta prin instructiunea

javascript:void(document.forms[0].TextBox_Name.value="SirDeCaractereMare")

Acest lucru poate fi utilizat pentru a insera in controlul de tip TextBox un sir de caractere cu o lungime mai mare de 8 (vizual nu este posibil deoarece exista proprietatea MaxLength=”8″)
Modificarea de valoare poate fi aplicata si campului de tip hidden

javascript:alert(document.forms[0].HiddenValue.value="Acum este site-ul meu")

care nu poate fi alterat direct din pagina.
Dupa executia celor 2 instructiuni JavaScript si activarea butonului, in pagina Web va aparea mesajul ”Welcome SirDeCaractereMare to Acum este site-ul meu”.
Masuri de protectie:

  • validarea intotdeauna a datelor de intrare la nivel de cod sursa inainte de prelucrare chiar daca sunt utilizate metode de validare la nivel de formular; platforma .NET (incepand cu versiunea 1.1) face automat validarea continutului controalelor utilizate pentru input si genereaza HttpRequestValidationException daca este detectat un text ce poate reprezenta JavaScript (ceva de forma <text>); postul Solutie pentru A potentially dangerous Request.Form value was detected from the client… prezinta o solutie de anulare a acestei validari, insa dezvoltatorul paginii Web trebuie sa acorde atentie sporita la validarea inputului pentru a separa codul JavaScript de siruri de caractere in format acceptat (pentru ASP.NET se poate utiliza metoda Server.HtmlEncode() pentru a stoca in format HTML caracterele speciale; de exemplu < este transformat in &lt; iar > in &gt;);
  • evitarea stocarii de date importante in campuri de tip hidden (pot fi citite cu usurinta din codul paginii si pot fi modificate);
  • evitarea stocarii de date importante in cookie-uri, iar daca acest lucru nu poate fi evitat, NU in clar; o alternativa ar fi utilizarea variabilelor de sesiune.

Surse Web despre JavaScript si JavaScript Injection: