Cum sa te protejezi de atacurile Cross-site request forgery(CSRF)?
atacuri, Cross Site Request Forgery, csrf, hacking, Nytro, securitate, securitate web, Sirgod, web developer, xss
Salutare.Probabil ca din moment ce citesti acest articol esti interesat de securitate, sau lucrezi la proiecte web si vrei sa vizezi si acest tip de atac, sau pur si simplu iti place sa fii documentat si simti nevoia sa adaugi si aceste informatii la cele ce le detii deja.In orice caz,in acest articol vom discuta despre atacurile Cross-Site Request Forgery(CSRF), cum le detectam,cum le declansam si cum ne protejam eficient.Daca va mai aduceti aminte despre un articol scris cu ceva vreme in urma de SirGod, el a prezentat si acest gen de atac web.Din pacate,datorita volumului mare de informatie ce a vrut sa-l prezinte in acel articol, nu a detaliat atacurile respective.Daca voi vedea interes,incet incet, voi prezenta diverse metode mai mult sau mai putin clasice privind securizarea unui website,in functie de atacurile ce dorim sa le eliminam de pe lista de risc.
![csrf[1] csrf[1]](http://www.worldit.info/wp-content/uploads/2009/11/csrf1-300x225.png)
1. Despre atacurile CSRF
Atacurile CSRF le putem denumi ca atacurile ce se bazeaza pe nivelul de incredere ce il ofera un site, utilizatorului.Astfel atacul vizeaza persoane cu anumite drepturi pe website-urile vizate,atacurile fiind declansate prin oferirea unor linkuri ce ar trebui deschise de victima,sau prin crearea unor link-uri/imagini “malformate”, ce ar incarca acele pagini automat.
Aceste atacuri exista de foarte multa vreme,in ultimii ani numarul lor crescand foarte mult.Putem da ca exemplu Ebay, ce in 2008 aproape 18 milioane de clienti au pierdut datele confidentiale ale contului.
2. Cum arata atacurile CSRF?
Un atac CSRF il putem recunoaste in general prin link-uri in comentarii ce ne trimit spre exemplu catre panoul de administrare, sau taguri de imagini de genul : <img src=”http://siteulnostru.com/paginaprivata?actiuneprivata” /> . Aceste metode sunt clasice in cazul acestor atacuri.Din fericire ,folosirea tagului pentru a include o imagine este mult mai periculos decat situatia cand ni se cere sa apasam un click deoarece, prima situatie necesita interventia noastra,pe cand cea de-a doua va fi executata imediat ce pagina se va incarca.
3. Cum arata un cod vulnerabil la atacurile CSRF?
if(utilizator_autentificat() && are_drepturi_de_acces())
{
sterge_informatii_confidentiale();
alterneaza_informatii_confidentiale();
}
else
{
refuza_conexiunea();
}
4. Cum reparam acest cod potential vulnerabil la atacurile CSRF?
4.1 Protejarea de atacurile CSRF folosind un token
Metoda clasica consta in crearea unei sesiuni si a unui token, care va fi verificat in momentul in care este actionata pagina respectiva.Daca respectivul token va fi valid, actiunile private vor fi executate,in caz contrar se va refuza accesul la acele actiuni.Pentru asta vom avea nevoie de sesiuni.Am reparat exemplul de mai sus si am propus un exemplu de functii pentru acesta.
if(utilizator_autentificat() && are_drepturi_de_acces())
{
if(getCSRFToken() != '' && $_GET['token'] == getCSRFToken())
{
sterge_informatii_confidentiale();
alterneaza_informatii_confidentiale();
removeCSRFToken();
}
else
{
buildCSRFToken();
echo 'Are you sure?
<a href="?argumente&token='.getCSRFToken().'">Yes</a>
<a href="?argumente">No</a> ';
}
}
else
{
refuza_conexiunea();
}
Functiile getCSRFToken(),removeCSRFToken(),buildCSRFToken().
function getCSRFToken()
{
$_SESSION['CSRF_SUBMIT_KEY'] = isset($_SESSION['CSRF_SUBMIT_KEY']) ? trim(htmlentities($_SESSION['CSRF_SUBMIT_KEY'],ENT_QUOTES)) : '';
if(strlen($_SESSION['CSRF_SUBMIT_KEY']) != strlen(md5(' ')))
$_SESSION['CSRF_SUBMIT_KEY'] = '';
return $_SESSION['CSRF_SUBMIT_KEY'];
}
function removeCSRFToken()
{
$_SESSION['CSRF_SUBMIT_KEY'] = '';
}
function buildCSRFToken()
{
$_SESSION['CSRF_SUBMIT_KEY'] = getCSRFToken();
if($_SESSION['CSRF_SUBMIT_KEY'] != '')
{
return $_SESSION['CSRF_SUBMIT_KEY'];
}
else
{
$_SESSION['CSRF_SUBMIT_KEY'] = md5(gmdate('D, d M Y H:i:s').md5(rand(1000000,999999999)).'SEC');
return getCSRFToken();
}
}
Aceasta metoda are unele neajunsuri, metoda putand fi depasita de un “sistem” care face “bypass” la sistemul de protectie implementat mai sus, folosind un iframe injectat in pagina ce extrage tokenul si trimite codul cu atacul de tip CSRF+tokenul extras.Aceasta metoda a fost prezentata de Nytro in articolul Using XSS to bypass CSRF protection, el avand nevoie de un XSS in acel website pentru a putea injecta iframe-ul.
4.2 Protejarea de atacurile CSRF folosind Captcha
Pentru a rezolva problema de mai sus,una dintre alternative este crearea unui sistem de captcha ce va simula aceleasi verificari ca mai sus.Pentru asta puteti studia implementarea unui sistem Captcha ce se bazeaza pe o operatie matematica intr-o pagina web scrisa pe WorldIT.
4.3 Protejarea de atacurile CSRF folosind un sistem de autentificare
Aceasta metoda este una ce ar trebui implementata doar in situatiile in care informatiile la care se face accesul sunt extrem de importante si nu trebuie sa fie accesibile sub nici o forma,avand o importanta ridicata.In cazurile acestea este indicat crearea unui sistem de autentificare ce functioneaza pe acelasi principiu ca la punctul 4.2, doar ca in loc de verificarea pe sesiuni se va face verificarea pe user/password.
4.4 Protejarea de atacurile CSRF folosind token stocat local
Parerea mea este ca una dintre cele mai bune metode de protejare impotriva atacurilor CSRF este cea a stocarii tokenului local,intr-o zona ce este protejata “somehow” de accesul publicului.Argumentele sunt evidente : hackerul nu poate avea acces la token sub nici o forma,noi creand un fisier cu ajutorul unui algoritm ce genereaza un hash unic bazat pe ip+browser+time, in care este precizat timpul cat este valid(cateva minute maxim). Aceasta situatie va rezolva majoritatea problemelor de “extragere” a informatiilor de prima metoda de protectie.Daca veti dori o implementare a acesteia, lasati un comentariu si in cel mai scurt timp voi veni si cu o implementare.In aceasta situatie singura problema ce se ridica este protejarea eficienta a folderului respectiv(probabil cu htaccess).
5. Alte resurse/documentatie privind atacurile CSRF si modalitati/implementari referitoare la protejarea impotriva acestora
Protect your website against CSRF attacks
Preventing CSRF and XSRF Attacks
Protection from cross-site request forgery attacks beaten
The Cross-Site Request Forgery (CSRF/XSRF) FAQ
Cross-site request forgery





Nou pe 


Comentarii la "Cum sa te protejezi de atacurile Cross-site request forgery(CSRF)?"
Bun articolul, ar fi ideal daca ar fi citit si de cei care se ocupa de facut site-uri.
Mersi Tudy, cred ca e unul din cele mai putin “interesante” atacuri in viziunea programatorilor web, atata timp cat nu vad imediat riscul la care sunt supusi prin aceste atacuri.
Eh, eu stiu doar ce-a insemnat o vulnerabilitate CSRF in cPanel care a stat unpatched mai bine de o luna dupa ce a fost facuta publica, deoarece cei de la cPanel au zis ca e feature, nu e bug.
Acum, cu acel feature, imagineaza-ti o gramada de clienti cu “my server haz been hacked, plz help!”
Un articol bun, felicitari. O sa incerc sa folosesc una dintre acele metode.
Multumesc dage. Prima metoda de protectie este deja gata de implementare, doar sa o adaugi in codul tau.Ultima, care este si cea mai sigura din multe puncte de vedere ce le-am si enumerat in mare parte si in articol nu, dar implementarea nu este dificila parerea mea.
Singurele lucruri de care trebuie tinut cont este atentia la “eliberarea” spatiului de lucru , caci fisierele trebuie sterse daca le-a expirat sesiunea, pentru a nu incarca serverul respectiv si cine stie, risti sa atingi limita de memorie ce o ai la dispozitie.
http://rstcenter.com/forum/17747-rst-folosire-xss-pentru-trece-de-protectia-csrf.rst
Salut Nytro,
De curiozitate ai citit articolul? Raspunsul tau nu da dovada ca ai fi facut-o.
Am citit si eu pe sarite, un rand da, zece nu, ca tot omu…
[...] asemenea, pentru cei interesati despre atacurile CSRF, pe blog am discutat recent despre cum ne putem proteja ca web developer de atacurile CSRF(XSRF).Acum avem si o dovada asupra impactului si riscurilor acestui gen de [...]
I want to quote your post in my blog. It can?
And you et an account on Twitter?
Yes you can quote my post on your blog, only if you let backlink to us.
I didn’t understand what you tried to say with “And you et an account on Twitter? “.
[...] vulnerabilitati de tipul CSRF. Despre acest tip de atac am discutat mai pe larg in articolul “Cum sa te protejezi de atacurile CSRF?“, atat despre impactul lor cat si de metodele de protectie impotriva [...]