[Solucionado] Postgresql Injection - Como funciona está inyección?

Iniciado por Sudox, Mayo 11, 2022, 12:57:06 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 11, 2022, 12:57:06 PM Ultima modificación: Mayo 11, 2022, 02:35:21 PM por NotARogueDev
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:


  • x' or pg_sleep(10)--
  • ' and pg_sleep(10)--
  • x' or sleep(10)--

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...



Sr Java Developer for a big tech Company
Learning hacking in the nigths.

¿¿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 || ??

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

Mayo 11, 2022, 02:30:09 PM #2 Ultima modificación: Mayo 11, 2022, 02:35:00 PM por NotARogueDev
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.



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!!!
Sr Java Developer for a big tech Company
Learning hacking in the nigths.

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.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

Al parecer si tiene relevancia,



aquí ejecuté el mismo payload pero esta vez con el operador || y corrió sin errores
Sr Java Developer for a big tech Company
Learning hacking in the nigths.

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.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

Entiendo, muchas gracias por la aclaración.
Salu2!
Sr Java Developer for a big tech Company
Learning hacking in the nigths.