Visualizza un'intestazione del referto HTTP non codificata vulnerabile a XSS?

5

Considera il seguente script PHP (potrebbe essere qualsiasi altra lingua, ho scelto PHP per semplicità):

<?php
echo $_SERVER['HTTP_REFERER'];
?>

È vulnerabile a XSS?

Naturalmente posso inviare una richiesta allo script usando curl e impostare il riferimento a qualcosa come <script>alert(document.cookie)</script> . Tuttavia, almeno alcuni browser sembrano codificare il referer, quindi se per esempio reindirizzo gli utenti a quello script dal seguente URL:

http://example.com/<script>alert(document.cookie)</script>

il browser codifica il referer e nel risultato lo script PHP emette questo:

http://example.com/%3Cscript%3Ealert(document.cookie)%3C/script%3E

Ci sono dei browser che non codificano il referer? In caso contrario, può essere sfruttato in altro modo?

    
posta Michał Perłakowski 06.06.2016 - 22:38
fonte

1 risposta

4

RFC

RFC 1945 - che cita per la prima volta l'intestazione del referer - specifica che i referenti devono essere codificati tramite URL:

Referer = "Referer" ":" ( absoluteURI | relativeURI )

absoluteURI = scheme ":" ( uchar | reserved )
[...]
uchar = unreserved | escape
unreserved = ALPHA | DIGIT | safe | extra | national
escape = "%" HEX HEX
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
extra = "!" | "
" | "'" | "(" | ")" | ","
safe = "$" | "-" | "_" | "."
unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">"

Le RFC più aggiornate come 7231 sono un po 'più difficili da leggere in quanto fanno riferimenti incrociati molto, ma non sembra che abbiano cambiato questa regola.

Quindi < , > e " devono essere codificati come URL, secondo le RFC rilevanti. Questo è sempre stato il caso, quindi anche i browser molto vecchi dovrebbero codificare l'URL.

Nota che ' non ha bisogno di essere codificato - e non è codificato dai browser moderni - e può quindi essere usato per attacchi XSS (ad esempio <a href='[REFERER]'>go back</a> ).

In pratica

Anche se le RFC specificano che < , > e " devono essere codificati come URL, è comunque una buona idea codificare il referer da soli per ogni evenienza.

I browser dovrebbero seguire le RFC - e in questo caso i principali browser come Chrome e Firefox - ma è comunque buona norma seguire sempre le migliori pratiche - ovvero la codifica - dalla tua parte nel caso in cui alcuni browser non lo facessero o nel caso le modifiche RFC in futuro (anche se è improbabile).

    
risposta data 06.06.2016 - 23:18
fonte

Leggi altre domande sui tag