Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Validar Redirecciones a Páginas Web

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al validar las redirecciones a páginas web. Las redirecciones deben definirse a rutas fijas cuyo origen es el mismo código de la aplicación sus archivos de configuración.

Necesidad

Validar redirecciones a páginas web.

Contexto

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

  1. La aplicación esta desarrollada en Java EE versión 1.4/1.5 o superior.

Solución

La validación de entradas y datos ingresados por el usuario es una práctica recomendada en todas las aplicaciones, y las redirecciones no son la excepción. Para redireccionar la solicitud de un usuario a una web que expone la aplicación, Java proporciona el método sendRedirect definido en la clase javax.servlet.http.HttpServletResponse. Para implementar ésta funcionalidad en la aplicación se debe tener en cuenta los siguientes aspectos [1]:

  1. Evite el uso de parámetros manipulables por el usuario para definir el destino. En su lugar, establezca el destino mediante una dirección URL (Uniform Resource Locator) predefinida en la aplicación.

  2. El uso de instrucciones como response.sendRedirect(request.getParameter("url")); son muy peligrosas porque permiten que un atacante utilice la aplicación para redirigir al usuario hacia un sitio por fuera de esta, por ejemplo haciendo peticiones del estilo: TestServlet?url=http://google.com.

  3. En su lugar, el modo recomendado de redirigir es usando rutas fijas provenientes del mismo código, o mejor aún, cargadas desde archivos de configuración. Como se muestra en el siguiente fragmento de código:

    SafeRedirect.java
    1
    2
    3
    4
    5
    6
    7
    8
    public class FLUIDServlet extends HttpServlet {
    
      protected void doPost(HttpServletRequest request,
                           HttpServletResponse response)
                           throws ServletException, IOException {
        response.sendRedirect("/FLUIDApp/login.jsp");
     }
    }
    
  4. Si se requiere el uso de algún parámetro para establecer la dirección de destino, considere establecer el contexto definido para la aplicación. Para obtener éste contexto se debe utilizar el método getContextPath definido en la clase javax.servlet.http.HttpServletRequest. Este contexto corresponde con el nombre del directorio que contiene la solución y se encuentra desplegado en el servidor de aplicación.

    1
    2
    3
    4
    5
    6
    public class FLUIDServlet extends HttpServlet {
      protected void doPost(HttpServletRequest request,
                           HttpServletResponse response)
                           throws ServletException, IOException {
        String contextPath=request.getContextPath();
    ...
    
  5. Valide el contenido enviado en el parámetro. Para realizar ésta validación se recomienda hacer uso de expresiones regulares ver filtrar la entrada de datos (Java)

    1
    2
    3
    4
    String direccionDestino=request.getParameter("url");
    // ... validación de direccionDestino
    // mediante el uso de expresiones regulares ...
    ...
    
  6. Codifique el valor del parámetro que es utilizado para establecer la dirección de destino a formato URL. Para realizar esta codificación se debe emplear el método encode definido en la clase java.net.URLEncoder.

    1
    String direccionDestinoCodificado = java.net.URLEncoder.encode(direccionDestino, "UTF-8");
    
  7. Finalmente redireccione la solicitud del usuario concatenando el valor del contexto de la aplicación y el valor de la dirección destino codificada al formato URL.

    1
       response.sendRedirect(contextPath + direccionDestinoCodificado);
    
  8. En una pagina web JSP, el anterior punto puede ser establecido de la siguiente forma:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    ...
    <body>
    <%@ page import="java.net.URLEncoder;" %>
    <%
       String direccionDestino = request.getParameter("page");
       // Forma incorrecta: response.sendRedirect(direccionDestino);
       direccionDestino= URLEncoder.encode(direccionDestino, "UTF-8");
       String contextPath=request.getContextPath();
       response.sendRedirect(contextPath + "/" +  direccionDestino);
    %>
    </body>
    </html>
    



Haz un comentario

Estado de los servicios - Términos de Uso