¿Cómo evitar que JS se ejecute cuando se pasa como un parámetro a la URL? (sin etiquetas de script)

0

Necesitaba evitar que ocurra un ataque XSS cuando la carga útil se inserta en la URL como un parámetro. En este caso, sin embargo, no hay etiquetas script . Esta es mi URL que causa un ataque XSS:

  

localhost / example / file.jsp? testParm1 = '); alert (1); (' & testParm2 = '); alert (1); ('

Cuando presioné Intro después de escribir esto en mi navegador, apareció un cuadro de diálogo de alerta que decía "1". Cuando hice clic en "Aceptar" en eso, apareció el cuadro de diálogo de alerta que decía "2".

Estoy usando JSP, así que en file.jsp, tomo los parámetros que pasé:

<%
   // Get url parameters
   String lTestParm1 = myObj.retrieveString( "testParm1" );
   String lTestParm2 = myObj.retrieveString( "testParm2" );
%>

Por lo general, para la prevención XSS, escaparía a los caracteres especiales, por lo que no ejecutaría lo que está en el parámetro como javascript (por ejemplo, si pongo testParm1=<script>alert('hey')</script> en la URL), pero no puedo hacer eso ya que hay no hay etiquetas script .

Ahora en la parte JS del código también en archivo.jsp:

<script language="JavaScript" type="text/javascript">

    var lWindow = popUp( '<%= lTestParm1 %>');    // I think it is happening here

    <custom_tag:If condition="<%= lTestParm2 == null %>">
        // Do something
    </custom_tag:If>
    <custom_tag:Else>
        window.location.replace( '<%= lTestParm2 %>' );    // And possibly here
    </custom_tag:Else>

</script>

Puse un par de comentarios junto a las 2 líneas donde creo que el problema es.

Para intentar detener este ataque XSS, reemplacé cada apóstrofe con 2 apóstrofes en la URL. Esto parece funcionar para este caso.

No pude encontrar ningún otro artículo / pregunta relacionado con este problema, pero sí encontré similitudes con las preguntas de reemplazo de apóstrofes de inyección SQL. Dijeron que todavía hay muchas maneras de superar el reemplazo de apóstrofes por sí mismo.

Aquí hay un enlace a una de las preguntas: enlace

Esto me hizo preguntarme si mi solución es suficiente, o si todavía hay formas de realizar un ataque XSS incluso con mi reemplazo de apóstrofe en su lugar.

    
pregunta Michael 10.07.2017 - 22:53
fuente

1 respuesta

1

Una buena manera de lidiar con esto sería reemplazar todos los caracteres especiales ( específicamente los siguientes 6 # / '(); ) con sus equivalentes de entidad de caracteres HTML. Aparecerá visualmente igual, pero javascript no lo reconocerá como ese personaje.

Los ejemplos principales.

  • & num; se convierte en & num;
  • / se convierte en & sol;
  • 'se convierte en & apos;
  • (se convierte en & lpar;
  • ) se convierte en & rpar;
  • ; se convierte en & semi;

Puede ver más referencias de HTML aquí: enlace

edit1: Además, filtre las versiones codificadas de la URL, ya que éstas se convertirán al equivalente ASCII al golpear el servidor, pero tal vez después de que las reemplace. Depende de cuando se valide. También debe limitar la longitud de la entrada, ya que esto puede hacer que XSS sea menos efectivo si accidentalmente deja pasar algo. Si es evitable, no refleje entradas en javascript.

edit2: Incluso podría obtener una biblioteca para codificar toda la cadena en los equivalentes de la entidad de caracteres HTML. Probablemente el más fácil.

    
respondido por el brainFog 11.07.2017 - 01:53
fuente

Lea otras preguntas en las etiquetas