encodeURIComponent in un attributo HTML non quotato

4

Il mio istinto è che quanto segue dovrebbe essere attaccabile:

$("<td><a href=somefile.php?url="+encodeURIComponent(somevar)+">Download Here</a></td>");

Al contrario di

$("<td><a href=\"somefile.php?url="+encodeURIComponent(somevar)+"\">Download Here</a></td>");

Per un attacco cross-site scripting se l'utente ha il controllo su somevar , tuttavia non riesco a trovare l'attacco specifico. Mi sbaglio?

    
posta David Mulder 27.08.2014 - 17:25
fonte

1 risposta

4

Da MDN :

encodeURIComponent escapes all characters except the following: alphabetic, decimal digits,

- _ . ! ~ * ' ( )

Normalmente si richiede un carattere di spazio per aggiungere un altro attributo (come onclick ), sfortunatamente questo sarà codificato come parte dell'URI.

Tuttavia, da foglio cheat di prevenzione XS (Cross Site Scripting) OWASP :

Unquoted attributes can be broken out of with many characters, including [space] % * + , - / ; < = > ^ and |

Quindi potresti provare i caratteri - o * per provare a creare un nuovo attributo.

es. imposta somevar su http://www.example.com-onclick=alert('xss') o http://www.example.com*onclick=alert('xss')

Il tuo chilometraggio può variare tra i browser e sfortunatamente = sarà ancora codificato come URL, quindi avrai anche quell'ostacolo da superare. Quindi, anche se il valore non è quotato né codificato correttamente, potrebbe non essere possibile trasformare questo difetto di codifica in un exploit XSS.

Il tuo secondo esempio è più sicuro, anche se il valore dovrebbe essere veramente codificato in HTML:

$("<td><a href=somefile.php?url=\""+htmlEscape(encodeURIComponent(somevar))+"\">Download Here</a></td>");

dove htmlEscape è: -

function htmlEscape(str) {
    return String(str)
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}
    
risposta data 28.08.2014 - 15:37
fonte

Leggi altre domande sui tag