专栏首页安全漏洞环境学习Discuz! X 3.4 ML 任意代码执行漏洞复现

Discuz! X 3.4 ML 任意代码执行漏洞复现

0X1 漏洞概述

2019年7月11日,网络上出现了一个Discuz!ML远程代码执行漏洞的PoC,研究员验证分析发现,攻击者能够利用该漏洞在请求流量的cookie字段中(language参数)插入任意代码,执行任意代码,从而实现完全远程接管整个服务器的目的,该漏洞利用方式简单,危害性较大。漏洞影响范围包括如下版本。

Discuz! ML v.3.4、Discuz! ML v.3.3、Discuz! ML v.3.2
源码下载链接:https://bitbucket.org/vot/discuz.ml/downloads/

0X2 漏洞分析

根据公告定位文件source/module/portal/portal_index.php第32行

查看问题函数上方查看定义函数以及关联文件的位置,可以看到template函数在/source/function/function_core.php中,继续跟进

问题代码如下所示。

  $cachefile = './data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';

程序将缓存文件写在了/data/template/目录下,文件名由DISCUZ_LANG等多个变量组成,问题就出在这儿了,看看DISCUZ_LANG的值是哪儿获取来的:

可以看到从程序全部变量$_G['config']['output']['language']中获取了该值。继续跟进看看该值可以定位到/source/class/discuz/discuz_application.php:

在304行,系统通过Cookie获取了语言的值,并在341行定义了前面要找的DISCUZ_LANG,值为Cookie中获取到的$lng。可以看到整个过程没有任何的过滤。整个流程即就是:外部参数`$lng`(即language语言)可控,导致`template` 函数生成的临时模板文件名可操纵,插入自己的代码,最终`include_once`包含一下最终导致了代码注入。那这里可以搜一下其他的可利用点,全局查找:

大约有60多个点可以用的。

0X3 漏洞利用

访问论坛主页,在Cookie的language字段值后面拼接php代码:

'.phpinfo().'

执行命令获得管理员权限:

0X4 漏洞修复

在/source/class/discuz/discuz_application.php 第338行之后341行之前加入该代码暂缓此安全问题:

$lng = str_replace("(","",$lng);$lng = str_replace(")","",$lng);$lng = str_replace_replace('"',"",$lng);$ln("'","",$lng);$lng = strg = str_replace('`',"",$lng);

本文分享自微信公众号 - 安全漏洞环境学习(gh_ddd854e535b8),作者:墙角睡大觉

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kali 2019.1最新版发布

    Offensive Security 刚刚发布了Kali Linux 2019.1

    墙角睡大觉
  • Hack the LAMPSecurity: CTF8 (CTF Challenge)

    欢迎来到boot2root CTF挑战“LAMPSecurity:CTF8”由madirsh2600上传到vulnhub。因为,有一个主题,你需要获取flag以...

    墙角睡大觉
  • CVE-2019-11043PHP-FPM在Nginx特定配置下远程代码执行漏洞复现

    9月26日,PHP官方发布漏洞通告,提到Nginx与php-fpm服务器上存在的一处高危漏洞,由于Nginx的fastcgi_split_path_info模块...

    墙角睡大觉
  • engineercms分享文件提取码-参考蓝眼云盘

    因为蓝眼云盘也是采用go语言+gorm编写的,所以参考起来稍微轻松一点。主要还是了解如何通过一段提取码就能取到文件的访问权。

    hotqin888
  • java泛型:通过自定义ParameterizedType实现参数化类型中类型参数的替换

    需求说明 如果要动态构造一个泛型参数对象(ParameterizedType),guava提供的TypeToken工具可以部分实现这个功能: 比如下面这个例...

    用户1148648
  • FunTester测试框架视频讲解(序)

    本人使用Java语言基于httpclient做了一个测试框架,包括功能、自动化和性能测试的能力,之前都是写一些文章分享一些案例,打算做一些新的尝试,希望效果能比...

    八音弦
  • 爬虫必备库‘requests’详解(二)

    今日分享:requests库详解 上一篇文章爬虫必备库‘requests’主要说了下Pytohn第三方库--Requests库的安装与简单测试,今天详细介绍Re...

    企鹅号小编
  • react-native学习之入门app

    1、项目初始化: react-native init MyProject 2、启动项目: cd MyProject react-native start 新开c...

    用户1141560
  • 张汝京与台积电张忠谋有哪些恩恩怨怨?张汝京对我国的芯片发展有什么贡献?

    张汝京可以算的是中国的半导体之父,到现在还在已经70多岁了还在努力创业,中国半导体行业的拓展离不开张汝京的贡献,现在的台积电之父张忠谋已经隐退不问世事了,张汝京...

    程序员互动联盟
  • ThinkPHP5.1 使用 web-msg-sender 实现WEB消息推送实例讲解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    泥豆芽儿 MT

扫码关注云+社区

领取腾讯云代金券