Articles

XSS vs CSRF

În această secțiune, vom explica diferențele dintre XSS și CSRF și vom discuta dacă token-urile CSRF pot ajuta la prevenirea atacurilor XSS.

Care este diferența dintre XSS și CSRF?

Cross-site scripting (sau XSS) permite unui atacator să execute JavaScript arbitrar în browserul unui utilizator victimă.

Cross-site request forgery (sau CSRF) permite unui atacator să inducă un utilizator victimă să efectueze acțiuni pe care acesta nu intenționează să le facă.

Consecințele vulnerabilităților XSS sunt, în general, mai grave decât în cazul vulnerabilităților CSRF:

  • CSRF se aplică adesea doar unui subset de acțiuni pe care un utilizator este capabil să le efectueze. Multe aplicații implementează apărări CSRF în general, dar trec cu vederea una sau două acțiuni care sunt lăsate expuse. În schimb, o exploatare XSS reușită poate, în mod normal, să inducă un utilizator să efectueze orice acțiune pe care acesta este capabil să o efectueze, indiferent de funcționalitatea în care apare vulnerabilitatea.
  • CSRF poate fi descrisă ca o vulnerabilitate „unidirecțională”, în sensul că, în timp ce un atacator poate induce victima să emită o cerere HTTP, acesta nu poate prelua răspunsul de la acea cerere. În schimb, XSS este „bidirecțională”, în sensul că scriptul injectat de atacator poate emite cereri arbitrare, poate citi răspunsurile și poate exfiltra date către un domeniu extern ales de atacator.

Poate CSRF token-urile pot preveni atacurile XSS?

Unele atacuri XSS pot fi într-adevăr prevenite prin utilizarea eficientă a token-urilor CSRF. Luați în considerare o simplă vulnerabilitate XSS reflectată care poate fi exploatată în mod trivial astfel:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

Acum, să presupunem că funcția vulnerabilă include un token CSRF:

https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>

Presupunând că serverul validează corect simbolul CSRF și respinge cererile fără un simbol valid, atunci simbolul previne exploatarea vulnerabilității XSS. Indiciul aici se află în denumire: „cross-site scripting”, cel puțin în forma sa reflectată, implică o cerere cross-site. Împiedicând un atacator să falsifice o cerere cross-site, aplicația previne exploatarea trivială a vulnerabilității XSS.

Aici apar câteva avertismente importante:

  • Dacă o vulnerabilitate XSS reflectată există oriunde altundeva pe site, în cadrul unei funcții care nu este protejată de un token CSRF, atunci acel XSS poate fi exploatat în mod normal.
  • Dacă o vulnerabilitate XSS exploatabilă există oriunde pe un site, atunci vulnerabilitatea poate fi exploatată pentru a determina un utilizator victimă să efectueze acțiuni chiar dacă acele acțiuni sunt la rândul lor protejate de token-uri CSRF. În această situație, scriptul atacatorului poate solicita pagina relevantă pentru a obține un token CSRF valid și apoi poate utiliza tokenul pentru a efectua acțiunea protejată.
  • Token-urile CSRF nu protejează împotriva vulnerabilităților XSS stocate. Dacă o pagină care este protejată de un token CSRF este, de asemenea, punctul de ieșire pentru o vulnerabilitate XSS stocată, atunci acea vulnerabilitate XSS poate fi exploatată în mod obișnuit, iar sarcina utilă XSS se va executa atunci când un utilizator vizitează pagina respectivă.