禅道 <= 12.4.2 后台文件上传漏洞 (CNVD-C-2020-121325)
环境搭建
mkdir /data/zbox/ &&
docker run -d -p 80:80 -p 3306:3306 \
-e ADMINER_USER="admin" -e ADMINER_PASSWD="password" \
-e BIND_ADDRESS="false" \
-v /data/zbox/:/opt/zbox/ \
--add-host smtp.exmail.qq.com:163.177.90.125 \
--name zentao-server \
idoop/zentao:latest
漏洞利用
漏洞分析
- 入口
根据 禅道 源码分析得知,禅道内部路由方式调用函数的方式为上图所示,即调用 download 函数的时候请求的 url 为 $module-download-1.html
- 漏洞函数
根据源码所示逻辑,当访问 download 函数时提供两个参数 version
和 link
,downloadZipPackage 函数会创建 version
文件夹并下载 link
文件到该文件夹,根据上述逻辑构造 poc 如下
GET http://172.16.29.3/zentao/client-download-1-ZnRwOiBodHRwOi8vMTI3LjAuMC4xL3Rlc3QudHh0-1.html
这个接口正常的作用是用来下载更新,具体如下:
- 解释一下,避免有人把其中部分非特征的特征作为检测标准
GET http://172.16.29.3/zentao/
通过 GET 的方式请求 http://172.16.29.3/zentao/
client-download-1-ZnRwOiBodHRwOi8vMTI3LjAuMC4xL3Rlc3QudHh0-1.html
这个为向接口传递参数的格式,client-download
为这个函数调用的路径 1
本意是传递下载文件的版本号 ZnRwOiBodHRwOi8vMTI3LjAuMC4xL3Rlc3QudHh0
为 base64 加密后的文件下载地址,最后一个 1
为下载文件针对的 os 版本。
- 正确的接口请求
/zentao/client-download-3.3-aHR0cHM6Ly9kbC5jbmV6c29mdC5jb20vemVudGFvY2xpZW50LzMuMy96ZW50YW9jbGllbnQud2luNjQuemlw-win64zip.html
防御方式
由于暂未充分了解该函数的具体功能及可能出现的各种状况,根据防止高危入侵的原则,流量侧检测逻辑为: base64 加密后的 link 为 php 文件,可以进行拦截
进一步分析后可以使用的检测方案为:
- 检测 version 参数是否为
3.3
这种格式 - 检测解码后的下载链接是否为
zip
后缀 - 检测 os 参数是否为官方白名单中的参数
suricata && snort 检测规则
alert tcp any any -> any $HTTP_PORTS (msg:"SERVER-WEBAPP 禅道 <= 12.4.2 后台文件上传漏洞"; flow:to_server; content:"GET"; http_method; content:"client-download"; http_uri; nocase; fast_pattern; pcre:"/client-download\-.+\-(?!(aHR0cHM6Ly9kbC5jbmV6c29mdC5jb20vemVudGFvY2xpZW50))[a-zA-Z0-9\=]{0,}.+\.html/I"; classtype:web-application-attack; sid:123; rev:1; metadata:2020_10_27,by_co0ontty;)