pgAdmin 漏洞浅析
中午拜读了p神的文章后决定复现分析一下,并且借此机会将前两个漏洞也分析一下
CVE-2022-4223
pgAdmin <= 6.16
看commit,添加了需要登录的修饰@login_required以及添加了os.path.exists来判断传入路径是否合法
所以问题可以确定集中在validate_binary_path上,拿到其源码,为路由/misc/validate_binary_path的路由处理函数,比较明显,将输入的参数拼接当前路径,然后便利UTILITIES_ARRAY,将其拼接到路径后,调用subprocess.getoutput直接执行了
利用条件如何呢,由于修改后添加了@login_required所以无需登录即可调用,尝试直接post访问,提示没有CSRF token
其实csrf token直接跟login界面返回,我们直接用就可以
然后拼接命令执行即可
比较简单的一个未授权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,我们可以利用上传恶意文件名文件进行路径包含利用
上传文件会直接返回完整路径
利用提供的功能成功利用
也是一个简单的文件上传 + 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后第一个为命令,这个命令是执行文件,后面都是参数)
漏洞利用到了UTILITIES_ARRAY中的文件,登录后使用上一个漏洞的上传文件方式上传一个恶意psql文件,然后就可以直接执行
但这种方式由于Linux执行权限,导致上传后无法执行,所以这种方式只存在于Windows上
尝试复现了一下
shell.c
|
|
编译一下上传上去,并改名为psql
发包执行即可