Joven hacker sonriendo

Purificar HTML

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java utilizando Jsoup para purificar el código HTML. Jsoup es una biblioteca especializada en seguridad que define una lista blanca de atributos, evitando inyecciones de código malicioso.

Necesidad

Purificar HTML en Java usando Jsoup

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación en Java usando servlets

  2. El código debe estar codificado según el lenguaje correspondiente (ej: HTML, JS, escaping). [3]

Solución

La purificación de código HTML es el proceso de examinar un documento HTML con el fin de buscar etiquetas o tags que se consideran seguros (por lo general, estos tags son previamente definidos en una lista blanca o whitelist). Una vez se ha identificado las etiquetas seguras, se procede a eliminar los tags considerados como inseguros. Por último, se genera un nuevo documento HTML donde se incluyen solo los tags resultantes.

La purificación del HTML se hace con el fin de evitar el uso de etiquetas que podrían permitir la inyección de código malicioso lo cual podría generar diversas vulnerabilidades, por ejemplo, Cross Site Scripting.

Para purificar el código HTML y así evitar las inyecciones de código malicioso se debe usar bibliotecas especializadas. Éste es el caso de Jsoup [1].

Jsoup es un analizador de HTML que, entre sus características, encontramos la capacidad de limpiar código HTML definiendo una lista blanca de atributos.

En la siguiente aplicación se hará uso de la biblioteca la cual purificará el código HTML cuando encuentre etiquetas o valores que no se encuentren en la lista blanca.

  1. Comenzamos desarrollando la aplicación importando las clases necesarias para la correcta ejecución del servlet.

    purify.java
    1
    2
    3
    4
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
  2. Importamos las clases de la biblioteca jsoup y el paquete safety.

    1
    2
    import org.jsoup.*;
    import org.jsoup.safety.*;
    
  3. Definimos el nombre de la clase y el método doGet.

    1
    2
    3
    public class Purify extends HttpServlet {
      public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    
  4. Obtenemos el writer para escribir la respuesta al cliente y el contenido del atributo content.

    1
    2
    PrintWriter out = response.getWriter();
    String unsafe = request.getParameter("content");
    
  5. Definimos la lista blanca, la cual permite el uso de etiquetas básicas.

    1
    Whitelist basicWithImages = Whitelist.basic()
    
  6. Extendemos la lista blanca agregando la etiqueta img.

    1
    .addTags(new String[] { "img" })
    
  7. A dicha etiqueta le agregamos los atributos permitidos.

    1
    .addAttributes("img", new String[] { "align", "alt", "height", "src", "title", "width" })
    
  8. Finalmente, para el atributo src, agregamos los protocolos permitidos.

    1
    .addProtocols("img", "src", new String[] { "http", "https" });
    
  9. Llamamos al método clean de la clase Jsoup pasándole como parámetro el contenido inseguro y la lista blanca. El contenido seguro es asignado al atributo safe.

    1
    String safe = Jsoup.clean(unsafe, basicWithImages);
    
  10. Establecemos el tipo de contenido como HTML e imprimimos el resultado de la purificación.

    1
    2
    response.setContentType("text/html");
    out.println(safe); }}
    
  11. Las listas blancas que trae la herramienta por defecto son:

    1
    2
    *Whitelist.simpleText()*
    "b", "em", "i", "strong", "u"
    
    1
    2
    3
    4
    *Whitelist.basic()*
    "a", "b", "blockquote", "br", "cite", "code", "dd", "dl",
    "dt", "em", "i", "li", "ol", "p", "pre", "q", "small",
    "strike", "strong", "sub", "sup", "u", "ul"
    
    1
    2
    *Whitelist.basicWithImages()*
    basic()."img"
    
    1
    2
    3
    4
    5
    *Whitelist.relaxed()*
    "a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup",
    "dd", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img",
    "li", "ol", "p", "pre", "q", "small", "strike", "strong", "sub", "sup",
    "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", "ul"
    
  12. A continuación observe algunas pruebas de inyección y su resultado luego de la purificación.

salida

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. purify.java contiene la manera en que se debe usar la biblioteca Jsoup.

Referencias

  1. JSOUP

  2. HTML sanitization

  3. REQ.0155 La salida de información del sistema debe estar codificada en el lenguaje correspondiente (escaping)




Haz un comentario

Estado de los servicios - Términos de Uso