Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Sudox en Mayo 11, 2022, 12:57:06 PM

Título: [Solucionado] Postgresql Injection - Como funciona está inyección?
Publicado por: Sudox en Mayo 11, 2022, 12:57:06 PM
Saludos gente, estoy haciendo los labs de la Web Security Academy de Burpsuite, y estoy aprendiendo cosas muy interesante.
Recientemente he llegado a un lab donde se trata de un web site que tiene una cookie que es vulnerable a SQLi, el lab dice que se puede explotar con conditional delays.

He intentado de muchas maneras:


Entre otras varias mas...
Pero hay una en particular que funciona

' || pg_sleep(10)--

A lo que me brinca el ojo al tratar de entender por qué usando el operador de concatenación de postgres se consigue introducir el delay, mientras que con otras condiciones basadas en lógica booleana simplemente no funciona?

Agradeceria cualquier recurso para tratar de entender esto, he estado mirando en la documentación de postgres y lo que veo es que el pg_sleep retorna void, pero no entiendo como no es ejecutada la instrucción del delay, acaso el planner de la db sabe de antermano que no existe forma de lograr que la condicion booleana sea exitosa (true) usando un sleep con un operador?

happy hacking...



Título: Re: Postgresql Injection - Como funciona está inyección?
Publicado por: animanegra en Mayo 11, 2022, 01:41:47 PM
¿¿No se el caso particular pero has pensado en la posibilidad de que en el codigo que ejecuta la sentencia se esté filtrando los AND y los OR pero no sus versiones && y || ??
Título: Re: Postgresql Injection - Como funciona está inyección?
Publicado por: Sudox en Mayo 11, 2022, 02:30:09 PM
Saludos, eso que comentas tiene sentido, sin embargo cabe destacar que en postgres el operador || funciona para hacer concatenacion y no como un booleano (como lo haría OR).

Aquí me he animado a montar un container con postgres en docker y traté de correr el payload y obtuve lo siguiente.

(https://i.imgur.com/qoeH9aG.png)

Creo que es bastante claro para mi a este punto, es por el tipo de retorno que espera el operador OR, dado que pg_sleep() retorna void el operador OR no puede preceder a la funcion per sé.
pero por el contrario || acepta cualquier tipo de dato por lo que el void no generara un error de sql.

Creo que esperare un poco mas antes de marcarlo como resulto por si depronto alguien mas quiere aportar un punto de vista valido distinto al expuesto.
Saludos!!!
Título: Re: [Solucionado] Postgresql Injection - Como funciona está inyección?
Publicado por: animanegra en Mayo 11, 2022, 02:52:17 PM
Pero es irrelevante que funcione como operador or o no, si es una concatenacion, tiene que ejecutar la funcion para poder concatenar su resultado con lo anterior.
Título: Re: [Solucionado] Postgresql Injection - Como funciona está inyección?
Publicado por: Sudox en Mayo 11, 2022, 03:45:50 PM
Al parecer si tiene relevancia,

(https://i.imgur.com/dBiZJJi.png)

aquí ejecuté el mismo payload pero esta vez con el operador || y corrió sin errores
Título: Re: [Solucionado] Postgresql Injection - Como funciona está inyección?
Publicado por: animanegra en Mayo 12, 2022, 04:13:56 AM
Bueno, me referia al caso de que desees que se ejecute una funcion. Tu tenias puesto el || junto a una funcion que corria un sleep, el sleep se va a ejecutar independientemente de que lo que salga pueda o no concatenarse con lo anterior.Despues te podría dar error o no cuando intenta realizar la concatenación.
Título: Re: [Solucionado] Postgresql Injection - Como funciona está inyección?
Publicado por: Sudox en Mayo 12, 2022, 10:41:39 AM
Entiendo, muchas gracias por la aclaración.
Salu2!