¿Por qué es peligroso permitir todos los caracteres en una URL?

4

Al revisar la configuración de CodeIgniter, vi la siguiente línea:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

Y la documentación que dice:

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| The configured value is actually a regular expression character group
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/

Sin embargo, no estaba del todo claro, que pueden existir efectos o problemas de seguridad para permitir que todos los caracteres en una url.

¿Qué problemas pueden generar esta situación?

    
pregunta Juan Pinzón 10.08.2016 - 18:56
fuente

2 respuestas

3

Limitar el conjunto de caracteres de esta manera (también llamada lista blanca) es uno de los métodos recomendados para validación de entrada . El propósito de la validación de entrada es evitar que un programa se ejecute en datos que pueden causar problemas no deseados.

Hay muchos ataques exitosos que han resultado de URL mal formadas (no son URL de ataques reales, sino representativas de ataques):

  • inyección de ruta de archivo: http://example.com/?C:\documents\top_secrets.txt
  • desbordamiento de búfer: http://example.com/aaaaaaaaaaaaaaaaaaaaaaaaa...aaaEvilShellCode
  • inyección de script: http://example.com/?<script>alert("Click me!")</script>
  • inyección SQL: http://example.com/?USER=' or 1=1; select * from users

Las reacciones iniciales a estos ataques fueron prohibir el carácter de barra diagonal inversa, las comillas, los asteriscos y los símbolos menor que y mayor. Esto se llama lista negra; desafortunadamente, las listas negras son principalmente un enfoque de "parche después de aprender sobre el ataque". La lista blanca es algo más efectiva que la lista negra. Sin embargo, limitar los caracteres que aparecen en una URL puede no hacer prácticamente nada para evitar muchos de estos ataques si se pueden omitir todos usando el porcentaje codificación , que permite al atacante usar solo caracteres de la lista blanca aprobada:% 2F es lo mismo que un /, etc.

Para que sea efectivo, la expresión regular en CodeIgniter debe realizarse después de que se haya descodificado el porcentaje de codificación. Y para evitar problemas de desbordamiento del búfer mientras se prueban los datos con regexp, el primer paso del validador debe ser la verificación de la longitud.

Hay otro problema que podrían estar intentando evitar con su lista blanca, y es secuestro de URL usando Caracteres Unicode para simular caracteres ASCII . Para un humano que simplemente hace clic en un enlace, las cadenas "exampleZurichBank.com" y "exampleZuricⱨBank.com parecen similares. Bloquear los caracteres Unicode que no están en el rango [AZ] [az] ayuda a prevenirlos; también anula un gran segmento del planeta mediante el bloqueo de URL en sus alfabetos nativos.

Tenga en cuenta que la validación de entrada es solo una de las medidas preventivas de muchas que aún deben implementarse. Las aplicaciones aún deben defenderse contra otras vulnerabilidades comunes, como XSS, CSRF, inyección de SQL, secuestro de sesión, etc.

    
respondido por el John Deters 11.08.2016 - 17:22
fuente
1

Si postula que todo el código que se ejecuta en su servidor analiza correctamente las URL y las codifica al realizar búsquedas en el sistema de archivos, al incluirlas en las consultas de la base de datos, al pasarlas a comandos de shell, etc., y que el código es totalmente consistente cuando considera que las cadenas son iguales (por ejemplo, codificación de porcentaje de URL, sensibilidad a mayúsculas y minúsculas, codificaciones que no son ASCII, normalización de Unicode, ...), no hay ningún daño en permitir que cualquier carácter en las URL.

¿Pero qué tan seguro está de que todo el código que está ejecutando es perfectamente seguro y consistente?

Reducir el conjunto de caracteres permitidos reduce el potencial de vulnerabilidades. Por ejemplo, si tiene código que construye consultas SQL inyectando directamente partes de la URL como sprintf("select where name = '%s'", url.param[1]) , pero las URL no pueden contener ' ni %27 , entonces esta vulnerabilidad de inyección SQL no puede ser realmente explotado.

    
respondido por el Gilles 11.08.2016 - 02:30
fuente

Lea otras preguntas en las etiquetas