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

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

缺陷编号:wooyun-2013-043238

漏洞标题:记事狗微博全版本注册管理员漏洞

相关厂商:杭州神话

漏洞作者: Chora

提交时间:2013-11-18 14:03

修复时间:2014-02-16 14:04

公开时间:2014-02-16 14:04

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

每个月总有那么几天没有饭吃。

详细说明:

问题出在一个通用函数上,只要用到这个函数的都存在漏洞,爆管理账号密码的我就不写了,密码有salt意义不大。如果能绕过通用防注入,这套系就太多漏洞了。很多地方都是因为不能注释,闭合不了,而不能进行利用,虽然很多地方都能引入引号但是过滤了一些危险函数。总体来讲还是挺安全的。
include/class/passport.class.php

function login($nickname, $password, $is = '') {
......
$member = $this->login_check($nickname, $password, $is);
$_uid = $member['uid'];
if($_uid < 1)
{
$error = '登录失败: ' . $login_rets[$_uid];
return array('uid' => $_uid, 'error'=>$error);
}
else //登陆成功
{
$member['uc_syn_html'] = $uc_syn_html;

$timestamp=time();
$last_ip=client_ip();//问题出在这儿,跟进0x01
$sql="
UPDATE
".TABLE_PREFIX.'members'."
SET
`lastactivity`='{$timestamp}',
`lastip`='{$last_ip}'
WHERE
uid={$_uid}";
DB::query($sql);
}


include/function/global.func.php 0x01

function client_ip() {
$vs = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'); //HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR是可伪造的。
foreach($vs as $v) {
$ip = (getenv($v) ? getenv($v) : $_SERVER[$v]);
if($ip && strcasecmp($ip, 'unknown')) {
break;
}
}
$ips = explode('.', $ip);
/*
以点号为分隔符,分割IP.然后将每一位与1比较,看是否小于1,如果小于1,ip=127.0.0.1我们提交
1.1.1.1',role_id=2,role_type='admin
第一个1不小于1,第二个1不小于1,第3个1不小于1,第4个1',role_id=2,role_type='admin其实与1比较值也是1,所以还是不小于1,成功绕过。
*/
for($i = 0; $i < 4; $i++) {
if($ips[$i] < 1) {
$ip = '127.0.0.1';
break;
}
}
return $ip;
}


伪造HTTP_CLIENT_IP或者HTTP_X_FORWARDED_FOR,这里我就伪造HTTP_CLIENT_IP来做演示。
伪造HTTP_CLIENT_IP为1.1.1.1',role_id=2,role_type='admin
首先不要伪造HTTP_CLIENT_IP注册一个用户,因为注册的时候也用到了client_ip,因为过滤了注释,而且同时把client_ip赋值给了last_ip跟reg_ip,所以闭合不了,所以不能直接注册为管理员。正常流程注册一个普通账号过后。它提示
向大家做一个自我介绍,给大家一个与我互动的机会!
我的第一次(我的第一次没了。。。)
不用管它,直接伪造HTTP_CLIENT_IP,然后刷新就注入成功了。
!!!注意看我图里面的Modify Headers的状态(左下角红色的那个)。
登陆管理员的时候记得不要伪造HTTP_CLIENT_IP,不然会提示SQL语句错误,因为登陆的时候也用到了ip....当然你也可以直接在登陆页面注入。

漏洞证明:

1.png

2.png

3.png

4.png

5.png

修复方案:

求包养。。。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

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

厂商回复:

非常感谢乌云白帽子 @Chora 的反馈,该问题由于过滤不严导致,我们已经在修复了

最新状态:

暂无