Protectia impotriva vulnerabilitatii CSRF

Post Title

       

       Daca tot am scris despre protectia SQLI si XSS acum a venit randul altei vulnerabilitati des intalnite si anume CSRF (Cross Site Request Forgery). Aceasta vulnerabilitate se bazeaza pe faptul ca aplicatia voastra nu face suficiente verificari cand vine vorba de manipularea datelor, iar asta poate duce la distrugerea intregii aplicatii sau chiar la un deface, probabil nu ati inteles prea multe dar cu urmatorul exemplu o sa va dati seama ce periculoasa e vulnerabilitatea, sa zicem ca avem o functie care adauga un admin, iar din GET primesc username-ul care va fi admin, codul poate arata astfel 

 

  1.  
  2. <?php
  3.  
  4. //....cod
  5.  
  6. function add_admin($username) {
  7. global $perm;
  8.  
  9. if(!isset($perm['add_admin'])) {return false;}
  10.  
  11. //...cod de inserare
  12.  
  13. return true;
  14.  
  15. }
  16.  
  17. ?>
  18.  

dupa cum ati observat se  face verificare daca userul are permisiune de a adauga admin, deci nimeni inafara de userul cu acea permisiune nu poate adauga un nou admin, dar nici nu e nevoie caci atacatorul isi stie username-ul si stie si patchul de adaugare al unui nou admin si anume:

  1.  
  2. admin.php?action=add_admin&username=atacator

Este adevarat ca el nu poate rula acel url insa voi ca admini o puteti face, daca el va pune url-ul de mai sus intr-un iframe si voi o sa dati click acolo, cine credeti  voi ca va adimin in aplicatia voastra, probabil o sa ziceti ca implica ca userul sa stie url-ul, da e adevarat insa sunt n cazuri in care dupa o scanare cineva a intuit url-ul, nu e neaparat sa "fure" admin, poate sterge articole, poate da ban utilizatorilor si multe altele.

Acum ca v-am lamurit ca aceasta vulnerabilitate este una "urata", o sa prezint mai jos o modalitate de protectie si anume :

  • Token-uri imprevizibile 

Sa zicem ca dupa url-ul de mai sus am adauga si un prametru token iar acesta ar arata astfel  : 

  1.  
  2. admin.php?action=add_admin&username=atacator&token=9043kjso958473_0

iar in functia nostra am verifica astfel  

  1.  
  2. <?php
  3.  
  4. //....cod
  5.  
  6. function add_admin($username,$token) {
  7. global $perm;
  8.  
  9. if(!isset($perm['add_admin']) && $token== $perm['token']) {return false;}
  10.  
  11. //...cod de inserare
  12.  
  13. return true;
  14.  
  15. }
  16.  
  17. ?>

Tokenul nostru este individual pentru fiecare utilizator si se regenereaza la fiecare sesiune, asta insemna ca atacatorul nu are de unde sa il afle, tokenul pus de el va fi diferit de al vostru asa ca atacul este inutil.

Asta nu e tot, pentru a fi 100% siguri ca totul e "safe" din punctul de vedere al unui programator, nu folositi GET, verificati de fiecare data  HTTP_REFERER sa fie site-ul vostru (daca nu e opriti actiunea) si cel mai important e ca aplicatia voastra nu trebuie sa fi vulnerabila la XSS, altfel tot ce am zis mai sus e inutil, cu o vulnerabilitate xss se poate trece de protectia CSRF, nu o sa intru in detalii, dar daca o sa vreti o sa va las comentarii daca e cineva interesat.

 

Cam atat despre aceasta vulnerabilitate bafta la scris cod cat mai "curat"

Autor articol

Ştiinţa fără religie este şchioapă, religia fără ştiinţă este oarbă (Albert Einstein)

Articolul urmator


Acest articol nu este comentat, fii primul care o face

Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top