Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Prevenir Cross Site Scripting

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en COBOL buscando prevenir ataques de tipo cross site scripting (XSS). Éste es un tipo frecuente de ataque, por lo cual es necesario tomar medidas preventivas para evitarlo.

Necesidad

Codificar entrada del usuario para prevenir ataques de Cross-Site Scripting en COBOL.

Contexto

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

  1. Se está desarrollando una aplicación en COBOL.

  2. La aplicación procesa la entrada del usuario y finalmente muestra el resultado en el navegador a través de un segundo lenguaje (Por ejemplo Java).

  3. Debe validarse que la salida de información esté codificada según el lenguaje correspondiente (HTML, JS, “escaping”)[1].

Solución

  1. Algunos caracteres son reservados en HTML y XHTML. Por ejemplo, no es posible usar los símbolos "mayor o menor que" (> <) dentro del texto porque el navegador podría confundirlos con etiquetas de apertura y cierre[2].

  2. La conversión de estos caracteres especiales ayuda a prevenir ataques de Cross-Site Scripting (XSS) ya que, dicho ataque es activado al hacer uso de los símbolos < y >. El control es suficiente cuando se analiza toda una cadena y no solo partes de ella[3].

  3. La siguiente tabla muestra los seis caracteres especiales que se deben convertir para prevenir dicho ataque:

    Tabla 1. Caracteres a convertir para prevenir un ataque de XSS.
    Caracter Nombre de la entidad Descripción

    "

    &quot;

    Comilla

    '

    &apos;

    Apóstrofe

    &

    &amp;

    Ampersand

    <

    &lt;

    Menor que

    >

    &gt;

    Mayor que

    &nbsp;

    Espacio

  4. Se da inicio a la solución mediante la división IDENTIFICATION DIVISION:

    cobolshe.cbl
    1
    2
    3
    4
    5
           IDENTIFICATION DIVISION.
          ******************
          * Identification *
          ******************
           PROGRAM-ID. COBOLSHE.
    
  5. La división DATA DIVISION contiene las siguientes variables:

    • W01-INPUT: Es la cadena que contiene los datos provenientes del usuario.

    • W02-SANITIZED: Cadena final con los caracteres transformados.

    • W03-LENGTH: Longitud de la cadena que se analizará.

    • W04-COUNT: Contador de caracteres que indica la posición del carácter a analizar.

    • W05-CHAR: Carácter que se transformará a entidad HTML.

    • W06-TEMP: Variable de uso temporal.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
          ********
          * Data *
          ********
           DATA DIVISION.
    
           WORKING-STORAGE SECTION.
           01 W01-INPUT     PIC X(064) VALUE "".
           01 W02-SANITIZED PIC X(384) VALUE "".
           01 W03-LENGTH    PIC 9(002) VALUE 0.
           01 W04-COUNT     PIC 9(002) VALUE 1.
           01 W05-CHAR      PIC X(001) VALUE "".
           01 W06-TEMP      PIC X(006) VALUE "".
    
  6. Para ejemplificar, se va a convertir una cadena con contenido malicioso:

    1
    2
    3
    4
    5
    6
          ********
          * Main *
          ********
           PROCEDURE DIVISION.
           MAIN.
               MOVE "<script>alert(document.cookie); </script>" TO W01-INPUT
    
  7. Obtenemos la longitud real de la cadena:

    1
    2
    3
    4
           INSPECT FUNCTION REVERSE(W01-INPUT)
           TALLYING W03-LENGTH FOR LEADING SPACES.
    
           COMPUTE W03-LENGTH = FUNCTION LENGTH(W01-INPUT) - W03-LENGTH.
    
  8. Recorremos carácter por carácter:

    1
    2
    3
           PERFORM UNTIL W04-COUNT > W03-LENGTH
               MOVE W01-INPUT(W04-COUNT:1) TO W05-CHAR
               MOVE "" TO W06-TEMP
    
  9. Transformamos los carácteres especiales a su entidad correspondiente:

    1
    2
    3
    4
    5
    6
    7
    8
    9
           EVALUATE W05-CHAR
               WHEN """"  MOVE "&quot;" TO W06-TEMP
               WHEN "'"   MOVE "&apos;" TO W06-TEMP
               WHEN " "   MOVE "&nbsp;" TO W06-TEMP
               WHEN "&"   MOVE "&amp;"  TO W06-TEMP
               WHEN "<"   MOVE "&lt;"   TO W06-TEMP
               WHEN ">"   MOVE "&gt;"   TO W06-TEMP
               WHEN OTHER MOVE W05-CHAR TO W06-TEMP
           END-EVALUATE
    
  10. Se va concatenando cada uno de los caracteres transformados en la variable final:

    1
    2
    3
           STRING W02-SANITIZED W06-TEMP
           DELIMITED BY SPACE
           INTO W02-SANITIZED
    
  11. No se debe olvidar sumar el contador (Para evitar un ciclo infinito):

    1
    2
               COMPUTE W04-COUNT = W04-COUNT + 1
           END-PERFORM.
    
  12. Se despliega en pantalla la cadena depurada:

    1
    2
    3
           DISPLAY W02-SANITIZED.
    
           STOP RUN.
    
  13. La siguiente tabla muestra dos cadenas probadas con el programa:

    Tabla 2. Salida obtenida al ejecutar el programa.
    Cadena Resultado

    <script>alert(document.cookie); </script>

    &lt;script&gt;alert(document.cookie);&nbsp;&lt;/script&gt;

    Valid string<

    Valid string&lt;

Descargas

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

  1. cobolshe.cbl contiene la implementación del código para prevenir ataques de XSS.




Haz un comentario

Estado de los servicios - Términos de Uso