WEBVTT

00:00.000 --> 00:06.079
Muy bien, ahora veamos lo que es una inyección
SQL de tipo UNION, y para eso usaremos la

00:06.079 --> 00:10.260
misma inyección SQL de antes. Y tú dirás,
pero si me dijiste que la de antes era de

00:10.260 --> 00:14.720
tipo error. Mientes, me haces daño y luego te
arrepientes. Verás compadre, una inyección

00:14.720 --> 00:19.079
SQL de tipo error puede ser explotada de múltiples
formas, y por múltiples formas me refiero

00:19.079 --> 00:23.579
a usar diferentes instrucciones de lenguaje
SQL y combinarlas entre sí, mientras que

00:23.579 --> 00:28.239
ese coherente viejo funcionará. Y evidentemente,
esta inyección SQL de tipo error puede ser

00:28.239 --> 00:36.520
explotada también con la cláusula UNION, pasando así a ser también una inyección SQL
de tipo UNION. Y como te digo, este tipo de casos no son aislados, son bastante comunes

00:36.520 --> 00:41.060
Ahora fíjate, como entenderás en este tipo de
inyecciones SQL, lo que buscamos es concatenar

00:41.060 --> 00:45.259
la consulta original con otra consulta que
nosotros generemos, y esta unión la haremos

00:45.259 --> 00:49.220
a través de la cláusula UNION, para de esta
forma poder obtener más información sobre

00:49.220 --> 00:53.520
la base de datos. Pero como sobrás para que
una cláusula UNION se ejecute con éxito

00:53.520 --> 00:57.560
debemos seleccionar en el segundo SELECT el mismo
número de columnas, que ya están seleccionadas

00:57.560 --> 01:01.279
en el SELECT antes del UNION. Por lo que
nosotros viendo el código podemos saber que

01:01.279 --> 01:05.760
en este caso son dos columnas, este siendo
el número que podemos usar en el otro UNION

01:05.760 --> 01:09.559
Pero en la vida real tú no sabrás el número
de columnas, ¿qué tendrá la consulta original

01:09.559 --> 01:15.279
A menos que te den acceso al código fuente. Pero si por ejemplo haces
un pentestín de caja negra no lo vas a tener, o bueno, a priori no

01:15.279 --> 01:19.279
Así que ¿cómo podríamos nosotros determinar
el número de columnas, en este tipo de casos

01:19.279 --> 01:23.360
Pues esto es muy simple, podríamos por ejemplo
hacer un UNION, para luego llamar a la instrucción

01:23.360 --> 01:27.040
SELECT, y en lugar de seleccionar columnas,
por ejemplo, seleccionar valores nulos, que

01:27.040 --> 01:30.959
esto prácticamente no va a seleccionar nada,
porque no nos va a retornar ningún valor

01:30.959 --> 01:34.720
pero a nivel de la base de datos se
pueden usar, para este contexto puntual

01:34.720 --> 01:39.040
Y simular entre comillas las columnas, que
estamos solicitando con SELECT, y digo simular

01:39.040 --> 01:42.599
entre comillas porque NULL no se creó para
esto, es un uso que podemos darle pero no

01:42.599 --> 01:51.199
se creó para esto. Por lo que por ejemplo podemos hacer una prueba, digamos un SELECT
de 5 NULLS, separados por coma, es decir, en este hipotético caso simular 5 columnas

01:51.199 --> 01:58.319
Si ejecutamos esta consulta veremos que nos arroja este mensaje, diciendo que no coincide
el número de columnas, por lo que ya sabemos que por lo menos 5 no tiene, ahora nada más

01:58.319 --> 02:04.000
nos queda probar con infinitos números. Entonces, aquí lo que
se suele hacer en este tipo de inyecciones de SQL es partir de un

02:04.000 --> 02:08.399
número de columnas, bueno columnas entre
comillas, por ejemplo 5, e ir bajando, hasta

