Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Prevenir XSS Usando Apache Commons Lang

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al prevenir ataques de tipo Cross Site Scripting utilizando Apache common lang. Se busca logra una codificación en la salida, para que los caracteres sean tratados como datos.

Necesidad

Prevenir XSS usando Apache Commons Lang en Java

Contexto

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

  1. La aplicación está desarrollada en Java.

Solución

  1. Lo que se busca es codificar la información de salida para que los caracteres sean tratados como datos y no como caracteres que puedan ser ejecutados por algún analizador sintáctico.

  2. Lo primero que se requiere es descargar la libreria Apache Commons Lang y agregarla al proyecto que contiene el código de la aplicación [1].

  3. Como segundo paso, se debe importar el paquete org.apache.commons.lang3 a la clase que pretende mostrar alguna información de salida.

    paquete.java
    1
    import org.apache.commons.lang3.StringEscapeUtils;
    
  4. La clase StringEscapeUtils que se encuentra en el paquete org.apache.commons.lang3 de la biblioteca Apache Commons permite codificar la información de salida en un formato especifico; dichos formatos pueden ser HTML, JavaScript, CSS, SQL, XML.

  5. La clase StringEscapeUtils ofrece los siguientes métodos estáticos los cuales pueden ser usados para codificar la información de salida a un formato especifico.

    1
    2
    3
    4
    5
    escapeXml(String str)
    escapeSql (String str)
    escapeEcmaScript (String str)
    escapeHtml4 (String str)
    escapeCsv (String str)
    
  6. Cada uno de los métodos anteriormente mencionados, devuelve una cadena de caracteres con la información codificada. Para codificar la información que se muestra dentro de un código HTML, por ejemplo, se puede usar el método escapeHtml4 de la siguiente forma:

    1
    2
    3
    response.setContentType("text/html");
    java.io.PrintWriter out = response.getWriter();
    String mensaje= request.getParameter("mensaje");
    
  7. Esta clase puede usarse desde cualquier aplicación Java. A continuación se presenta un ejemplo de como puede ser utilizada en una aplicación web.

    1
    2
    3
    4
    5
    6
    7
    /var/lib/tomcat7/webapps/xss % ls -R
    
    index.jsp WEB-INF/
    ./WEB-INF:
    lib/ web.xml
    ./WEB-INF/lib:
    commons-lang3-3.0.1.jar
    
  8. El archivo web.xml es un descriptor típico de despliegue que incluso puede ser ignorado por contenedores de servlets con soporte de la especificación versión igual o superior a 3.0. En nuestro caso se utilizará.

    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
      <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
         "http://java.sun.com/dtd/web-app_2_3.dtd">
      <web-app>
      </web-app>
    
  9. El jar de la biblioteca debe ser accesible por el servidor de aplicaciones. Una forma sencilla de conseguirlo es incluir el jar en la carpeta WEB-INF/lib del proyecto.

  10. El archivo index.jsp, desde el cual se hace uso de la biblioteca, se muestra a continuación:

    1
    2
    3
    4
    5
    6
    <html>
      <head>
        <title>Prueba</title>
      </head>
      <body>
        <%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
    
  11. Se observa como se importa la biblioteca usando el tag @page con el atributo import.

    1
    2
    3
    4
    5
    6
    7
    8
       <%
         String mensajeCodificado;
         //mensajeCodificado=request.getParameter("mensaje");
         mensajeCodificado=StringEscapeUtils.escapeHtml4(request.getParameter("mensaje"));
         out.print(mensajeCodificado);
       %>
      </body>
    </html>
    
  12. El método escapeHtml4 simplemente recibe un objeto tipo String como parámetro y retorna otro String ya codificado.

  13. Al visualizar la página se nota como el código HTML y JavaScript nunca se ejecutó gracias a que las comillas simples fueron escapadas.




Haz un comentario

Estado de los servicios - Términos de Uso