Foaie de trucuri pentru prevenirea scripturilor pe site-uri încrucișate

github

Acest articol oferă un model simplu pozitiv pentru prevenirea utilizării corectă a codificării ieșirilor de către XSS. În timp ce există un număr mare de vectori de atac XSS, respectarea câtorva reguli simple se poate apăra complet împotriva acestui atac serios.

Acest articol nu explorează impactul tehnic sau de afaceri al XSS. Este suficient să spunem că poate duce la un atacator care câștigă capacitatea de a face orice poate face o victimă prin browserul său.

Atât XSS-ul reflectat, cât și cel stocat pot fi abordate prin efectuarea validării și codificării corespunzătoare pe partea serverului. XSS bazat pe DOM poate fi abordat cu un subset special de reguli descrise în foaia de trucuri pentru prevenirea XSS bazată pe DOM.

Pentru o foaie de cheats despre vectorii de atac în legătură cu XSS, vă rugăm să consultați Foaia de înșelăciune XSS Filter Evasion. Mai multe informații despre securitatea browserului și diferitele browsere pot fi găsite în Manualul de securitate al browserului.

Înainte de a citi această foaie de cheats, este important să înțelegeți fundamental teoria teorie a injecției.

Un model de prevenire XSS pozitiv

Acest articol tratează o pagină HTML ca un șablon, cu sloturi în care unui dezvoltator i se permite să pună date de încredere. Aceste sloturi acoperă marea majoritate a locurilor obișnuite în care un dezvoltator ar putea dori să pună date de încredere. Nu este permisă introducerea de date de încredere în alte locuri în HTML. Acesta este un model de „listă albă”, care neagă tot ceea ce nu este permis în mod specific.

Având în vedere modul în care browserele analizează HTML, fiecare dintre diferitele tipuri de sloturi are reguli de securitate ușor diferite. Când introduceți date de încredere în aceste sloturi, trebuie să luați anumite măsuri pentru a vă asigura că datele nu ies din acel slot într-un context care permite executarea codului. Într-un fel, această abordare tratează un document HTML ca o interogare de bază de date parametrizată - datele sunt păstrate în locuri specifice și sunt izolate de contexte de cod cu codificare.

Acest document stabilește cele mai comune tipuri de sloturi și regulile pentru introducerea în siguranță a datelor de încredere. Pe baza diverselor specificații, a vectorilor XSS cunoscuți și a unei mari teste manuale cu toate browserele populare, am stabilit că regulile propuse aici sunt sigure.

Sloturile sunt definite și sunt furnizate câteva exemple. Dezvoltatori NU AR TREBUI introduceți date în orice alte sloturi fără o analiză foarte atentă pentru a vă asigura că ceea ce fac este sigur. Analizarea browserului este extrem de dificilă și multe personaje inofensive pot fi semnificative în contextul potrivit.

De ce nu pot codifica doar entități HTML date de încredere

Codificarea entității HTML este în regulă pentru datele de încredere pe care le introduceți în corpul documentului HTML, cum ar fi în interiorul unui

REGULA # 3.1 - HTML Codificați valorile JSON într-un context HTML și citiți datele cu JSON.parse

Într-o lume Web 2.0, nevoia de a avea date generate dinamic de o aplicație într-un context JavaScript este obișnuită. O strategie este de a efectua un apel AJAX pentru a obține valorile, dar acest lucru nu este întotdeauna performant. Adesea, un bloc inițial de JSON este încărcat în pagină pentru a acționa ca un singur loc pentru a stoca mai multe valori. Aceste date sunt dificile, deși nu imposibile, de a codifica/scăpa corect fără a rupe formatul și conținutul valorilor.

Asigurați-vă că antetul Content-Type returnat este application/json și nu text/html . Aceasta va instrui browserul să nu înțeleagă greșit contextul și să execute scriptul injectat

Răspuns HTTP greșit:

Răspuns HTTP bun:

Un obisnuit anti-model s-ar vedea:

Următoarele fragmente de HTML demonstrează cum să redați în siguranță date care nu sunt de încredere într-o varietate de contexte diferite.

Atributele HTML sigure includ: align, alink, alt, bgcolor, border, cellpadding, cellpacing, class, color, cols, colspan, coords, dir, face, height, hspace, ismap, lang, marginheight, marginwidth, multiple, nohref, noresize, noshade, nowrap, ref, rel, rev, rânduri, rânduri, scrolling, formă, span, rezumat, tabindex, titlu, usemap, valign, valoare, vlink, vspace, lățime .

Rezumatul regulilor de codificare a ieșirii

Scopul codificării ieșirii (așa cum se referă la Cross Site Scripting) este de a converti intrarea de încredere într-un formular sigur în care intrarea este afișată ca date către utilizator fără a executa ca cod în browser. Următoarele diagrame detaliază o listă a metodelor critice de codificare a ieșirii necesare pentru a opri Cross Site Scripting.

Tip de codificare Mecanism de codificare
Codare entitate HTML Convertiți & în &, convertiți în, convertiți> în>, convertiți „în”, convertiți „în”, convertiți/în /
Codificare atribut HTML Cu excepția caracterelor alfanumerice, codificați toate caracterele cu entitatea HTML &#xHH; format, inclusiv spații. (XX = Valoare hexagonală)
Codare URL Codificare procentuală standard, vezi aici. Codificarea URL trebuie utilizată numai pentru codificarea valorilor parametrilor, nu întreaga adresă URL sau fragmentele de cale ale unei adrese URL.
Codificare JavaScript Cu excepția caracterelor alfanumerice, codificați toate caracterele cu formatul de codare \ uXXXX unicode (X = Întreg).
Codificare hexagonală CSS Codificarea CSS acceptă \ XX și \ XXXXXX. Utilizarea unei codificări de două caractere poate cauza probleme dacă următorul caracter continuă secvența de codificare. Există două soluții (a) Adăugați un spațiu după codificarea CSS (va fi ignorat de parserul CSS) (b) utilizați întreaga cantitate de codificare CSS posibilă prin completarea zero a valorii.

Foaie de trucuri XSS Attack:

Următorul articol descrie modul de exploatare a diferitelor tipuri de vulnerabilități XSS create de acest articol pentru a vă ajuta să evitați:

Descrierea vulnerabilităților XSS:

  • Articolul OWASP despre vulnerabilitățile XSS.

Discuție despre tipurile de vulnerabilități XSS:

Cum să examinați codul pentru vulnerabilitățile de scripturi între site-uri:

Cum să testați vulnerabilitățile de scriptare între site-uri: