Nuestro propio laboratorio de SQL Injection

Iniciado por user_en1gm4, Octubre 19, 2017, 03:56:48 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Octubre 19, 2017, 03:56:48 AM Ultima modificación: Octubre 20, 2017, 11:42:20 PM por user_en1gm4
Hola muchach@s! llevaba tiempo sin pasarme por aqui pero pues ya era hora de volver, esta vez les traigo un laboratorio que me arme para poder enseñar como se hace una injection sql manualmente, espero les guste.

Pueden montarlo en su propia maquina con un servidor local como xamp o wamp que ya tiene todo listo o a su propio servidor en internet, primero vamos a crear una base de datos MySql en nuestro servidor y crearemos una tabla llamada Clientes, el script quedaria algo asi:

CREATE TABLE `NOMBRE_BD`.`Clientes` ( `id` INT(2) NOT NULL AUTO_INCREMENT , `user` VARCHAR(30) NOT NULL , `password` VARCHAR(30) NOT NULL , `correo` VARCHAR(40) NOT NULL , `saldo` INT(3) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

y se veria algo asi:


llenan la tabla con algunos datos.

Aca les dejo los archivos necesarios para subir al servidor:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Despues de descargarlos abrimos los tres archivos .php que se descargaron el archivo index.php, registro.php,sqli.php y llenan los datos como USUARIO_BD, CONTRASEÑA_BD Y NOMBRE_BD, depende tengan configurada su base de datos, al terminar esto solo queda subir todos los archivos a una carpeta del servidor y listo!


Abrimos a nuestro navegador y nos dirimos a donde tengamos los archivos por ejemplo:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Nos saldra un login, primero nos registramos y luego iniciamos sesion son los anteriores datos, y listo estaremos adentro
, ahora si a jugar:



INYECCION:


PRIMERO SE MIRA SI ES VULNERABLE

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.com/taller_sql/sqli.php?id=1'


SE BUSCA EL NUMERO DE COLUMNAS DE LA TABLA

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


SE MIRAN QUE CAMPOS CORRESPONDEN A QUE COLUMNA

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


SE REVISA QUE VERSION DE BASE DE DATOS UTILIZA

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

SE PUEDE VER EL TIPO DE CODIFICACION UTILIZA

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

SE PUEDE OBTENER EL USUARIO CON EL QUE SE ESTA TRABJANDO LA BD

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

LISTA EL NUMERO DE TABLAS DE LA BD

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

"convertir el nombre de la tabla en hexadecimal" Clientes: 436c69656e746573

VAMOS A IMPRIMIR EL NOMBRE DE LAS COLUMNAS DE LA TABLA DE LA BASE DE DATOS

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Y LISTO AHORA SI PODEMOS OBTENER LOS DATOS

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

TODO ESTO LO PODEMOS HACER GRACIAS A QUE NO VALIDAMOS EL ID QUE NOS LLEGA POR LE METODO GET, CON UNA FUNCION QUE NOS LIMPIE ESTA VARIBALE LO PODEMOS ARREGLAR, SOLO DEBEMOS HACER ESTO EN LA LINEA 31 DE EL ARCHIVO SQLI.PHP TENEMOS QUE:

   $id =  $_GET["id"];

y a lo ultimo hay una funcionar que se llama limpiarString(), lo que tenemos que hacer es hacer que el id que obtenemos por get se limpie asi:

   $id =  limpiarString($_GET["id"]);

y listo, esta es una forma muy basica para detenerlo, php ya tiene unas funciones como htmlentities o htmlspecialchars, ustedes deciden.

LISTO AMIGOS SU PROPIO LABORATORIO DE SQL INJECTION, ESPERO QUE LES SIRVA,UN SALUDO!


Voy a probarlo se ve interesante muchas gracias

gracias, pero esta algo desactualizado debido a que las funciones mysql_connect, mysql_select_db, y mysql_fetch_array ya no se usan en las versiones php 7
a ver si alguien lo puede actualizar ( ya intente actualizarlo con POO pero no soy bueno programando :S)
saludos

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
gracias, pero esta algo desactualizado debido a que las funciones mysql_connect, mysql_select_db, y mysql_fetch_array ya no se usan en las versiones php 7
a ver si alguien lo puede actualizar ( ya intente actualizarlo con POO pero no soy bueno programando :S)
saludos

Te refieres usando PDO "SOLO" para conectarte a la db ? porque segun tengo entendido PDO con el bindparam debería ayudar a protegerte de estos casos ...

listo, ya le saque un tiempo a editar estos archivos (aunque como les dije se muy poco de php), pero ya estan funcionales
a continuación les comparto el codigo:
INDEX.php
Código: php
<?php


error_reporting(E_ALL^E_NOTICE);
if(isset($_POST["enviar"])){

   $usuario = $_POST["usuario"];
   $clave = $_POST["clave"];

   $con = mysqli_connect("localhost","root","","sql"); /*<---- sql es el nombre de la base de datos, ustedes lo cambian según el nombre que le dieron a la base de datos  */
   $select = "SELECT * FROM Clientes WHERE user= '$usuario' AND password = '$clave'";
   $query = mysqli_query($con,$select);
   if ($columna = mysqli_fetch_array($query)){
 

   header("location: sqli.php?id=".$columna[0]);
}
 
  else{

 
   echo '<script>alert("Usuario o contraseña incorrecta")</script>';

  }
 
}

?>

REGISTRO.PHP
Código: php

<?php

if(isset($_POST["enviar"])){

   $usuario = $_POST["usuario"];
   $clave = $_POST["clave"];
   $correo = $_POST["correo"];
   $saldo = $_POST["saldo"];


  $con = mysqli_connect("localhost","root","","sql");
   
  $select = "INSERT INTO Clientes VALUES ('','$usuario','$clave','$correo','$saldo')";
   mysqli_query($con,$select);
   
 
    echo '<script>alert("Usuario registrado correctamente")</script>';
 





}
?>

SQLI.php
Código: php
<?php
  if(isset($_GET["id"])){
   $id =  $_GET["id"];
   
  $con = mysqli_connect("localhost","root","","sql");
   $select = "SELECT * FROM Clientes WHERE id=".$id;
   $query = mysqli_query($con,$select);
   $columna = mysqli_fetch_array($query);
   echo "<center><h2> <font color = 'blue'> Bienvenid@ </font> </h2></center>";
   echo "<font color = '#ffffff'> Hola: </font><font color = 'green'> ".$columna[1]."</font> <br>";
   echo "<font color = '#ffffff'> Su saldo es de: </font> <font color = 'green'> ".$columna[4]."</font> <br>";
  }
  else{
   header("location: sqli.html");
  }
 
  mysqli_close($con);




  function limpiarString($texto)
{
      $textoLimpio = preg_replace('([^0-9])', '', $texto);               
      return $textoLimpio;
}
?>


saludos, espero que les sirva :)