02:08.399 --> 02:12.279
llegar al número de columnas que existen,
y que obviamente en este caso partimos desde

02:12.279 --> 02:16.080
5, pero no siempre tiene que ser así, porque
digamos que la consulta original, el SELECT

02:16.080 --> 02:23.119
que está antes del UNION, digamos que en otra aplicación web tiene 10 columnas, pues si
nosotros intentamos identificar el número y partimos de 5, pues jamás daremos con la

02:23.119 --> 02:28.240
respuesta viejo, eso es obvio. Pero bien, en este caso
puntual, aquí ya vemos que con 5 no se puede, podemos probar

02:28.240 --> 02:32.839
con 4, y tampoco, podemos probar con 3, y de
igual forma tampoco, pero cuando probamos

02:32.839 --> 02:38.820
con 2, viva la vida, ahí si nos deja. Entonces podemos determinar que
hay dos columnas, de la consulta original, que se están seleccionando

02:38.820 --> 02:42.399
con la instrucción SELECT, y que por ende
nosotros podemos solicitar información, en

02:42.399 --> 02:46.880
nuestro SELECT, mientras que no nos pasemos de
dos argumentos, que es el máximo en este caso

02:46.880 --> 02:53.199
Entonces, con esta información, ¿qué es lo primero que tenemos que identificar?
Lo más elemental es la estructura de la base de datos, para saber que otras bases

02:53.199 --> 02:57.320
de datos, tablas y columnas existen en
este sistema gestor de bases de datos

02:57.320 --> 03:01.559
Y esto lo podemos hacer consultando la base
de datos, InformationSchema, que tú ya sabes

03:01.559 --> 03:06.080
qué es, y que por defecto en MySQL viene ya
creada, con toda la información que necesitamos

03:06.080 --> 03:13.440
Y por eso podemos intuir que en este caso ya existe, porque si recuerdas en la clase
pasada tuvimos un mensaje de error, cuando rompimos esta consulta, y justamente en ese

03:13.440 --> 03:17.600
error nos decía que el sistema gestor de
bases de datos que estaba usando era MySQL

03:17.600 --> 03:24.800
Esto es información que tienes que ir anotando papá. Hay que fijarse en todos los detalles.
Ahora, en base a lo que tenemos ya controlado, lo más elemental de todo en este caso es

03:24.800 --> 03:28.800
identificar qué base de datos se está
usando ahora mismo, para esta aplicación web

03:28.800 --> 03:32.639
Y para esto, como tú ya sabes, tenemos varias
funciones, por ejemplo la función DATABASE

03:32.639 --> 03:37.000
que es cuando se ejecute, precisamente nos va a
devolver esto, el nombre de la base de datos actual

03:37.000 --> 03:40.800
Así que en este caso podemos hacer un SELECT
de la función DATABASE y de un valor NULL

03:40.800 --> 03:47.559
Y al ejecutar esta consulta, fíjate que por aquí nos la pone. Y podemos
determinar que la base de datos usada por la aplicación web en este momento

03:47.559 --> 03:51.679
es de VWA. Ahora, con esta información
presente, podemos ejecutar otro SELECT

03:51.679 --> 03:55.199
Y en este caso, basándonos en la estructura
de la information schema, podemos solicitar

03:55.199 --> 04:01.759
la columna TABLE NAME y un valor NULL. Desde la base de datos
information schema.TABLES, que recordemos que en este caso TABLES no

04:01.759 --> 04:07.000
es una tabla, es una vista. Y le indicamos con un WHERE,
que únicamente nos muestra la información de esta columna

04:07.000 --> 04:11.479
donde la columna TABLE SCHEMA sea igual a de
VWA, que es la base de datos que nos interesa

04:11.479 --> 04:16.720
Y acto seguido hacemos un comentario, por si quedara todavía
código de la consulta original, pues que este no se ejecute

04:16.720 --> 04:20.799
Y recuerda que como estamos en MySQL, podemos
comentar con un numeral. O almohadilla, viejo

