Cómo prevenir XSS de url

2

Encontré una vulnerabilidad XSS que se explota agregando un ataque en los parámetros de la URL.

Por ejemplo, la URL original site.com/?s=login&m=forgotten
Y la URL de ataque site.com/?s=login&m=forgotten" onload=alert(966) bad="

Ahora me gustaría prevenir este ataque. ¿Alguien puede ayudarme?

    
pregunta Vishal 02.04.2014 - 16:35
fuente

2 respuestas

3

Desinfecte su entrada, escapando de los caracteres especiales HTML. En PHP, esto se hace con htmlspecialcharacters . Asegúrate de no proporcionar una marca que evite que htmlspecialcharacters evite el tipo de cita que utilizas.

Su problema es que su URL es http://example.com/?s=login&m=forgotten" onload=alert(966) bad=" , y su código PHP que probablemente sea algo como esto:

<?php
$var = $_GET['m'];  
echo '<a href="$var">something</a>';

pero en sustitución simple y recta con la entrada incorrecta se convierte en:

<a href="forgotten" onload=alert(966) bad=">something</a>';

El problema surge del " sin escapar. La función de sanitización de PHP htmlspecialcharacters cambiará el " a &quot; , por lo que con:

<?php
$var = htmlspecialcharacters($_GET['m']);  
echo '<a href="$var">something</a>';

el HTML representado será:

<a href="forgotten&quot; onload=alert(966) bad=&quot;">something</a>';

que su navegador interpretará como un enlace gigante a forgotten&quot; onload=alert(966) bad=&quot; , en lugar de una etiqueta html que contiene el atributo onload .

Personalmente, me alejaría de PHP y de un marco web que comienza con la seguridad en mente; por ejemplo, HTML automáticamente escapa todas las entradas de la base de datos y los parámetros de consulta en las plantillas (a menos que se indique específicamente lo contrario), realiza verificaciones de CSRF de manera predeterminada, usa parámetros de consulta, etc.

    
respondido por el dr jimbob 02.04.2014 - 18:36
fuente
0

Por prevención, ¿quieres decir una corrección de código, una regla de IDP, algo más? Suponiendo una corrección de código, ¿en qué idioma está escrito, en qué marco, etc.?

En general, lo que necesitaría hacer en el código es en todos los lugares donde los datos (especialmente provenientes de las aportaciones del usuario) se vuelven a escribir, que los datos se escapan correctamente en su contexto (ya sea HTML, URL, JavaScript, etc) de donde se está escribiendo.

Al observar su vector de ataque, parece que la cadena de consulta enviada se adjunta automáticamente a una etiqueta de anclaje generada. Si es así, la posible solución es analizar correctamente el contexto de la cadena de consulta en una colección de pares clave-valor y luego serializar correctamente la colección, o bien escapar de todos los caracteres que le permiten salir del contexto de valor de atributo de HTML. Dicho esto, realmente depende del contexto de cómo se escribe el código, dónde, qué, cómo, cuándo, etc. Entonces, su pregunta es un poco vaga para proporcionar una respuesta concreta.

    
respondido por el LB2 02.04.2014 - 16:58
fuente

Lea otras preguntas en las etiquetas