Articulo de referencia

Doble codificación

La doble codificación consiste en codificar datos dos veces seguidas utilizando el mismo esquema de codificación. Generalmente se emplea como técnica de ataque para eludir esque...

La doble codificación consiste en codificar datos dos veces seguidas utilizando el mismo esquema de codificación. Generalmente se emplea como técnica de ataque para eludir esquemas de autorización o filtros de seguridad que interceptan la entrada del usuario. En los ataques de doble codificación contra filtros de seguridad, los caracteres de la carga útil que estos filtros consideran ilegales se reemplazan por su forma doblemente codificada.

La codificación URI doble es un tipo especial de codificación doble en la que los datos se codifican como URI dos veces seguidas. Se ha utilizado para eludir esquemas de autorización y filtros de seguridad contra la inyección de código , el recorrido de directorios , el cross-site scripting (XSS) y la inyección SQL .

Descripción

En la doble codificación, los datos se codifican dos veces seguidas utilizando el mismo esquema de codificación; es decir, la forma de datos doblemente codificados Xes Encode(Encode(X))donde Encodees una función de codificación. [ 1 ]

La doble codificación se utiliza habitualmente como técnica de ataque para eludir los esquemas de autorización o los filtros de seguridad que interceptan la entrada del usuario. [ 2 ] En los ataques de doble codificación contra filtros de seguridad, los caracteres de la carga útil que son tratados como ilegales por dichos filtros se reemplazan por su forma doblemente codificada. [ 3 ] Los filtros de seguridad pueden tratar los datos Xy su forma codificada como ilegales. [ 4 ] Sin embargo, todavía es posible que Encode(Encode(X)), que es la forma doblemente codificada de los datos X, no sea tratada como ilegal por los filtros de seguridad y, por lo tanto, los atraviese, pero posteriormente, el sistema objetivo podría utilizar la forma doblemente decodificada de Encode(Encode(X)), que es X, algo que los filtros habrían tratado como ilegal. [ 5 ]

Codificación URI doble

La codificación URI doble, también conocida como codificación de porcentaje doble, es un tipo especial de codificación doble en la que los datos se codifican URI dos veces seguidas. [ 6 ] En otras palabras, la forma de datos codificada URI doble Xes URI-encode(URI-encode(X)). [ 7 ] Por ejemplo, para calcular la forma codificada URI doble de <, primero <se codifica URI como %3Cque luego a su vez se codifica URI como %253C, es decir, double-URI-encode(<) = URI-encode(URI-encode(<)) = URI-encode(%3C) = %253C. [ 8 ] Como otro ejemplo, para calcular la forma codificada URI doble de ../, primero ../se codifica URI como %2E%2E%2Fque luego a su vez se codifica URI como %252E%252E%252F, es decir, double-URI-encode(../) = URI-encode(URI-encode(../)) = URI-encode(%2E%2E%2F) = %252E%252E%252F. [ 9 ]

La codificación URI doble se utiliza habitualmente como técnica de ataque contra aplicaciones web y navegadores web para eludir los esquemas de autorización y los filtros de seguridad que interceptan la entrada del usuario. [ 10 ] [ 11 ] Por ejemplo, dado que .y su forma codificada en URI %2Ese utilizan en algunos ataques de recorrido de directorios, los filtros de seguridad suelen tratarlos como ilegales. [ 12 ] Sin embargo, todavía es posible que %252E, que es la forma codificada en URI doble de ., no sea tratada como ilegal por los filtros de seguridad y, por lo tanto, los atraviese, pero más tarde, cuando el sistema objetivo está construyendo la ruta relacionada con el ataque de recorrido de directorios, podría utilizar la forma decodificada en URI doble de %252E, que es ., algo que los filtros habrían tratado como ilegal. [ 13 ]

Los ataques de doble codificación de URI se han utilizado para eludir los esquemas de autorización y los filtros de seguridad contra la inyección de código, el recorrido de directorios, XSS y la inyección SQL. [ 14 ]

Prevención

Decodificar dos veces la entrada del usuario utilizando el mismo esquema de decodificación, una vez antes de una medida de seguridad y otra después, puede permitir que los ataques de doble codificación eludan dicha medida de seguridad. [ 15 ] Por lo tanto, para prevenir los ataques de doble codificación, todas las operaciones de decodificación de la entrada del usuario deben realizarse antes de los esquemas de autorización y los filtros de seguridad que interceptan la entrada del usuario. [ 16 ]

Ejemplos

PHP

En el lenguaje de programación PHP , los elementos de datos en y están suficientemente decodificados como URI y, por lo tanto, los programadores deben evitar llamar a la función en ellos. [ 17 ] Llamar a la función en datos que se han leído de o hace que los datos se decodifiquen como URI una vez más de lo que deberían y, por lo tanto, puede abrir la posibilidad de ataques de doble codificación URI.$_GET$_REQUESTurldecodeurldecode$_GET$_REQUEST

