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

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

缺陷编号:wooyun-2014-079037

漏洞标题:Supesite 注入一枚 (可提升自己为管理)

相关厂商:Discuz!

漏洞作者: ′雨。

提交时间:2014-10-11 23:09

修复时间:2015-01-09 23:10

公开时间:2015-01-09 23:10

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

Supesite 注入出的密码 基本都破不出来
如果能够直接提升自己为管理员 或者 自己修改管理的密码那就再好不过了。
忙里偷闲。

详细说明:

在index.php中

if($_SGET['action'] != 'index') {
if(empty($channels['menus'][$_SGET['action']]['upnameid']) && $channels['menus'][$_SGET['action']]['upnameid'] != 'news') {
$scriptfile = S_ROOT.'./'.$_SGET['action'].'.php';
} else {
$scriptfile = S_ROOT.'./news.php';
}


这里包含文件进来。 来看看$_SGET 怎么来的。

if(empty($parsegetvar)) {
$parsegetvar = empty($_SERVER['QUERY_STRING'])?'':$_SERVER['QUERY_STRING'];
}
if(!empty($parsegetvar)) {
$parsegetvar = addslashes($parsegetvar); //这里转义了
$_SGET = parseparameter(str_replace(array('-','_'), '/', $parsegetvar)); // 这里 注册了这变量
}


function parseparameter($param, $nofix=1) {
global $_SCONFIG;
$paramarr = array();
if($nofix && !empty($_SCONFIG['pagepostfix'])) {
if(strrpos($param, $_SCONFIG['pagepostfix'])) {
$param = substr($param, 0, strrpos($param, $_SCONFIG['pagepostfix']));
}
}
$sarr = explode('/', $param);
if(empty($sarr)) return $paramarr;
if(is_numeric($sarr[0])) $sarr = array_merge(array('uid'), $sarr);
if(count($sarr)%2 != 0) $sarr = array_slice($sarr, 0, -1);
for($i=0; $i<count($sarr); $i=$i+2) {
if(!empty($sarr[$i+1])) $paramarr[$sarr[$i]] = addslashes(str_replace(array('/', '\\'), '', rawurldecode(stripslashes($sarr[$i+1]))));
}
return $paramarr;
}


这里用/来切割成数组 然后就return 。
在viewcomment.php中

if(!empty($_SGET['op']) && $_SGET['op'] == 'delete') {
$cid = empty($_SGET['cid'])?0:intval($_SGET['cid']);
$ismodle = empty($_SGET['ismodle']) ? 0 : intval($_SGET['ismodle']);
$table_name = ( $ismodle && !empty($_SGET['type']) ? $_SGET['type'] : 'space' ).'items';

if(empty($cid)) showmessage('not_found', S_URL);
$itemid = empty($_SGET['itemid'])?0:intval($_SGET['itemid']);
if(empty($itemid)) showmessage('not_found', S_URL);
$deleteflag = false;
if(empty($_SGLOBAL['group'])) {
showmessage('no_permission');
}
if($cid && $itemid && $_SGLOBAL['supe_uid']) {
$query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'');
if($comment = $_SGLOBAL['db']->fetch_array($query)) {
if($_SGLOBAL['group']['groupid'] == 1 || $comment['authorid'] == $_SGLOBAL['supe_uid']) {
$_SGLOBAL['db']->query('UPDATE '.tname($table_name).' SET replynum=replynum-1 WHERE itemid=\''.$comment['itemid'].'\'');
$_SGLOBAL['db']->query('DELETE FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'');


这里 我们来看这里 UPDATE '.tname($table_name).

$ismodle = empty($_SGET['ismodle']) ? 0 : intval($_SGET['ismodle']);
$table_name = ( $ismodle && !empty($_SGET['type']) ? $_SGET['type'] : 'space' ).'items'; //这里如果$ismodle为true的话 那么$table_name 就为$_SGET['type'] 刚好$ismodle 也是$_SGET来的 在结合index.php里的注册$_SGET 那么则table_name可控了


if($cid && $itemid && $_SGLOBAL['supe_uid']) { //这里cid 和 itemid 都是index.php中注册的$_SGET来的 $_SGLOBAL['supe_uid'] 这个只要登录了用户就行
$query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'');//把评论查询出来
if($comment = $_SGLOBAL['db']->fetch_array($query)) {
if($_SGLOBAL['group']['groupid'] == 1 || $comment['authorid'] == $_SGLOBAL['supe_uid'])//这里必须是管理员 或者 你查看的是自己的评论 那么我们就自己评论一个
{
$_SGLOBAL['db']->query('UPDATE '.tname($table_name).' SET replynum=replynum-1 WHERE itemid=\''.$comment['itemid'].'\'')//table_name可控 注入;


首先先注册一个会员
这里我们先随便找一个新闻页面 然后自己评论一下
'SELECT * FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\''
这里由于我们只能查看自己的评论
这里怎么查看自己评论的cid呢?
首先自己评论一下

s1.jpg


然后

s2.jpg


点一下引用 然后抓下包 就能看到 我们发的这个评论的cid为7
然后构造一下参数 在index.php中 把viewcomments.php中包含进来

s3.jpg


成功报错

s4.jpg


可以看到如果查看的不是自己发的评论 就出错额。
因为是update 所以自己update自己的groupid 为1 即可直接提升自己为管理。
http://127.0.0.1/dan/supesite/space.php?uid=13
首先进一下我们的个人主页 可以看到uid为13
然后构造一下语句

s5.jpg


没报错了 语句成功执行
这里语句成功执行后
$_SGLOBAL['db']->query('DELETE FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'');
就会执行这delete了。 就会删除这评论了 不过权限已提升了

s6.jpg


提升权限 成功进后台

漏洞证明:

s3.jpg

修复方案:

限制tablename

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-10-13 09:45

厂商回复:

supesite 产品已经停止维护,感谢您关注我们的产品。

最新状态:

暂无