Utilizzando l'ASP classico, è questo il modo giusto per proteggersi da XSS?

4

Usare l'ASP classico, è questo il modo giusto per proteggersi da XSS?

var1=untrusteduserinput

Mostra un testo nel corpo

<%=server.htmlencode(var1)%>

Mostra un collegamento nel corpo

<a href="http://www.example.com/page.asp?var1=<%=server.urlencode(var1)%>"><%=server.htmlencode(var1)%></a>

Mostrare un'immagine

<img src="http://www.example.com/images/<%=server.urlencode(var1)%>"alt="<%=server.htmlencode(var1)%>">

Mostra un iframe

<iframe src="http://www.example.com/page.asp?var1=<%=server.urlencode(var1)%>"></iframe>

Neimetatag

<metaname="description" content="<%=server.htmlencode(var1)%>">

Nei moduli

<input type="text" name="var1" value="<%=server.htmlencode(var1)%>">

EDIT: In e-mail

<a href="mailto:<%=server.urlencode(var1)%>">Email</a>

EDIT 2: Perché http:// diventa %3A%2F%2F quando si utilizza urlencode su un collegamento come questo? Quindi il link non funziona.

<a href=”<%=server.urlencode(var1)%>”><%=server.htmlencode(var1)%></a>

MODIFICA 3:

Grazie mille per le tue risposte! Tuttavia, non sono sicuro di aver capito bene. XSS è pericoloso in uscita, su cosa viene stampato sul sito Web in modo che altri possano vederlo, giusto? Quindi ho pensato che fosse il fatto che il link apparisse come un link cliccabile che lo rendesse più pericoloso? Che qualcuno inserisca codice dannoso che viene eseguito quando qualcuno fa clic sul link? E per questo motivo ho dovuto usare urlencode invece di htmlencode.

Se ho un link che qualcun altro ha inserito in un modulo, come può essere sicuro solo con HTMLencode? Non so se si tratta di un collegamento all'interno del mio sito Web o di un sito Web esterno. In teoria, può apparire esattamente come il link nel mio primo esempio in cui ho usato urlencode di una variabile che era solo una parte del collegamento.

ho letto in questo forum collegare di qualcuno che ha problema simile e da quel post ho pensato che è molto pericoloso e quasi impossibile proteggere agains XSS la visualizzazione di un URL esterno?

Ho anche trascorso ore googling per un regexp ASP classico che è in grado di verificare che si tratta di un link esterno senza contenuto pericoloso, ma non riusciva a trovare nulla.

    
posta ASP XXS 07.12.2014 - 12:03
fonte

2 risposte

3
<a href=”http://www.mypage.com/page.asp?var1=<%=server.urlencode(var1)%>”>

Qui stai iniettando il contenuto in un componente URL, all'interno di HTML. Quindi, in linea di principio, la cosa corretta da fare sarebbe la codifica URL della variabile, quindi codificare in HTML l'output di quello:

<a href="http://www.mypage.com/page.asp?var1=<%= Server.HTMLEncode(Server.URLEncode(var1)) %>">

Tuttavia, in realtà la forma più breve con solo URLEncode è ancora al sicuro perché succede che l'output di URLEncode non produce mai caratteri speciali in HTML. Quindi va bene.

<img src=”http://www.mypage.com/images/<%=server.urlencode(var1)%>”

C'è un problema minore in questo, ma non uno che causa XSS: il metodo Classic ASP URLEncode tratta specificamente il carattere dello spazio, codificandolo come + . Questa è una forma breve che funziona solo nelle stringhe di query; per le parti del percorso, uno spazio deve essere scritto come %20 ; un plus significa solo un plus, quindi se hai un nome file con uno spazio in, questo non verrà collegato correttamente.

Alcune piattaforme codificano sempre su %20 e alcune hanno opzioni o metodi diversi per produrre componenti con codifica URL da utilizzare in un percorso (ad es. in PHP, rawurlencode ). Sfortunatamente l'ASP classico non fa nessuna di queste cose, quindi se hai bisogno di farlo bene devi definire la tua funzione che fa URLEncode quindi sostituisce + con %20 manualmente.

(a parte: hai virgolette intelligenti per tutto il tuo codice. Questo è probabilmente solo un artefatto di copia-incolla attraverso un elaboratore di testi, ma se tu effettivamente li usassi nella tua sorgente molte cose si spezzerebbero.)

    
risposta data 08.12.2014 - 16:10
fonte
1

Correggere anche se tecnicamente dovresti codificare URL e quindi codificare HTML per l'output in una pagina HTML. Tuttavia, l'URL della funzione di codifica URL ASP codifica i caratteri richiesti per impedire l'escaping dell'output dal contesto dell'attributo HTML e inoltre non genera alcun carattere che dovrebbe essere codificato in HTML.

Quando mostri un'immagine, convaliderei anche var1 per assicurarti che sia un percorso immagine valido che esiste sul tuo server. Per la convalida, autorizzare i caratteri che si stanno autorizzando, ad esempio alfanumerici solo per il nome file prima dell'estensione e che termina in un'estensione consentita (ad esempio .jpg ). Ciò impedirà a un utente di chiamare la tua pagina qualcosa che non dovrebbe (ad esempio ../Logout.asp ) quando l'immagine viene richiesta da altri utenti. Se non viene convalidato, questo non porrà una vulnerabilità XSS in quanto non è possibile incorporare uno script, tuttavia potrebbe consentire l'esecuzione di una vulnerabilità legata alla falsificazione delle richieste utilizzando il proprio sito. La convalida può avvenire al punto di entrata se si ritiene che non possa essere modificata da alcun utente o processo una volta memorizzato. Se non ti fidi della fonte in cui memorizzi l'URL dell'immagine, allora dovresti invece convalidare qui.

In risposta alle modifiche:

<a href="mailto:<%=server.urlencode(var1)%>">Email</a>

Sì, questo è corretto.

Why does http:// become %3A%2F%2F when using urlencode on a link like this? Then the link doesn't work.

<a href=”<%=server.urlencode(var1)%>”><%=server.htmlencode(var1)%></a>

Se var1 è già un URL ben formato, devi solo htmlencode qui. L'URL deve essere convalidato per verificare che sia conforme a RFC 3986 , e dovresti controllare che il protocollo sia HTTP o HTTPS per impedire l'inserimento di javascript: link.

    
risposta data 07.12.2014 - 17:17
fonte

Leggi altre domande sui tag