¿Es esta una vulnerabilidad XSS?

7

Recientemente, mi empresa realizó una evaluación de seguridad en nuestro sitio web y se informó una vulnerabilidad XSS. A continuación se muestran los detalles de la vulnerabilidad informada:

Si un usuario accede a una URL como la que se muestra a continuación:

mysite.com/Secure/Account/Addresses.aspx/%32%35

Puedes encontrar lo siguiente cuando la página esté renderizada:

<script src="/Secure/Account/Addresses.aspx/25?_TSM_HiddenField_=ctl00_ContentPlaceHolder1_ScriptManager1_HiddenField&amp;_TSM_CombinedScripts_=%3b%3bAjaxControlTo.....{goes on for a while}" type = text/javascript"></script>
                                            ^ASCII characters here                                                                                                      ^truncating actual value for brevity's sake

Como puede ver, los códigos ASCII se convierten a sus valores de caracteres (2 y 5 en este caso) y se representan como parte de una etiqueta de script. Si cambio el %32%35 por diferentes valores, obtengo los resultados a continuación:

  1. %32%35%3E , que debería mostrarse como 25< , la página arroja un error 400
  2. %32%35%22 , que se debería representar como 25" , en realidad representa 25&quot;

Mi pregunta es si esto es realmente una vulnerabilidad XSS? Si es así, ¿qué carga útil podría pasarse para ejecutar un ataque?

    
pregunta Abe Miessler 30.06.2014 - 20:50
fuente

2 respuestas

9

En su cara, porque toma caracteres codificados y se maneja con el código de la página, se clasifica como una vulnerabilidad XSS. Esto no significa que sea una vulnerabilidad XSS para su sitio, pero es sospechoso.

En cuanto al proceso para determinar si existe un riesgo, debe hacer un poco de esfuerzo para ver cómo responde su sitio. Las opciones de fuzzing XSS abundan con una búsqueda.

    
respondido por el schroeder 30.06.2014 - 21:00
fuente
2

En sí mismo, el simple hecho de tener %32%35 descodificado a 25 en una URL no es un error ni un signo de vulnerabilidad. De hecho, es lo que RFC 3986, sección 2.3 dice que debería suceder ( énfasis mío):

  

2.3. Caracteres no reservados

     

Los caracteres que están permitidos en un URI pero que no tienen un propósito reservado se llaman no reservados. Estos incluyen letras mayúsculas y minúsculas, dígitos decimales, guiones, puntos, guiones bajos y tilde.

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
     Los URI

que difieren en la sustitución de un carácter no reservado por su octeto US-ASCII codificado en porcentaje correspondiente son equivalentes: identifican el mismo recurso. Sin embargo, las implementaciones de comparación de URI no siempre realizan la normalización antes de la comparación (consulte la Sección 6). Por coherencia, los octetos codificados en porcentaje en los rangos de ALFA (% 41-% 5A y% 61-% 7A), DÍGITO (% 30-% 39), guión (% 2D), período (% 2E), guión bajo (% 5F), o tilde (% 7E) no debe ser creado por los productores de URI y, cuando se encuentra en un URI, debe decodificarse a sus correspondientes caracteres no reservados por los normalizadores de URI.

De hecho, es muy posible que no sea tu aplicación la que decodifique esos caracteres, sino tu servidor web, que intenta normalizar las URL que recibe antes de pasarlas a tu aplicación.

Para saber si su aplicación (o servidor web) está decodificando demasiado , debe probarlo con caracteres que en realidad no deberían decodificarse de acuerdo con el estándar , y que podría tener un efecto real en el análisis de la URL o el HTML en el que está incrustado. Algunos de estos caracteres incluyen:

  • Los caracteres delimitadores de URL generales ( gen-delims en RFC 3986, sección 2.2), especialmente los caracteres ? ( %3F ) y # ( %23 ): nunca deben aparecer sin escape en la parte de la ruta de una URL.

  • Caracteres que no están permitidos en las URL en absoluto, como nuevas líneas ( %0A ), espacios ( %20 ), " ( %22 ), < ( %3C ), > ( %3E ), \ ( %5C ), ^ ( %5E ), ' ( %60 ), { ( %7B ), | ( %7C ) y } ( %7D ).

  • metacaracteres HTML, como & ( %26 ), ' ( %27 ), " ( %22 ), < ( %3C ) y > (% co_de) %): Si se decodifican de forma inapropiada (y no se reemplazan por las entidades de caracteres HTML correspondientes), se podría dañar el marcado HTML y potencialmente crear una vulnerabilidad de inyección / XSS de HTML.

    Tenga en cuenta que varios de estos ( %3E , " y < ) se encuentran en la lista de caracteres de URL prohibidos arriba y, por lo tanto, siempre deben estar codificados en porcentaje; los otros ( > y & ) pueden, y en algunos casos deben, aparecer en las URL sin el porcentaje de codificación, pero en tales casos deben estar codificados (especialmente ' ) como la entidad de caracteres HTML correspondiente (por ejemplo, & para &amp; ).

  • Un signo literal & , codificado como % , nunca debe decodificarse a su forma literal dentro de una URL; si es así, puede invalidar la URL o, peor aún, formar una secuencia de escape de porcentaje válida pero inesperada con los caracteres que la siguen. Si bien es poco probable que esto permita un ataque XSS directo, ciertamente es un error y podría abrir otras vulnerabilidades al permitir que una entrada maliciosa pase la validación.

En particular, la prueba en la que observó que %25 fue reemplazado por la entidad HTML %22 sugiere que a) allí hay alguna decodificación inapropiada (o una recodificación insuficiente) en curso, aún b) la URL, aunque estrictamente hablando no es válida, se está correctamente escapada de HTML, que debería evitar que corrompa el formato HTML de manera que permita un ataque XSS.

    
respondido por el Ilmari Karonen 01.07.2014 - 00:29
fuente

Lea otras preguntas en las etiquetas