Articles

DOM based Cross Site Scripting

Posted on

tehnica XSS mai puțin cunoscută

  • DOM înseamnă Document Object Model
  • XSS înseamnă Cross-site scripting
  • principala diferență între XSS bazat pe DOM și alte vulnerabilități XSS este că sarcina utilă este încorporată pe partea clientului, mai degrabă decât pe partea serverului
  • vulnerabilitățile XSS bazate pe DOM trebuie, prin urmare, să fie prevenite

mai întâi vulnerabilitățile de scriptare pe mai multe site-uri (XSS) a devenit cunoscut prin CERT Advisory ca-2000-02 (etichete HTML rău intenționate încorporate în solicitările Web ale clienților), deși aceste vulnerabilități au fost exploatate înainte. Deci, XSS a fost deja în jur de ceva timp. Și, după cum v – ați aștepta, au existat deja o serie de articole Labs pe această temă, inclusiv Cross Site Scripting-pericolul subestimat și Cross-Site – Scripting și prevenirea Script Injection-un scurt ghid. Cu toate acestea, acest articol se concentrează în mare parte pe DOM bazat cross-site scripting, un termen inventat pentru prima dată în 2005 de Amit Klein. El a publicat definiția scripting cross-site bazat pe DOM (XSS) și a delimitat-o de alte vulnerabilități de scripting cross-site. Pentru a înțelege DOM bazate pe cross-site scripting, trebuie mai întâi o înțelegere mai profundă a DOM.

ce este DOM?

Modelul obiectului documentului este o interfață de program care definește structura documentelor. Ceea ce este relevant pentru scopurile noastre este că DOM prevede reprezentarea orientată pe obiecte a documentelor HTML, în special:

  • cum este reprezentat un element HTML ca obiect
  • care sunt atributele unui element HTML
  • ce metode pot fi utilizate pentru a accesa un element HTML
  • care sunt evenimentele unui element HTML

aceasta înseamnă că DOM specifică modul în care elementele HTML pot fi găsite, adăugate, modificate sau șterse în browser. Asta înseamnă că DOM oferă o oportunitate pentru manipularea paginilor HTML. Aceste zile, JavaScript este de obicei folosit pentru acest tip de manipulare.

trebuie remarcat faptul că fiecare browser implementează standardul DOM diferit. Acest lucru poate afecta dacă un anumit atac DOM XSS funcționează într-un anumit browser.

ce este XSS bazat pe DOM?

o vulnerabilitate XSS bazată pe DOM apare atunci când DOM este utilizat pentru a genera conținut dinamic care conține intrări de utilizator care pot fi procesate fără verificare. Acest tip de atac este efectuat cu JavaScript în browserul utilizatorului. Aici locațiile pe care intrarea utilizatorului (rău intenționată) le aduce în DOM sunt desemnate ca sursă. Locațiile în care pot fi executate intrări de utilizator (rău intenționate) în DOM sunt desemnate ca sink.

un exemplu de vulnerabilitate simplă de scriptare între site-uri:

<!DOCTYPE html><html> <body> <script> var source = "Hello " + decodeURIComponent(location.hash.split("#")); //Source var divElement = document.createElement("div"); divElement.innerHTML = source; //Sink document.body.appendChild(divElement); </script> </body></html>

vulnerabilitatea poate fi declanșată, de exemplu, cu următoarea solicitare GET:

GET www.vulnerable-website.example#<img src="test" onerror="alert('XSS')">

putem vedea că acest exemplu este necesar folosind metoda decodeURIComponent. Acest lucru se datorează faptului că browserele moderne codifică caractere speciale în URL și atacul nu ar funcționa fără ca aceste caractere speciale să fie decodificate. Conținutul variabilei source este adăugat la elementul div folosind innerHTML. Acesta este elementul problematic din cod, deoarece atribuirea sa la innerHTML face ca valoarea inclusă cu acesta să fie interpretată ca HTML. Dacă valoarea conține JavaScript, aceasta este executată și ea.

trebuie subliniat faptul că acest lucru nu modifică răspunsul serverului. Modificarea rău intenționată apare numai atunci când codul JavaScript este executat pe partea clientului, pe care DOM îl modifică ulterior.

cele mai cunoscute surse și chiuvete sunt enumerate mai jos. Trebuie remarcat faptul că aceasta nu este în niciun caz o listă exhaustivă.

surse

  • document.URL
  • document.referrer
  • locație
  • locație.href
  • locație.căutare
  • locație.hash
  • locație.nume de cale

Chiuvete

  • eval
  • setTimeout
  • setInterval
  • document.scrie
  • element.innerHTML

prevenirea XSS bazat pe DOM

deoarece există cazuri în care sarcina utilă nu ajunge niciodată la server, prevenirea acestei vulnerabilități nu este o sarcină pentru partea serverului. Exemplul de mai sus este un astfel de caz. Motivul este că conținutul care apare după un caracter # nu este trimis de browser către server.

prima și cea mai importantă recomandare este de a evita utilizarea datelor controlate de utilizator pentru generarea dinamică de conținut ori de câte ori este posibil. Dacă acest lucru este complet inevitabil, cel mai bun mod de a preveni XSS bazat pe DOM este să utilizați metode de ieșire securizate (sink) care împiedică executarea oricărui cod încorporat cu rea intenție. În fragmentul de cod de mai sus, singura modalitate de a face codul sigur este înlocuirea .innerHTML cu .textContent. Acest lucru se datorează faptului că – spre deosebire de innerHtml – elementele HTML din metoda textContent nu sunt executate.

DOM bazat XSS prevenirea Cheat Sheet de la OWASP are o multime de sfaturi utile pentru dezvoltarea de site-uri web dinamice sigure cu JavaScript. Acolo veți găsi, de asemenea, descrieri ale codificării dependente de context, care este necesară ori de câte ori este imposibil să treceți la o metodă de ieșire sigură.

diferențe față de alte vulnerabilități XSS

cea mai importantă diferență este locul în care atacul este încorporat în cod. Spre deosebire de alte vulnerabilități de scriptare între site-uri, codul nu este încorporat pe partea serverului, ci mai degrabă pe partea clientului. Aceasta înseamnă că sarcina utilă nu poate fi găsită în codul de răspuns. Prin urmare, vulnerabilitățile XSS bazate pe DOM pot fi detectate numai în timpul rulării sau verificând DOM-ul site-ului web.

în majoritatea cazurilor, găsirea vulnerabilităților XSS bazate pe DOM nu este o problemă ușoară. O abordare utilă care utilizează abordarea de analiză a codului static este descrisă în articolul Burp based-xss.

despre autor

Andrea Hauser

Andrea Hauser a absolvit o diplomă de licență FHO în tehnologia informației la Universitatea de științe Aplicate Rapperswil. Ea își concentrează activitatea ofensivă pe testarea securității aplicațiilor web și realizarea campaniilor de inginerie socială. Accentul ei de cercetare este crearea și analizarea deepfakes. (ORCID 0000-0002-5161-8658)

link-uri

  • http://www.webappsec.org/projects/articles/071105.html
  • https://support.portswigger.net/customer/portal/articles/2325926-using-burp-scanner-to-test-for-dom
  • https://www.cert.org/historical/advisories/CA-2000-02.cfm
  • https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
  • https://www.w3.org/DOM/

Lasă un răspuns

Adresa ta de email nu va fi publicată.