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...
¿¿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 || ??
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!!!
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.
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
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.
Entiendo, muchas gracias por la aclaración.
Salu2!