Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Prevenir Cross Site Scripting

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:

    Table 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:

    Table 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.


Service status - Terms of Use