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

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

缺陷编号:wooyun-2014-071516

漏洞标题:Discuz 5.x 6.x 7.x 前台SQL注入漏洞一枚

相关厂商:Discuz!

漏洞作者: ′雨。

提交时间:2014-08-08 10:46

修复时间:2014-11-06 10:48

公开时间:2014-11-06 10:48

漏洞类型:SQL注射漏洞

危害等级:低

自评Rank:1

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-08: 细节已通知厂商并且等待厂商处理中
2014-08-12: 厂商已经确认,细节仅向厂商公开
2014-08-15: 细节向第三方安全合作伙伴开放
2014-10-06: 细节向核心白帽子及相关领域专家公开
2014-10-16: 细节向普通白帽子公开
2014-10-26: 细节向实习白帽子公开
2014-11-06: 细节向公众公开

简要描述:

自从补课补完了 感觉自己都完全荒废了。
睡觉 看电视 看小说。 唉。
得开始努力学习考大学 哦也。
_________________________________________________________________________
看到map牛 发了几个dz7.2的 也看到还在更新 我也就看了看
前台注入一枚, 也都知道 如果ucenter 和 DZ 在一个裤里面的话就可以拿到uc_key
拿到uc_key了 然后……。
很简单的一个洞。

详细说明:

http://download.discuz.net/Discuz/7.2/Discuz_7.2_SC_GBK.zip
刚在官网下的这个。
首先说一下 这洞需要有权限发布投票才行 刚注册的会员是不能发布投票的
我看了下默认发布投票需要的权限 需要从注册会员开始才有发布投票的权限

1.jpg


2.jpg


看了一下注册会员所需要的积分是50分
50分 上传个头像 做个任务就差不多了(所以狗哥 这不算限制条件把?)
_________________________________________________________________________
在post.php中
从263行开始 也就是最后的那几行

if($action == 'newthread') {
($forum['allowpost'] == -1) && showmessage('forum_access_disallow');
require_once DISCUZ_ROOT.'./include/newthread.inc.php';
} elseif($action == 'reply') {
($forum['allowreply'] == -1) && showmessage('forum_access_disallow');
require_once DISCUZ_ROOT.'./include/newreply.inc.php';
} elseif($action == 'edit') {
($forum['allowpost'] == -1) && showmessage('forum_access_disallow');
require_once DISCUZ_ROOT.'./include/editpost.inc.php';
} elseif($action == 'newtrade') {
($forum['allowpost'] == -1) && showmessage('forum_access_disallow');
require_once DISCUZ_ROOT.'./include/newtrade.inc.php';
}


包含了这么多文件进来 我找了这个文件看了起来include/editpost.inc.php
然后在include/editpost.inc.php 第272行左右

if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls)) {
$pollarray = '';
$pollarray['options'] = $polloption;
if($pollarray['options']) {
if(count($pollarray['options']) > $maxpolloptions) {
showmessage('post_poll_option_toomany');
}
foreach($pollarray['options'] as $key => $value) {
if(!trim($value)) {
$db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'");
unset($pollarray['options'][$key]);
}
}
$polladd = ', special=\'1\'';


foreach($pollarray['options'] as $key => $value) {
这里直接把数组中的key带入到了delete查询当中。
再来看一下dz的全局文件

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}


function daddslashes($string, $force = 0) {
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}


这里先判断了gpc是否开启 如果没有开启 就用addslashes再来转义
这里对数组中的value进行转义 key无过滤。

$db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'


所以再进行这个查询的时候 我们就可以引入单引号了。
_______________________________________________________________
在执行循环之前有一个条件
if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls))
这里($alloweditpoll || $isorigauthor) $isorigauthor判断是不是你是作者 如果你编辑的是你的文章的话 肯定是true。 $polls 这个直接就可以控制。
$thread['special'] == 1 之前我一直在纠结这个是啥东西。。
后面看了看发文章的时候的代码 这个$thread['special'] == 1代表的就是发布的是投票。
那如果我们自己发布一个投票 然后再编辑 就可以进入这里了。

3.jpg


首先发布一个投票。 发布完后 再点击编辑。
然后再抓一下包。
这里我输出了一下

$polladd = '';
if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls)) {
$pollarray = '';

$pollarray['options'] = $polloption;
var_dump ($polloption);exit;//输出


4.jpg


我擦 一看竟然已经有值了?
在这里我本来已经准备放弃了, 但是还是抱着试一试的态度 在url写了这个

5.jpg


发现还是可以控制 而且单引号 理所应当的没有被转义。
那不是就可以注入了吗? 构造一下语句。

if(!trim($value)) {
$db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'");


因为这里 数组中的value为false的时候才会进去
所以这里数组的value我们就不写

6.jpg


成功出数据。

漏洞证明:

6.jpg

修复方案:

foreach($pollarray['options'] as $key => $value) {
$key=addslashes($key);
if(!trim($value)) {
$db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'");
? 还是看你们把。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-08-12 12:38

厂商回复:

问题收下。感谢您对discuz的关注,不过对于 dz7以及之前的版本,我们已经停止维护,产品距离现在都4,5年了。我们只能尽力敦促用户尽可能的升级到最新版

最新状态:

暂无