Recorrido de directorios

En el siguiente programa PHP, el valor $_GET["file"]se utiliza para construir la ruta del archivo que se enviará al usuario. Esto abre la posibilidad de ataques de recorrido de directorios que incorporan su carga útil en el parámetro HTTPfile GET . Como filtro de seguridad contra ataques de recorrido de directorios, este programa busca secuencias de recorrido de directorios en el valor que lee $_GET["file"]y sale si encuentra alguna. Sin embargo, después de este filtro, el programa decodifica los datos que ha leído $_GET["file"], lo que lo hace vulnerable a ataques de doble codificación URI.

<?php /* Tenga en cuenta que $_GET ya está decodificado como URI */ $path = $_GET [ "file" ];/* Filtro de seguridad */ /* Salir si la entrada del usuario contiene una secuencia de recorrido de directorio */ if ( strstr ( $path , "../" ) or strstr ( $path , ".. \\ " )) { exit ( "Se detectó un intento de recorrido de directorio." ); }/* Decodificar la entrada del usuario URI una vez más */ $path = urldecode ( $path );/* Construir la ruta del archivo que se enviará utilizando la entrada del usuario */ echo htmlentities ( file_get_contents ( "uploads/" . $path ));

Este filtro bloquea con éxito cargas útiles como

../../../../etc/passwd

y su forma codificada en URI

%2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc%2Fcontraseña

Sin embargo, cuando la carga útil mencionada anteriormente está doblemente codificada como

%252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc%252Fcontraseña

Esto eludirá el filtro, ya que el valor $_GET["file"]será la versión codificada una sola vez. Cuando la carga útil se codifica una sola vez, no contiene ninguna secuencia de recorrido de directorios y, por lo tanto, pasa el filtro sin cambios. Una vez que se le pasa a la urldecodefunción, se convertirá en ../../../../etc/passwd, lo que resultará en un ataque exitoso.

Secuencias de comandos entre sitios

En el siguiente programa PHP, el valor $_GET["name"]se utiliza para construir un mensaje que se mostrará al usuario. Esto abre la posibilidad de ataques de secuencias de comandos entre sitios (XSS) que incorporan su carga útil en el parámetro HTTP GET name. Como filtro de seguridad contra ataques XSS, este programa sanitiza el valor que lee mediante $_GET["name"]la htmlentitiesfunción. Sin embargo, después de este filtro, el programa decodifica los datos leídos $_GET["name"], lo que lo hace vulnerable a ataques de doble codificación URI.

<?php /* Tenga en cuenta que $_GET ya está decodificado como URI */ $name = $_GET [ "name" ];/* Filtro de seguridad */ /* Sanitizar la entrada del usuario mediante htmlentity */ $name = htmlentities ( $name );/* Decodificar la entrada del usuario URI una vez más */ $name = urldecode ( $name );/* Construye el mensaje que se mostrará utilizando la entrada del usuario */ echo "Hola " . $name ;

Este filtro bloquea con éxito cargas útiles como

<script> alert ( 123 ) </script>

y su forma codificada en URI

%3Cscript%3Ealert%28123%29%3C%2Fscript%3E

Sin embargo, cuando la carga útil está doblemente codificada como

%253Cscript%253Ealert%2528123%2529%253C%252Fscript%253E

Esto eludirá el filtro, ya que el valor $_GET["name"]será la forma codificada individualmente. Esta forma no contiene caracteres ilegales y pasará por la htmlentitiesfunción sin cambios. Luego, una vez que la urldecodefunción la decodifique por segunda vez, se convertirá en lo que resulta en un ataque exitoso.<script>alert(123)</script>

Fuentes

  • CAPEC (2022). "CAPEC-120: Doble codificación" . capec.mitre.org . 3.7 . Consultado el 23 de julio de 2022 .
  • CWE (2022). "CWE-174: Doble decodificación de los mismos datos" . cwe.mitre.org . 4.8 . Consultado el 23 de julio de 2022 .
  • Imperva (2022). "Codificación URL doble" . docs.imperva.com . Consultado el 23 de julio de 2022 .
  • OWASP (2022). "Doble codificación" . owasp.org . Consultado el 23 de julio de 2022 .
  • PHP (2022). "urldecode" . php.net . Consultado el 23 de julio de 2022 .
  • PortSwigger (2022). "Ataques de ofuscación mediante codificaciones" . portswigger.net . Ofuscación mediante doble codificación URL . Consultado el 23 de julio de 2022 .
  • Prasad, Prakhar (2016). «Doble codificación» . Mastering Modern Web Penetration Testing . Packt Publishing. pp. 11–14 . ISBN  978-1785284588.

