### 简要描述: 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;...
### 简要描述: 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呢? 首先自己评论一下 [<img src="https://images.seebug.org/upload/201410/1122272537016c5297f9bd23acf02e1b9d17052c.jpg" alt="s1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/1122272537016c5297f9bd23acf02e1b9d17052c.jpg) 然后 [<img src="https://images.seebug.org/upload/201410/11222750568f94de9b7e545e44b66fd6fdfd84bc.jpg" alt="s2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/11222750568f94de9b7e545e44b66fd6fdfd84bc.jpg) 点一下引用 然后抓下包 就能看到 我们发的这个评论的cid为7 然后构造一下参数 在index.php中 把viewcomments.php中包含进来 [<img src="https://images.seebug.org/upload/201410/112230036bc0cdf7555bbf481e9c86c77e6e9586.jpg" alt="s3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/112230036bc0cdf7555bbf481e9c86c77e6e9586.jpg) 成功报错 [<img src="https://images.seebug.org/upload/201410/1122303473ff6a6b3e08f6f1b75cbe410ed43255.jpg" alt="s4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/1122303473ff6a6b3e08f6f1b75cbe410ed43255.jpg) 可以看到如果查看的不是自己发的评论 就出错额。 因为是update 所以自己update自己的groupid 为1 即可直接提升自己为管理。 http://127.0.0.1/dan/supesite/space.php?uid=13 首先进一下我们的个人主页 可以看到uid为13 然后构造一下语句 [<img src="https://images.seebug.org/upload/201410/11223401e8dc5bd019b9191bc961b2e2384d7f7d.jpg" alt="s5.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/11223401e8dc5bd019b9191bc961b2e2384d7f7d.jpg) 没报错了 语句成功执行 这里语句成功执行后 $_SGLOBAL['db']->query('DELETE FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\''); 就会执行这delete了。 就会删除这评论了 不过权限已提升了 [<img src="https://images.seebug.org/upload/201410/1122350383b9177802461afa8808c8858f3f9c51.jpg" alt="s6.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/1122350383b9177802461afa8808c8858f3f9c51.jpg) 提升权限 成功进后台 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201410/112230036bc0cdf7555bbf481e9c86c77e6e9586.jpg" alt="s3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/112230036bc0cdf7555bbf481e9c86c77e6e9586.jpg)