¿Es peligroso habilitar el doble escape?

136

Tengo una aplicación ASP.NET MVC con una ruta que permite buscar cosas a través de / search / <searchterm>.

Cuando proporciono "search / abc" funciona bien, pero cuando proporciono "/ search / a + b + c" (codificado correctamente en URL), IIS7 rechaza la solicitud con el error HTTP 404.11 ( el módulo de filtrado de solicitudes está configurado para denegar un solicitud que contiene una secuencia de escape doble ). En primer lugar, ¿por qué hace esto? Solo parece arrojar el error si es parte de la URL, pero no como parte de una cadena de consulta (/ transmit? Q = a + b + c funciona bien).

Ahora podría habilitar las solicitudes de doble escape en la sección de seguridad de mi web.config, pero dudo en hacerlo, ya que no entiendo las implicaciones, y tampoco por qué el servidor rechazaría la solicitud "a + b + c" como parte de la URL pero aceptar como parte de una cadena de consulta.

¿Alguien puede explicar y dar algún consejo qué hacer?

Alex
fuente
77
También probé la opción posiblemente más correcta de llamar a Server.Url Path Encode y terminé con /search/a%2520b%2520cel marcado que condujo a un error encantador "Se detectó un valor Request.Path potencialmente peligroso del cliente (%)". No puedes ganar parece.
Zhaph - Ben Duguid

Respuestas:

158

Editar: Se agregó énfasis a las secciones relevantes.

Básicamente: IIS está siendo excesivamente paranoico. Puede deshabilitar esta verificación de forma segura si no está haciendo nada particularmente imprudente con los datos decodificados uri (como generar URI del sistema de archivos local a través de la concatenación de cadenas).

Para deshabilitar la verificación, haga lo siguiente (desde aquí ): (vea mi comentario a continuación para saber qué implica el doble escape).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Si el símbolo de suma es un carácter válido en una entrada de búsqueda, usted necesita para permitir "allowDoubleEscaping" para permitir IIS para procesar dicha entrada del camino de la URI.

Finalmente, una solución muy simple, aunque limitada, es simplemente evitar '+' y usar '% 20' en su lugar. En cualquier caso, usar el símbolo '+' para codificar un espacio no es una codificación de URL válida , sino que es específica de un conjunto limitado de protocolos y probablemente sea ampliamente compatible por razones de compatibilidad con versiones anteriores. Aunque solo sea para fines de canonicalización, es mejor codificar espacios como '% 20' de todos modos; y esto evita el problema de IIS7 (que aún puede surgir para otras secuencias, como% 25ab).

Eamon Nerbonne
fuente
3
Deshabilitaría el cheque. Es una molestia y no proporciona seguridad adicional para la mayoría de las aplicaciones.
Eamon Nerbonne
3
¿Tiene un enlace / referencia de que es bastante seguro deshabilitar el doble escape? Además, ¿qué impide exactamente que ocurra esta medida de seguridad?
Alex
15
Si una uri tiene doble escape, entonces los componentes de la uri sin escapar pueden contener caracteres reservados y, por lo tanto, (partes de) la uri sin escapar puede ser una uri válida. En resumen, si usa la cadena de uri sin escape para construir nuevos uri, en particular rutas de sistema de archivos, y no logra escapar correctamente de la nueva ruta, puede permitir la inyección de ruta. La inyección de ruta podría permitir a un atacante engañar a su programa para que procese datos que no debería, o para confundirlo y hacer que piensen que dos uri son diferentes cuando en realidad son idénticos pero simplemente codificados de manera diferente.
Eamon Nerbonne
44
@Stijn: Sí: eso es seguro . Todo lo que hace esta verificación es filtrar las solicitudes que posiblemente podrían ser malinterpretadas por un código defectuoso (especialmente si decodifica o construye dos Uri a través de string-concat y sin la codificación adecuada). No está haciendo ningún tipo de procesamiento, por lo que es bastante seguro de su parte. Cualquier error necesitaría estar en el archivo básico que sirve el código de IIS, y creo que podemos asumir con seguridad que ha sido probado muy, muy a fondo por ahora. Una vez más, esta verificación no es nada sofisticada, solo se rescata de cosas que podrían decodificarse y luego parecer una uri codificada .
Eamon Nerbonne
2

Solo me gustaría agregar información a la respuesta de Eamon Nerbonne relacionada con la parte " qué hacer " de su pregunta (sin explicar los porqués).
También puede cambiar fácilmente la configuración de una aplicación en particular con

  1. abrir la consola con derechos de administrador (Inicio - cmd - clic derecho, Ejecutar como administrador)
  2. escribiendo lo siguiente (tomado de aquí: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (por ejemplo, se puede sustituir YOURSITENAMEcon Default Web Sitepara aplicar esta regla a la página web por defecto)

  3. Entra, listo.

Un ejemplo:

  1. en primer lugar tuve el mismo problema: Error HTTP 404.11: el módulo de filtrado de solicitudes está configurado para denegar una solicitud que contiene una secuencia de escape doble.
  2. Escribiendo el texto mencionado anteriormente: Drupal7-otro Solución al error HTTP 404.11: el módulo de filtrado de solicitudes está configurado para denegar una solicitud que contiene una secuencia de escape doble.
  3. Ahora funciona como se esperaba: Solución al error HTTP 404.11: el módulo de filtrado de solicitudes está configurado para denegar una solicitud que contiene una secuencia de escape doble.
Sk8erPeter
fuente
1

¿Has pensado en tener la URL de búsqueda como '/ search / a / b / c'?

Tendría que configurar una ruta como

search/{*path}

Y luego extraiga los valores de búsqueda de su cadena de ruta en la acción.

HTHs
Charles

Charlino
fuente
El problema es que otros caracteres codificados en URL (incluido '/') podrían ser parte de la búsqueda.
Alex
¿No podría codificar todos los '/' que realmente forman parte de la búsqueda en '% 2F'?
Charlino
0

Me encontré con esto en IIS 7.5 haciendo un Server.TransferRequest () en una aplicación.

Codificar el nombre del archivo causó el problema de doble escape, pero si no lo codifico, me encontraría con el error "Solicitud de ruta potencialmente peligrosa" .

Al poner un protocolo cualquiera, incluso uno vacío, en la URL que paso al Servidor.TranferRequest () solucionó el problema.

No funciona:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Trabajos:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
mhenry1384
fuente