pgAdmin 漏洞浅析

中午拜读了p神的文章后决定复现分析一下,并且借此机会将前两个漏洞也分析一下

CVE-2022-4223

pgAdmin <= 6.16

commit,添加了需要登录的修饰@login_required以及添加了os.path.exists来判断传入路径是否合法

image-20240407151421131

所以问题可以确定集中在validate_binary_path上,拿到其源码,为路由/misc/validate_binary_path的路由处理函数,比较明显,将输入的参数拼接当前路径,然后便利UTILITIES_ARRAY,将其拼接到路径后,调用subprocess.getoutput直接执行了

image-20240407154555860

利用条件如何呢,由于修改后添加了@login_required所以无需登录即可调用,尝试直接post访问,提示没有CSRF token

image-20240407155234850

其实csrf token直接跟login界面返回,我们直接用就可以

image-20240407172232369

然后拼接命令执行即可

image-20240407173634936

比较简单的一个未授权rce

CVE-2023-5002

pgAdmin <= 7.6

上面分析知道对于4223的修补:添加@login_required限制未授权、使用os.path.exists()检查路径合法性

在windows平台调用os.path.exists()系统会首先调用normalize处理后再判断,所以针对上面的payload,我们再登录后可以直接a";cmd;/../绕过

针对Linux,是另一条利用,因为硬性需要我们登录,所以我们登录后在后台中利用Tools -> Storage Manager,我们可以利用上传恶意文件名文件进行路径包含利用

上传文件会直接返回完整路径

image-20240410155956364

利用提供的功能成功利用

image-20240410160310969

也是一个简单的文件上传 + rce,利用条件比较苛刻,需要登录

CVE-2024-3116

pgadmin <= 8.4

CVE-2023-5002修复:https://github.com/pgadmin-org/pgadmin4/pull/6775/commits/1f4fe67af9b37b2224aac75f5f39093137d5fad5

封装了一个新函数用来处理路径,将os.path.exist更换为os.path.isdir,并且调用subprocess.run来执行命令并且shell设置为false(设为false后第一个为命令,这个命令是执行文件,后面都是参数)

image-20240410161626145

漏洞利用到了UTILITIES_ARRAY中的文件,登录后使用上一个漏洞的上传文件方式上传一个恶意psql文件,然后就可以直接执行

但这种方式由于Linux执行权限,导致上传后无法执行,所以这种方式只存在于Windows上

尝试复现了一下

shell.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc > 1 && strcmp(argv[1], "--version") == 0) {
        system("echo 123 > 123.txt");
    } else {
        printf("Usage: %s --version\n", argv[0]);
    }

    return 0;
}

编译一下上传上去,并改名为psql

image-20240410173509107

发包执行即可

image-20240410173217771
0%