Referencias

  1. CAPEC 2022 , Descripción . "El adversario utiliza la repetición del proceso de codificación para un conjunto de caracteres (es decir, la codificación de un carácter, la codificación de un carácter) para ofuscar la carga útil de una solicitud en particular."
  2. CAPEC 2022 , Descripción, Flujo de ejecución . "Esta [doble codificación] puede permitir al adversario eludir los filtros que intentan detectar caracteres o cadenas ilegales, como los que podrían usarse en ataques de recorrido o inyección [...] Por ejemplo, al codificar dos veces ciertos caracteres en la URL (por ejemplo, puntos y barras), un adversario puede intentar acceder a recursos restringidos en el servidor web o forzar la navegación a páginas protegidas (subvirtiendo así el servicio de autorización). Un adversario también puede intentar otros ataques de inyección utilizando este patrón de ataque: inyección de comandos, inyección SQL, etc."
  3. CAPEC 2022 , Descripción, Flujo de ejecución . "Esta [doble codificación] puede permitir al adversario eludir los filtros que intentan detectar caracteres o cadenas ilegales, como los que podrían usarse en ataques de recorrido o inyección. [...] Intente aplicar doble codificación a partes de la entrada para intentar sortear los filtros."
  4. OWASP 2022 , Descripción . "Mediante el uso de doble codificación es posible eludir los filtros de seguridad que solo decodifican la entrada del usuario una vez."
  5. OWASP 2022 , Descripción . "Mediante el uso de doble codificación, es posible eludir los filtros de seguridad que solo decodifican la entrada del usuario una vez. El segundo proceso de decodificación lo ejecuta la plataforma o los módulos de backend que manejan correctamente los datos codificados, pero que no cuentan con las comprobaciones de seguridad correspondientes."
  6. Prasad 2016 , p. 11. "La codificación de doble porcentaje es lo mismo que la codificación de porcentaje con la particularidad de que cada carácter se codifica dos veces en lugar de una." 
  7. Prasad 2016 , p. 11. "La codificación de doble porcentaje es lo mismo que la codificación de porcentaje con la particularidad de que cada carácter se codifica dos veces en lugar de una." 
  8. Prasad 2016 , p. 11. "Entonces, si tuviera que codificar < usando doble codificación, primero lo codificaría en su formato codificado en porcentaje, que es %3c, y luego volvería a codificar en porcentaje elcarácter %. El resultado de esto será %253c."  
  9. OWASP 2022 , Descripción . "Por ejemplo, los caracteres ../ (punto-punto-barra) representan %2E%2E%2F en representación hexadecimal. Cuando el símbolo % se codifica de nuevo, su representación en código hexadecimal es %25. El resultado del proceso de doble codificación ../ (punto-punto-barra) sería %252E%252E%252F".
  10. Prasad 2016 , p. 11. "Esta técnica [codificación de doble porcentaje] resulta bastante útil al intentar evadir filtros que intentan incluir en la lista negra ciertos caracteres codificados". 
  11. CAPEC 2022 , Flujo de ejecución . "Por ejemplo, al codificar dos veces ciertos caracteres en la URL (como puntos y barras), un atacante podría intentar acceder a recursos restringidos en el servidor web o forzar la navegación a páginas protegidas (vulnerando así el servicio de autorización). Un atacante también podría intentar otros ataques de inyección utilizando este patrón: inyección de comandos, inyección SQL, etc."
  12. CAPEC 2022 , Descripción . "Por ejemplo, un punto (.), que se usa con frecuencia en ataques de recorrido de ruta y, por lo tanto, suele ser bloqueado por los filtros, podría codificarse en la URL como %2E. Sin embargo, muchos filtros reconocen esta codificación y seguirían bloqueando la solicitud."
  13. CAPEC 2022 , Descripción . "En una doble codificación, el % en la codificación URL anterior se codificaría nuevamente como %25, lo que resultaría en %252E que algunos filtros podrían no detectar, pero que aún podría ser interpretado como un punto (.) por los intérpretes en el destino."
  14. CWE 2022 , Ejemplos observados .
  15. CWE 2022 , Descripción . "El software decodifica la misma entrada dos veces, lo que puede limitar la eficacia de cualquier mecanismo de protección que se produzca entre las operaciones de decodificación."
  16. CWE 2022 , Posibles medidas de mitigación . "Las entradas deben decodificarse y normalizarse a la representación interna actual de la aplicación antes de ser validadas (CWE-180)".
  17. PHP 2022 , Notas . "Advertencia: Las superglobales $_GET y $_REQUEST ya están decodificadas. Usar urldecode() en un elemento de $_GET o $_REQUEST podría tener resultados inesperados y peligrosos."
  • Entrada de OWASP para ataques de doble codificación
  • Entrada de CAPEC para ataques de doble codificación
  • Entrada CWE para la vulnerabilidad explotada por ataques de doble codificación.