Pagrindiniai web sistemų pažeidžiamumai Ir saugos būdai


5. CSRF atakos

 

CSRF (Cross-Site Request Forgery)[13] atakų metu kaip jaukas yra naudojamas nekaltai atrodantis puslapis, verčiantis autentifikuotos aukos naršyklę sąveikauti su pažeidžiama Web aplikacija. Pasisekusi CSRF ataka gali pažeisti vartotojo duomenis, vykdyti neautorizuotas operacijas, administratoriaus privilegijos atveju, net sudarkyti visą Web sistemą. Prieš nagrinėjant CSRF ataką reikia suprasti, kaip atrodo pažeidžiama Web užklausa. Paprastas tokios POST užklausos pavyzdys, kuomet autentifikuotas vartotojas perveda į kito vartotojo Bob sąskaitą 100 kreditų, gali atrodyti taip:

POST http://bank.com/transfer HTTP/1.1
…
Content-Length: 19;
acct=BOB;amount=100

Tarkime, kad įsilaužėlis pastebėjo, jog Web aplikacija leidžia vykdyti šią operaciją taip pat siunčiant ir GET užklausas. Tokiu atveju auką galima būtų suvilioti paspausti nuorodą, pvz:

<a href='http://bank.com/transfer?acct=ATTACKER&amount=10000>View my Pictures!</a>

Web aplikacijai šioje situacijoje draudžiant GET tipo užklausas, gali būti naudojama HTML forma su slaptais elementais, pvz:

<form action='http://bank.com' method='POST'>
<input type='hidden' name='acct' value='ATTACKER'>
<input type='hidden' name='amount' value='10000'>
</form>
<script>document.forms[0].submit();</script>

 

Žemiau pateiktas iliustruotas pavyzdys naudojant Damn Vulnerable Web App. Prisijungusiam vartotojui pateikiama slaptažodžio keitimo forma:

csrf1-dvwa

Slaptažodžiui pakeisti yra naudojama neapsaugota GET užklausa:

http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=abcd&password_conf=abcd&Change=Change

XSS pažeidžiamumų skyriuje pateiktame galime naudotis tokiu kodu:

<script>new Image().src='http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=abcd&password_conf=abcd&Change=Change';</script>

Rezultate išsaugoto XSS atveju šis naršyklės kodas sėkmingai pakeistų autentifikuoto vartotojo slaptažodį be jo žinios.

Saugantis nuo CSRF atakų, su kiekviena HTTP užklausa siūloma generuoti unikalų raktą, kuris gali būti perduodamas kaip slaptas formos elementas, kad vėliau būtų patikrintas serveryje[14]. Šiam raktui galioja tos pačios saugumo taisyklės kaip ir sesijos prieigos raktui (įsilaužėliui jį nuspėjus, apsauga yra nesunkiai apeinama).