Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Filtrar Entradas con Expresiones Regulares

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en PHP, verificando y limpiando las entradas del sistema con ayuda de expresiones regulares, para evitar posibles explotaciones de XSS (Cross-site scripting).

Necesidad

Filtrar la entrada de un usuario en una aplicación para evitar problemas de seguridad

Contexto

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

  1. La aplicación está hecha en PHP

  2. Se tiene acceso para modificar la aplicación

Solución

  • Las expresiones regulares, también conocidas como regex, son de mucha utilidad para un programador, pues permiten, a través de patrones establecidos, detectar si una cadena de texto contiene o no determinados elementos. En este caso vamos a usarlas para filtrar el contenido que se ingrese en las entradas de datos (input) de la aplicación.

    Esto muy importante en todo programa, pues se debe prevenir posibles intentos de ejecución de scripts maliciosos al usar caracteres que le indiquen al sistema no interpretar lo ingresado como una string, sino como un código a ejecutar.

  • En PHP se usa la función sanitize para filtrar la entrada de un usuario. Esto permite que, a nivel de aplicación, se pueda determinar el tipo de dato y los caracteres permitidos en los campos de la petición. Así se previene los fallas de seguridad, como Cross Site Scripting (XSS).

    1. El código de la función sanitize es el siguiente:

      sanitize.php
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      <?php
      
      function cleanInput($input) {
        $search = array(
        '@<script[^>]*?>.*?</script>@si', // Elimina Javascript
        '@<[\/\!]*?[^<>]*?>@si', // Elimina tags HTML
        '@<style[^>]*?>.*?</style>@siU', // Elimina propiedades del style
        '@<![\s\S]*?--[ \t\n\r]*>@' // Elimina comentarios multilínea
        );
      
        $output = preg_replace($search, '', $input);
        return $output;
      }
      
      function sanitize($input) {
        if (is_array($input)) {
          foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
          }
        }
        else {
          if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
          }
          $input = cleanInput($input);
          $output = mysql_real_escape_string($input);
        }
        return $output;
      }
      
      ?>
      
    2. Por ejemplo, se tiene el siguiente contenido en la variable $_GET:

      input
      1
      2
      3
      4
      5
      6
      Array (
        [id] => 77blabla,
        [name] => "Hi! <script src='http://www.evilsite.com/bad_script.js'></script> It's a good day!",
        [variable1] => somedata,
        [variable2] => somedata
      )
      
    3. Si se ejecuta con sanitize se obtiene lo siguiente:

      ejemplo-sanitize.php
      1
      2
      $getvars = sanitize($_GET);
      unset($_GET);
      
      resultado:
      Array (
        [id] => 77,
        [name] => "Hi! It\'s a good day!"
      )
      
    4. Esta función debe usarse antes de cualquier manejo de variables que impliquen datos ingresados por el usuario.

    5. Para acceder a los datos que se ingresaron a través de GET, se usa la nueva variable $getvars.

      ejemplo-getvars.php
      1
      echo $getvars['name'];
      
      resultado:
      Hi! It\'s a good day!
      

      Tal como se puede ver en el ejemplo anterior, filtrando las entradas con la función sanitize, el resultado final se muestra sin la etiqueta script y con el caracter de escape \ para el apóstrofo.

  • Tenga en cuenta que las expresiones regulares, además de ayudar a prevenir ataques de XSS, también pueden ser de utilidad para definir, ya sea validar campos de forma básica, o para prevenir fallas similares en campos que alteren las consultas SQL internas.

  • Si usted desea conocer más sobre este tema, lo invitamos a leer el siguiente artículo del blog de Fluid Attacks, elaborado por uno de nuestros ethical hackers: Mandamiento #1: validar entradas

  • Para más información sobre el uso de regex, puede visitar la Web oficial de PHP




Haz un comentario

Estado de los servicios - Términos de Uso