Usando ASP clásico, ¿es esta la forma correcta de hacerlo para protegerse contra XSS?

4

Usando ASP clásico, ¿es esta la manera correcta de protegerse contra XSS?

var1=untrusteduserinput

Mostrando un texto en el cuerpo

<%=server.htmlencode(var1)%>

Mostrando un enlace en el cuerpo

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

Mostrando una imagen

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

Mostrando un iframe

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

Enmetaetiquetas

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

En formas

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

EDITAR: En el correo electrónico

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

EDIT 2: ¿Por qué http:// se convierte en %3A%2F%2F al usar urlencode en un enlace como este? Entonces el enlace no funciona.

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

EDIT 3:

Muchas gracias por sus respuestas! Sin embargo, no estoy seguro si entiendo este derecho. XSS es peligroso en la salida, en lo que está impreso en el sitio web para que otros puedan verlo, ¿verdad? Entonces, ¿pensé que ese era el hecho de que el enlace aparece como un enlace seleccionable que lo hace más peligroso? ¿Que alguien inyecte código malicioso que se ejecuta cuando alguien hace clic en el enlace? Y que fue por eso que tuve que usar urlencode en lugar de htmlencode.

Si tengo un enlace que alguien más ingresó en un formulario, ¿cómo puede estar seguro solo con HTMLencode? No sé si es un enlace dentro de mi propio sitio web o si se trata de un sitio web externo. En teoría, se puede ver exactamente como el enlace en mi primer ejemplo donde utilicé urlencode de una variable que era solo una parte del enlace.

Leí en este foro enlace sobre alguien que tiene un problema similar y, a partir de ese post, pensé que es muy peligroso y casi imposible protegerlo. ¿El XSS muestra una URL externa?

También pasé horas buscando en Google una expresión regular de asp clásica que pueda verificar que se trata de un enlace externo sin contenido peligroso pero que no pudo encontrar nada.

    
pregunta ASP XXS 07.12.2014 - 12:03
fuente

2 respuestas

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

Aquí está, aquí, inyectando contenido en un componente de URL, dentro de HTML. Entonces, en principio, lo correcto sería codificar con URL la variable, y luego codificar con HTML la salida de eso:

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

Sin embargo, en realidad, la forma más corta con solo URLEncode todavía es segura porque da la casualidad de que la salida de URLEncode nunca produce ningún carácter que sea especial en HTML. Así que eso está bien.

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

Hay un problema menor en este caso, pero no uno que cause XSS: el método Classic ASP URLEncode trata el carácter de espacio especialmente, codificándolo como + . Esta es una forma corta que solo funciona en cadenas de consulta; para partes de ruta, un espacio debe escribirse como %20 ; un plus solo significa un plus, por lo que si tiene un nombre de archivo con un espacio en blanco, esto no se vinculará correctamente.

Algunas plataformas siempre codifican para %20 y algunas tienen opciones o diferentes métodos para producir componentes codificados en URL para usar en una ruta (por ejemplo, en PHP, rawurlencode ). Desafortunadamente, ASP clásico no hace ninguna de estas dos cosas, así que si necesita hacerlo correctamente, debe definir su propia función que hace URLEncode y luego reemplaza + con %20 manualmente.

(Aparte: tiene comillas inteligentes en todo su código. Probablemente sea un artefacto de copiar y pegar a través de un procesador de textos, pero si realmente los usara en su fuente, muchas cosas se romperían).

    
respondido por el bobince 08.12.2014 - 16:10
fuente
1

Correcto, aunque técnicamente debería codificar la URL, luego codificar HTML para la salida a una página HTML. Sin embargo, la URL de la función de codificación de la URL de ASP codifica los caracteres necesarios para evitar que la salida se escape del contexto del atributo HTML y tampoco genera ningún carácter que deba estar codificado en HTML.

Al mostrar una imagen, también validaría var1 para garantizar que sea una ruta de imagen válida que exista en su servidor. Para la validación, incluya en la lista blanca los caracteres que está permitiendo, por ejemplo, alfanuméricos solo para el nombre de archivo antes de la extensión, y que termina en una extensión permitida (por ejemplo, .jpg ). Esto evitará que un usuario haga que su página llame a algo que no debería (por ejemplo, ../Logout.asp ) cuando otros usuarios solicitan la imagen. Si se deja sin validar, esto no supondría una vulnerabilidad XSS ya que el script no se puede incrustar, sin embargo, podría permitir que se ejecute una vulnerabilidad de falsificación de solicitud utilizando su propio sitio. La validación puede tener lugar en el punto de entrada si confía en que ningún usuario o proceso pueda modificarla una vez almacenada. Si no confía en la fuente donde almacena la URL de la imagen, debe validar aquí en su lugar.

En respuesta a las ediciones:

  

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

Sí, esto es correcto.

  

¿Por qué http:// se convierte en %3A%2F%2F al usar urlencode en un enlace como este? Entonces el enlace no funciona.

     

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

Si var1 ya es una URL bien formada, solo necesita htmlencode aquí. La URL debe validarse para verificar que cumple con RFC 3986 , y debe verificar que el protocolo sea HTTP o HTTPS para evitar que se inserten javascript: enlaces.

    
respondido por el SilverlightFox 07.12.2014 - 17:17
fuente

Lea otras preguntas en las etiquetas