Sobre Charsets, Codificación y otros

El camino hacia la eCPPT

 

09 de Julio del 2017

En este post revisaré temas fundamentales para entender cómo nuestro navegador interpreta las respuestas HTML del servidor considerando el charset, encoding, html encoding, url encoding y base64.

Introducción

Dentro de nuestro roadmap de los temas a revisar para websecurity, se encuentran los aspectos de codificación que se utilizan dentro de un sistema web.

La importancia del Character Encoding (o simplemente encoding) radica en el hecho de que de una correcta configuración dependerá si la página será interpretada bien por nuestro navegador. No es un aspecto que afecte directamente a la seguridad, sin embargo es fundamental entender su funcionamiento dentro de los pasos que estamos revisando para saber cómo funciona la web. También, debemos entender cómo se comportan ciertos caracteres dentro de un código html y revisar qué pasa con las urls y el uso de caracteres reservados.

Charset

Primero dejar en claro la diferencia entre Charset y Character encoding. El charset es, en términos coloquiales, los números, letras y símbolos que tenemos a disposición para representar un lenguaje o alfabeto. Cada caracter es representado con un código en una especie de tabla de conversión. Los ejemplos más típicos y conocidos son el ASCII y el Unicode. Otro Charset utilizado ampliamente es el Latin-1.


Y el Character encoding es cómo se almacenan dichos caracteres en memoria, es decir con que codigo lo identificamos para que sea representado. Ejemplos de encoding son: UTF-8 e ISO-8859-1.

 

 

Tal como vimos en el video, el hecho de cambiar el charset encoding, genera problemas de visualización de los datos cuando hay inconsistencias. Esta codificación puede estar mal configurada en los headers del HTML (como en el video), en la codificación de los archivos o incluso en la conexión a la base de datos.

 

HTML entities

Existen algunos caracteres reservados en una página HTML y que pueden generar problemas si no son codificados de manera correcta. Puedes revisar la tabla con las HTML entities acá.

 

 

Esto no es una medida de seguridad en sí, pero una correcta codificación de los datos al almacenar/mostrar la información puede ayudar a que no se produzcan inyecciones de código malicioso como veremos más adelante (ataques del lado del cliente).

 

URL Encoding

Cuando se creó la web, se consideró dejar disponible para crear las URL sólo caracteres dentro del US-ASCII. Es decir, letras mayúsculas y minúsculas (a-z y A-Z), números (0-9) y algunos caracteres especiales: guión (-), punto (.), guión bajo (_) y virgulilla (~)

Además, existen algunos caracteres reservados que tienen un significado dentro de la URL. Cuando queremos representar estos caracteres, debemos utilizar su codificación . Los más utilizados dentro de una URL son:

  • ?    Separador para identificar dónde comienzan los datos enviados por GET. Representado por %3F
  • &    Separador de parámetros enviados por GET. Codificación: %26.
  • #    Anchor, usualmente utilizado para marcar un lugar en la página. Representación: %23.
  • +    Indica un espacio. Se representa con: %2B.

 

Al igual que en el caso de las HTML entities, esto no es un aspecto de seguridad pero puede afectar al momento de querer inyectar código a través de la URL y se debe considerar por el manejo que realiza el navegador y desde el lado del servidor lo que se haya desarrollado.

 

 

Base64

La definición menciona que es un “esquema de codificación de Binario a texto (y viceversa) que es usualmente utilizado para enviar archivos por internet”. Dicho de otra manera, es una forma de poder convertir datos a un alfabeto de 64 caracteres.

Las principales características que tiene base64 son:

  • Utiliza un conjunto de 64 caracteres del charset ASCII.
  • La codificación y decodificación es un proceso que es rápido y consume pocos recursos.
  • NO es un método de cifrado, sólo de codificación.
  • Es áltamente usado para ofuscar código malicioso en scripts PHP o Javascript.

En una página HTML podemos, por ejemplo, insertar una imagen directamente como base64 y será interpretada correctamente ya que el base64 es la representación del binario y así lo entiende HTML.

Por lo tanto podrías poner por ejemplo:

<img src=”imagenes/foto.png” />

<img src=”data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAZADIDAREAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAABQQGAgcD/8QAGQEBAQEAAwAAAAAAAAAAAAAAAAECAwQF/9oADAMBAAIQAxAAAAGDE0ip11EdCJ5Bx+h7DvoaEZOyIDAz7mnGSkPoSCKjk1yqFZACGfP/xAAdEAACAgIDAQAAAAAAAAAAAAAAAwECBDEFESET/9oACAEBAAEFAsNPi1FEllF0j0mTxNpycaIiqepK0Pj42o+hNKmFEWhXgvokYOiDs4/She50weTv/8QAGBEAAgMAAAAAAAAAAAAAAAAAAQIRIED/2gAIAQMBAT8BsriBm//EABYRAAMAAAAAAAAAAAAAAAAAABEgQP/aAAgBAgEBPwFhN//EAB0QAAEEAgMAAAAAAAAAAAAAADEAARAgAxESIaH/2gAIAQEABj8Ctl0OTpt2HkDpGDLX/8QAHRABAAICAwEBAAAAAAAAAAAAAQARIUExUXEQIP/aAAgBAQABPyGk4nFLIJjcu1U58R4xdRWrlzAhcBmErEAWZTgLZV6xSt2QDuHCw9ghwrCNrUK9PCEHfsRb8Wv4ZwZyT//aAAwDAQACAAMAAAAQyCCuwW0y6GjHSe//xAAbEQEAAQUBAAAAAAAAAAAAAAABIAAQETBBUf/aAAgBAwEBPxAI4o5Phv5Et//EABoRAAICAwAAAAAAAAAAAAAAAAEgEBEhMEH/2gAIAQIBAT8QgISthoxPV//EACMQAQACAgECBwEAAAAAAAAAAAEAESExQWGhEFFxkbHR8IH/2gAIAQEAAT8QLHah1hKRiYkaZ6HWV1aOCu8FB8Is6j4ttHtHkB83cJExA8DtDNdP3MABndcH29YSbiXWgPNjirHiDFTJwK2JvtArh7d37wUGXUHqfUopEaFsjMGnUZbWPy5ubxtu2/uf3U7I8LR6z4Jq+C7hn//Z” >

 

 

Conclusiones

Para resumir este post, he revisado algunos conceptos básicos de codificación dentro de una aplicación en internet y que deben estar claros al momento de realizar pruebas de inyección de código y sobre todo de entender cómo funciona la web.

 

Referencias