04:20.799 --> 04:25.160
Y ten en cuenta, por aquí sí debemos referenciar
la vista TABLES, indicando concretamente la

04:25.160 --> 04:30.880
base de datos, donde ésta se encuentra. Y tenemos que indicárselo
porque la base de datos activa no es ésta, en este caso

04:30.880 --> 04:36.480
es de VWA. Ahora, si ejecutamos esta consulta, veremos
que nos arroja dos registros, que son correspondientes

04:36.480 --> 04:42.480
a los nombres de las tablas, dentro de la base de
datos de VWA. Y estas dos tablas son GUEST BOOK y USERS

04:42.480 --> 04:49.320
Aquí es evidente, viejo, la más jugosa es USERS. Por lo que vamos a seleccionarla.
Para en este caso, por ejemplo, conocer las columnas que estén dentro de esta tabla

04:49.320 --> 04:54.320
y seguir sacando información. Por lo que podríamos
hacer una nueva consulta SELECT a través de nuestro UNION

04:54.320 --> 04:59.119
En este caso seleccionando la columna COLUMN
NAME y un valor NULL, desde INFORMATION SCHEMA

04:59.119 --> 05:06.239
que es la base de datos, punto COLUMNS. Donde, en este caso, la columna
llamada TABLE NAME tenga el valor de USERS, porque es básicamente

05:06.239 --> 05:10.119
lo que queremos, solamente información
correspondiente a esta tabla, a la tabla USERS

05:10.119 --> 05:17.480
Y al ejecutar esta consulta, veremos ahora las columnas de dicha tabla. Por lo
que repasemos, ya entendemos que hay una base de datos llamada de VWA, que es la

05:17.480 --> 05:26.200
que está usando activamente la aplicación web, y que dentro de esta base de datos hay
una tabla llamada USERS, que tiene las siguientes columnas, USER ID, FIRST NAME, LAST NAME

05:26.200 --> 05:33.239
USER PASSWORD, AVATAR, LAST LOGGING y FAILED LOGGING. De estas columnas las
que nos enamoran a primera vista son las de USER y PASSWORD, evidentemente

05:33.239 --> 05:36.839
Así que en base a toda esta información
ya podríamos generar nuestro payload final

05:36.839 --> 05:41.519
es decir, hacer uso de UNION y seleccionar
la columna USER, la columna PASSWORD desde

05:41.519 --> 05:45.920
la tabla USERS. Y ten en cuenta, podríamos
especificar la base de datos, ¿o no

05:45.920 --> 05:50.119
En este caso da un poco igual esto, porque la
base de datos activa ya es de VWA, y poner

05:50.119 --> 05:56.160
de VWA.USERS es redondar un poco. Y ahora si ejecutamos esta
consulta, veremos los registros que pedimos, que en este caso

05:56.160 --> 06:00.600
son los nombres de usuario y sus contraseñas,
que en este caso están hasheadas, en MD5

06:00.600 --> 06:07.239
Por lo que así de simple, en base a la information schema, tú puedes obtener información
de la base de datos que usa la aplicación web, o de cualquier otra si quisieras, papá

06:07.239 --> 06:11.359
Y te digo, este procedimiento, obviamente
cambiando los valores, es de un uso bastante

06:11.359 --> 06:15.000
común, porque simplemente es hacer consultas
con lógica, elementos que están dentro del

06:15.000 --> 06:21.079
sistema gestor de bases de datos, para meramente obtener más
información. Y como ves, no es magia, es solamente usar la lógica

06:21.079 --> 06:25.559
Así que con esto explicado, vamos ahora si a
ver más tipos de inyecciones SQL, de tipo UNION

06:25.559 --> 06:32.160
Aunque te diría, que te repases esta clase, verás que mientras más veces la veas, más
vas a entender lo que hicimos, y es importante que este paradigma lo tengas claro, así que

06:32.160 --> 06:35.519
repásate la clase, papá. Y si ya
te la repasaste, pues continuemos
