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.
<!--Page Language="C#" AutoEventWireup="true" ValidateRequest="false"--> <!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt--> <script><!--mce:0--></script> <form id="form1" enctype="application/x-www-form-urlencoded"> <div></div> </form>
Vizual, pagina este

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
<script type="text/javascript"><!--mce:1--></script>
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
<span id="LabelHello">Welcome <script type="text/javascript"><!--mce:2--></script> to My Web Site</span>
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 < iar > in >);
- 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:
- http://www.w3schools.com/JS/ (JavaScript Tutorial)
- http://msdn.microsoft.com/en-us/library/bb355989.aspx (How To: Protect From Injection Attacks in ASP.NET)
- http://msdn.microsoft.com/en-us/library/ms998274.aspx (How To: Prevent Cross-Site Scripting in ASP.NET)

in romanian
in english