首先附上米斯特安全大佬们文章的 链接 https://mp.weixin.qq.com/s/5Zl3Jve4eblNIXh30t469w , 刚开始有些东西我没看的太懂, 于是我就再添了点东西, 希望像我一样的小白也能看懂.
一, 漏洞综述
漏洞类型: 代码执行漏洞
影响系统及版本: Discuz!!ML V3.2-3.4
漏洞原因: Discuz!!ML 系统对 cookie 中的 l 接收的 language 参数内容未过滤, 导致字符串拼接, 从而执行 PHP 代码.
二, 漏洞分析
根据米斯特大佬们提供的报错界面, 我对其中的三个报错点一一进行了分析, 三个报错点如下图所示 (还有米斯特大佬们的水印).
2.1 报错点一分析
发现首先是 portal.PHP 函数出错, 把这张图放大看, 发现是对 cookie 中的 language 参数进行拼接而导致的报错, 根据这个参数的语义判断应该是调用语言模板的时候因为找不到相应的模板而发生的错误, 那么先定位 portal.PHP 报错的第 35 行, 该文件路径:
紧接着定位 libfile 函数, 文件加载路径函数.
函数介绍:
libfile($libname, $folder = "), 包含 2 个参数:$libname 和 $folder, 该函数读取 source 目录下的 $folder 子目录作为基础部分.
例如 require_once libfile('function','plugin/test/'); 实际为 require_once/source/plugin/test/function.PHP
libfile 函数源代码如下图所示:
DISCUZ_ROOT 为定义网站根目录的常量, realpath 函数为返回绝对路径函数, 到此处第一个报错就已经分析完毕, 原因是系统因为找不到一个 PHP 文件而报的错.
好像第一个错误没有什么用, 接着开始分析第二个错误.
2.2 报错点二分析
还是先根据错误定位到引用函数文件, 文件路径 source/module/portal/portal_index.PHP , 然后定位到源函数所在的文件, 引用的地方好定位, 位置在 /source/function/function_core.PHP , 直接上图
然后这个函数写的还贼长, 哎, 没得办法, 这个时候只能靠运气了, 搏一搏, 单车变摩托, 首先百度, 这个函数的作用也就是个调用模板的函数.
然而这个函数写了 160 行代码, 找个大表哥的写的代码注释吧, 先扔个参考链接 http://www.discuz.net/thread-2702143-1-1.html .
此时我发现了思路有些繁琐, 然后就去找第三个错误的提示内容, 为了找到是哪里出了问题, 我把这段代码放到了 txt 文件中, 根据第三个错误提示的信息开始了全文搜索, 终于, 根据关键字 tpl.PHP 值搜索到一处与 language 这个函数语义有关的东西 DISCUZ_LANG.
既然是语言参数出了问题, 还是个常量, 那就去找找常量定义的地方, 全局搜 DISCUZ_LANG, 跟踪到 / source/class/Discuz!/discuz_application.PHP
可以看到, 将 $lng 的值给了 DISCUZ_LANG, 追踪 $lng 在何处定义, 全局搜索 $lng, 找到了定义 $lng 的地方 (图中第一个箭头)
到此为止, 又出现个 var, 这是个啥, 我只知道 var['cookie']['language'] 的意思就是 cookie 中的 language 的值.
以上可以分析出, 从获取 language 到 DISCUZ_LANG 拿到值的过程中, 并没有对其进行过滤.
那么现在必须确定报错问题是怎么出现的了, 看下图:
出现了这样的代码, 直接拼接, 然后 RCE
$cachefile ='./data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID')?STYLEID.'_':'_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
拼接单引号和'. phpinfo() .'
'./data/template/'.'.phpinfo().'.'_'.(defined('STYLEID')?STYLEID.'_':'_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
按理来说可以 RCE
总结下大概流程从 cookie 中获取了 language 的值, 然后给了 $lng, 接着 $lng 又给了 DISCUZ_LANG, 系统通过 template 函数调用模板文件, template 函数执行, 执行到 $cachefile 的时候, 执行构造的代码.
三, 漏洞复现
访问站点 www.***.com/forum.PHP, 刷新页面抓包
来源: http://www.tuicool.com/articles/RN3MNzE