Este XSS bazat pe Dom încă o problemă de securitate valabilă în browserele moderne? (Securitatea informațiilor, Browser Web, Xss, Dom)

Ilya Chernomordik a intrebat.
a intrebat.

Încerc să înțeleg cum funcționează DOM based XSS, de exemplu, din această postare, am reușit să o reproduc în IE11, dar, de exemplu, Chrome și Firefox sunt imune cel puțin împotriva acestui exemplu exact.

Ceea ce se întâmplă este că document.baseURI și obiectele similare returnează un șir de caractere care este codificat, așa că, dacă nu scrii explicit cod pentru a-l decoda înapoi sau ceva de genul acesta, nu văd cum poate fi abuzat.

Există și alte exemple la care browserele moderne sunt încă vulnerabile? Nu am reușit să găsesc niciunul, deoarece aproape toate exemplele de pe web indică o vulnerabilitate similară.

P.S. Esența exemplului este de a forma o interogare hashbang cu injecție:

http://victim/displayHelp.php?title=FAQ#<script>alert('Hello')</script>

Comentarii

  • Acesta este un mod distractiv de a exersa înțelegerea atacurilor xss: alf.nu/alert1 –  > Por JosiahDaniels.
1 răspunsuri
tim

Da, XSS bazat pe DOM este încă o problemă. În timp ce unele probleme nu pot fi exploatate din cauza codificării URL-urilor, există o serie de situații în care codificarea URL-urilor nu va sta în calea exploatării.

Esența exemplului este de a forma o interogare hashbang cu injecție

Acesta este un exemplu, dar XSS-ul bazat pe DOM înglobează toate problemele XSS care rezultă din manipularea nesigură a datelor prin intermediul JavaScript.

Datele pot proveni din surse cum ar fi URL-ul, DOM-ul însuși, etc.

Cel mai elementar exemplu în care datele introduse de utilizator sunt, de exemplu, citite din location.search și procesată cu innerHTML sau .write nu va funcționa, într-adevăr, cu niciun browser actualizat, deoarece valoarea este codificată URL.

Dar XSS-ul bazat pe DOM cu surse diferite de location.search sau alte surse decât innerHTML vor funcționa în continuare și există în aplicații din lumea reală.

O listă incompletă de exemple cu surse și surse diferite poate fi găsită mai jos.

Sursă: URL

Un exemplu de vulnerabilitate XSS bazată pe DOM, în care datele de intrare ale utilizatorului provin din URL:

<html>
<body>
<script>
    url = new URLSearchParams(location.search);
    x = url.get('x');
    document.write(x);
</script>
</body>
</html>

Atac:

http://example.com/test.html?x=<script>alert(1)</script>

Sursa: DOM

Din experiența mea, aceasta este cea mai frecventă clasă de probleme XSS exploatabile bazate pe DOM.

Să presupunem o aplicație care codifică în mod corespunzător în HTML toate datele furnizate de utilizator care sunt inserate în codul HTML.

Totuși, aplicațiile vor citi adesea datele furnizate de utilizator din DOM și apoi le vor reintroduce într-un mod nesigur. De exemplu:

<html>
<body>
<input type="text" id="userinput" value="&quot;><img src=x onerror=alert(1)>">
<div id="output"></div>
<script>
    userinput = document.getElementById('userinput').value;
    output = document.getElementById('output');
    output.innerHTML = "Your input was: " + userinput;
</script>
</body>
</html>

Sink: Eval

Uneori, nu avem nevoie de " sau > pentru a obține XSS. Un exemplu ar fi intrarea utilizatorului care este transmisă către eval:

<html>
<body>
<script>
    x = window.location.hash.substr(1);
    eval("var myvar = '" + x + "'");
</script>
</body>
</html>

Atac:

http://example.com/test.html#';alert(1);x='

Sink: document.write

Un alt exemplu în care nu avem nevoie de " sau > și care funcționează cu document.write:

<html>
<body>
<script>
    x = window.location.hash.substr(1);
    document.write("<input type='text' value='" + x + "'");
</script>
</body>
</html>
</body>
</html>

Attack:

http://example.com/test.html#test'onmouseover='alert(1)

Comentarii

  • Mulțumesc mult pentru un răspuns foarte bun și cuprinzător! –  > Por Ilya Chernomordik.