漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:Supesite 前台注入 #3 (Delete)
提交时间:2014-10-13 17:12
修复时间:2015-01-11 17:14
公开时间:2015-01-11 17:14
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情 披露状态:
2014-10-13: 细节已通知厂商并且等待厂商处理中 2014-10-14: 厂商已经确认,细节仅向厂商公开 2014-10-17: 细节向第三方安全合作伙伴开放 2014-12-08: 细节向核心白帽子及相关领域专家公开 2014-12-18: 细节向普通白帽子公开 2014-12-28: 细节向实习白帽子公开 2015-01-11: 细节向公众公开
简要描述: Delete 如果ucenter和supesite在一个裤的话 可以尝试把uckey注入出来 然后……
详细说明: 在cp.php中
$ac = empty($_GET['ac']) ? 'profile' : trim($_GET['ac']); if(in_array($ac, array('index', 'news', 'profile', 'credit', 'models'))) { include_once(S_ROOT.'./source/cp_'.$ac.'.php');
包含进来 在source/cp_news.php中
if(empty($itemid)) { //这里让$itemid 不为空 if(!empty($_SCONFIG['posttime']) && $_SGLOBAL['group']['groupid'] != 1) { if($_SGLOBAL['timestamp'] - $_SGLOBAL['member']['lastposttime'] < $_SCONFIG['posttime']) { showmessage('post_too_much'); } } $newsarr['uid'] = $_SGLOBAL['supe_uid']; $newsarr['username'] = $_SGLOBAL['supe_username']; $newsarr['dateline'] = $_SGLOBAL['timestamp']; if($_POST['fromtype'] == 'newspost') { $newsarr['fromtype'] = 'newspost'; $newsarr['fromid'] = intval($_POST['id']); } else { $newsarr['fromtype'] = 'userpost'; } if(!checkperm('allowdirectpost')) { $itemarr['itemid'] = inserttable('spaceitems', $newsarr, 1); inserttable('spacenews', $itemarr); getreward('postinfo'); postspacetag('add', $_POST['type'], $itemarr['itemid'], $tagarr,1); $do = 'pass'; } else { $itemarr['itemid'] = inserttable('postitems', $newsarr, 1); inserttable('postmessages', $itemarr); postspacetag('add', $_POST['type'], $itemarr['itemid'], $tagarr,0); $do = 'me'; } //更新用户最新更新时间 if($_SGLOBAL['supe_uid']) { updatetable('members', array('updatetime'=>$_SGLOBAL['timestamp'], 'lastposttime'=>$_SGLOBAL['timestamp']), array('uid'=>$_SGLOBAL['supe_uid'])); } } else { //进入else if(empty($_SGLOBAL['supe_uid'])) showmessage('no_permission'); updatetable('postitems', $newsarr, array('itemid'=>$itemid)); updatetable('postmessages', $itemarr, array('itemid'=>$itemid)); $itemid = empty($_POST['oitemid']) ? $itemid : $_POST['oitemid'];//没有intval postspacetag('update', $_POST['type'], $itemid, $tagarr, 0);//跟这里 }
function postspacetag($op, $type, $itemid, $tagarr, $status) { global $_SGLOBAL; $deletetagidarr = $addtagidarr = $spacetagidarr = array(); if($op == 'add') { //已经存在的tag,执行加入操作 if(!empty($tagarr['existsid'])) { $addtagidarr = $tagarr['existsid']; $_SGLOBAL['db']->query('UPDATE '.tname('tags').' SET spacenewsnum=spacenewsnum+1 WHERE tagid IN ('.simplode($tagarr['existsid']).')'); } } else { $query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacetags').' WHERE itemid=\''.$itemid.'\' AND status=\''.$status.'\'');//查询 while ($spacetag = $_SGLOBAL['db']->fetch_array($query)) { if(!empty($tagarr['existsid']) && in_array($spacetag['tagid'], $tagarr['existsid'])) { $spacetagidarr[] = $spacetag['tagid']; } else { $deletetagidarr[] = $spacetag['tagid'];//赋值 } } foreach ($tagarr['existsid'] as $etagid) { if(!empty($spacetagidarr) && in_array($etagid, $spacetagidarr)) { } else { $addtagidarr[] = $etagid; } } if(!empty($deletetagidarr)) { //这里要$deletetagidarr不为空 那么也就是要让 $query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacetags').' WHERE itemid=\''.$itemid.'\' AND status=\''.$status.'\'')这个查询出来的有内容 $_SGLOBAL['db']->query('DELETE FROM '.tname('spacetags').' WHERE itemid='.$itemid.' AND tagid IN ('.simplode($deletetagidarr).') AND status=\''.$status.'\'');//这里delete查询 WHERE itemid='.$itemid.' 没有被单引号引住。。 并且没intval导致注入 $_SGLOBAL['db']->query('UPDATE '.tname('tags').' SET spacenewsnum=spacenewsnum-1 WHERE tagid IN ('.simplode($deletetagidarr).')'); }
首先我们注册一个会员 然后投稿
投稿 这里tag 随便写一个 +--------+-------+------------+------+--------+ | itemid | tagid | dateline | type | status | +--------+-------+------------+------+--------+ | 3 | 1 | 1412680532 | news | 0 | | 4 | 2 | 1412680930 | news | 0 | 数据库里也就创建了。。 这里的itemid 在http://127.0.0.1/dan/supesite/cp.php?ac=news&op=view&itemid=4 地址中就能看到为4 然后在$query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacetags').' WHERE itemid=\''.$itemid.'\' AND status=\''.$status.'\''); 这里查询
这里查询 后面虽然跟了一些字符 提示warning 但是还是能查询出来。 $_SGLOBAL['db']->query('DELETE FROM '.tname('spacetags').' WHERE itemid='.$itemid.' AND tagid IN ('.simplode($deletetagidarr).') AND status=\''.$status.'\''); 然后就进来delete 里面没单引号 且无intval 导致注入。 投稿的时候抓包一下
成功出数据
漏洞证明: 修复方案: 版权声明:转载请注明来源 ′雨。 @乌云
漏洞回应 厂商回应: 危害等级:高
漏洞Rank:20
确认时间:2014-10-14 09:08
厂商回复: supesite已经停止维护。感谢您继续关注我们的其他产品
最新状态: 暂无