Discuz7.1和7.2 0远程代码执行漏洞Webshell
yDiscuz! Board 论坛系统(简称 Discuz! 论坛)是一个采用 PHP 和 MySQL 等其它多种数据库构建的高效论坛解决方案。
作为商业软件产品, Discuz! 在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面有着良好的口碑。
对于站长而言,利用 Discuz! 均能够在最短的时间内,花费最低的费用,采用最少的人力,架设一个性能优异、功能全面、安全稳定的社区论坛平台。
它能运行于Windows平台和Linux平台,本次要讲解的是只要是注册用户即可轻松获取Webshell
在Discuz! 7.1与7.2版本中的showmessage函数,由于eval中执行的参数未初始化,可以任意提交,从而可以执行任意PHP命令。
该漏洞的首发是T00ls核心团队,下面来分析下这个远程代码执行漏洞,这个问题真的很严重,可以直接写shell。
漏洞来源
一、漏洞来自showmessage函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
function
showmessage($message,
$url_forward
=
'',
$extra
=
'',
$forwardtype
=
0)
{
extract($GLOBALS,
EXTR_SKIP);//危险的用法,未初始化的变量可以直接带进函数,直接导致了问题产生,from exehack.net
global
$hookscriptmessage,
$extrahead,
$discuz_uid,
$discuz_action,
$debuginfo,
$seccode,
$seccodestatus,
$fid,
$tid,
$charset,
$show_message,
$inajax,
$_DCACHE,
$advlist;
define('CACHE_FORBIDDEN',
TRUE);
$hookscriptmessage
=
$show_message
=
$message;$messagehandle
=
0;
$msgforward
=
unserialize($_DCACHE['settings']['msgforward']);
$refreshtime
=
intval($msgforward['refreshtime']);
$refreshtime
=
empty($forwardtype)
?
$refreshtime
:
($refreshtime
?
$refreshtime
:
3);
$msgforward['refreshtime']
=
$refreshtime *
1000;
$url_forward
=
empty($url_forward)
?
''
:
(empty($_DCOOKIE['sid'])
&&
$transsidstatus
?
transsid($url_forward)
:
$url_forward);
$seccodecheck
=
$seccodestatus
&
2;
if($_DCACHE['settings']['funcsiteid']
&&
$_DCACHE['settings']['funckey']
&&
$funcstatinfo
&&
!IS_ROBOT)
{
$statlogfile
=
DISCUZ_ROOT.'./forumdata/funcstat.log';
if($fp
=
@fopen($statlogfile,
'a'))
{
@flock($fp,
2);
if(is_array($funcstatinfo))
{
$funcstatinfo
=
array_unique($funcstatinfo);
foreach($funcstatinfo as
$funcinfo)
{
fwrite($fp,
funcstat_query($funcinfo,
$message)."\n");
}
}
else
{
fwrite($fp,
funcstat_query($funcstatinfo,
$message)."\n");
}
fclose($fp);
$funcstatinfo
=
$GLOBALS['funcstatinfo']
=
'';
}
}
if(!defined('STAT_DISABLED')
&&
STAT_ID
>
0
&&
!IS_ROBOT)
{
write_statlog($message);
}
if($url_forward
&&
(!empty($quickforward)
||
empty($inajax)
&&
$msgforward['quick']
&&
$msgforward['messages']
&&
@in_array($message,
$msgforward['messages'])))
{
updatesession();
dheader("location: ".str_replace('&',
'&',
$url_forward));
}
if(!empty($infloat))
{
if($extra)
{
$messagehandle
=
$extra;
}
$extra
=
'';
}
if(in_array($extra,
array('HALTED',
'NOPERM')))
{
$discuz_action
=
254;
}
else
{
$discuz_action
=
255;
}
include language('messages');
$vars
=
explode(':',
$message);//只要含:就可以了
if(count($vars)
==
2
&&
isset($scriptlang[$vars[0]][$vars[1]]))
{//两个数字即可,用:分割
eval("\$show_message = \"".str_replace('"',
'\"',
$scriptlang[$vars[0]][$vars[1]])."\";");//$scriptlang未初始化,可以自定义,from www.myhack58.com }
elseif(isset($language[$message]))
{
$pre
=
$inajax
?
'ajax_'
:
'';
eval("\$show_message = \"".(isset($language[$pre.$message])
?
$language[$pre.$message]
:
$language[$message])."\";");
unset($pre);
}
......
}
|