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

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

缺陷编号: WooYun-2015-142913

漏洞标题: espcms最新版V6.4.15.08.25任意用户登录

相关厂商: 易思ESPCMS企业网站管理系统

漏洞作者: Xser

提交时间: 2015-09-25 11:14

公开时间: 2015-12-29 11:17

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: 逻辑错误

20人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-09-25: 细节已通知厂商并且等待厂商处理中
2015-09-30: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-11-24: 细节向核心白帽子及相关领域专家公开
2015-12-04: 细节向普通白帽子公开
2015-12-14: 细节向实习白帽子公开
2015-12-29: 细节向公众公开

简要描述:

绝对是最新版本!

版本信息:V6.4.15.08.25 UTF8 正式版
更新时间:2015-08-25 12:29:04 软件大小:7.67MB

25号更新的

详细说明:

出现在用户登录处

/interface/memebermain.php中



code 区域
function in_center() {
if ($this->CON['mem_isucenter']) {
include_once admin_ROOT . 'public/uc_client/client.php';
}
parent::start_pagetemplate();
parent::member_purview();
$lng = (admin_LNG == 'big5') ? $this->CON['is_lancode'] : admin_LNG;
$db_where = "userid=$this->ec_member_username_id AND username='$this->ec_member_username' ";
$db_table1 = db_prefix . 'member AS a';
$db_table2 = db_prefix . 'member_value AS b';
$db_sql = "SELECT * FROM $db_table1 LEFT JOIN $db_table2 ON a.userid = b.userid WHERE a.userid = $this->ec_member_username_id ";
$rsMember = $this->db->fetch_first($db_sql);
$rsMember['userid'] = $this->ec_member_username_id;

$rsMember['rankname'] = $this->get_member_purview($rsMember['mcid'], 'rankname');
$userid = intval($rsMember['userid']);
if (empty($userid)) {
exit('user err!');
}





espcms验证用户信息的都是采用cookie验证uid的,只要可以伪造就可以任意登录

我们跟踪一下uid的处理方式



code 区域
$db_where = "userid=$this->ec_member_username_id AND username='$this->ec_member_username' ";





这里同时验证了uid和用户名带入数据库查询看是否同一行

我们跟踪下处理uid的函数



在/public/class_connector.php

code 区域
tion member_purview($userrank = false, $url = null, $upurl = false) {
$this->ec_member_username = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);
$user_info = explode('|', $this->fun->eccode($this->fun->accept('ecisp_member_info', 'C'), 'DECODE', db_pscode));
list($ec_member_username_id, $this->ec_member_alias, $ec_member_integral, $ec_member_mcid, $this->ec_member_email, $this->ec_member_lastip, $this->ec_member_ipadd, $this->ec_member_useragent, $this->ec_member_adminclassurl) = $user_info;
$this->ec_member_username_id = intval($ec_member_username_id);
$this->ec_member_integral = intval($ec_member_integral);
$this->ec_member_mcid = intval($ec_member_mcid);





用户名是取了cookie的值可以控制

code 区域
$this->ec_member_username = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);





code 区域
$this->ec_member_username_id = intval($ec_member_username_id);



但uid值被intval

就是这个intval帮我们达到任意登录的效果



首先我们想注册个4开头后面加任意字母,后面不能是数字什么的



然后我们登录

QQ截图20150923092120.png





然后查看cookie找到username的值

code 区域
nRaNsMCyeu1Rjg2Z3Ms6sNbPYrrvtEhR0HduulhHBWo=





然后用这个值覆盖到info的值

这个info的值是验证uid用的

QQ截图20150923092342.png





最后刷新就可以登录uid为4这个用户了

QQ截图20150923092444.png





可以看到登录成功了

------------------------------------

原理是什么呢,intval起了什么效果呢?



我们的用户名是4test,然后变cookie值是加密过的

把这个值放在处理uid的语句上



就是

code 区域
$userid=$this->ec_member_username_id=intval('4test')=4





为什么登录4呢,因为php是弱类型的语言,所以intval就会把4test理解成4

那样就覆盖了原来的uid,然后就可以任意登录用户了

漏洞证明:

出现在用户登录处

/interface/memebermain.php中



code 区域
function in_center() {
if ($this->CON['mem_isucenter']) {
include_once admin_ROOT . 'public/uc_client/client.php';
}
parent::start_pagetemplate();
parent::member_purview();
$lng = (admin_LNG == 'big5') ? $this->CON['is_lancode'] : admin_LNG;
$db_where = "userid=$this->ec_member_username_id AND username='$this->ec_member_username' ";
$db_table1 = db_prefix . 'member AS a';
$db_table2 = db_prefix . 'member_value AS b';
$db_sql = "SELECT * FROM $db_table1 LEFT JOIN $db_table2 ON a.userid = b.userid WHERE a.userid = $this->ec_member_username_id ";
$rsMember = $this->db->fetch_first($db_sql);
$rsMember['userid'] = $this->ec_member_username_id;

$rsMember['rankname'] = $this->get_member_purview($rsMember['mcid'], 'rankname');
$userid = intval($rsMember['userid']);
if (empty($userid)) {
exit('user err!');
}





espcms验证用户信息的都是采用cookie验证uid的,只要可以伪造就可以任意登录

我们跟踪一下uid的处理方式



code 区域
$db_where = "userid=$this->ec_member_username_id AND username='$this->ec_member_username' ";





这里同时验证了uid和用户名带入数据库查询看是否同一行

我们跟踪下处理uid的函数



在/public/class_connector.php

code 区域
tion member_purview($userrank = false, $url = null, $upurl = false) {
$this->ec_member_username = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);
$user_info = explode('|', $this->fun->eccode($this->fun->accept('ecisp_member_info', 'C'), 'DECODE', db_pscode));
list($ec_member_username_id, $this->ec_member_alias, $ec_member_integral, $ec_member_mcid, $this->ec_member_email, $this->ec_member_lastip, $this->ec_member_ipadd, $this->ec_member_useragent, $this->ec_member_adminclassurl) = $user_info;
$this->ec_member_username_id = intval($ec_member_username_id);
$this->ec_member_integral = intval($ec_member_integral);
$this->ec_member_mcid = intval($ec_member_mcid);





用户名是取了cookie的值可以控制

code 区域
$this->ec_member_username = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);





code 区域
$this->ec_member_username_id = intval($ec_member_username_id);



但uid值被intval

就是这个intval帮我们达到任意登录的效果



首先我们想注册个4开头后面加任意字母,后面不能是数字什么的



然后我们登录

QQ截图20150923092120.png





然后查看cookie找到username的值

code 区域
nRaNsMCyeu1Rjg2Z3Ms6sNbPYrrvtEhR0HduulhHBWo=





然后用这个值覆盖到info的值

这个info的值是验证uid用的

QQ截图20150923092342.png





最后刷新就可以登录uid为4这个用户了

QQ截图20150923092444.png





可以看到登录成功了

------------------------------------

原理是什么呢,intval起了什么效果呢?



我们的用户名是4test,然后变cookie值是加密过的

把这个值放在处理uid的语句上



就是

code 区域
$userid=$this->ec_member_username_id=intval('4test')=4





为什么登录4呢,因为php是弱类型的语言,所以intval就会把4test理解成4

那样就覆盖了原来的uid,然后就可以任意登录用户了

修复方案:

改用session

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-12-29 11:17

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-09-25 11:21 | 随风的风 ( 普通白帽子 | Rank:244 漏洞数:91 | 微信公众号:233sec 不定期分享各种漏洞思...)
    0

    沙发

  2. 2015-09-25 11:30 | 我的邻居王婆婆 ( 普通白帽子 | Rank:3006 漏洞数:508 | 刚发现个好洞网站就挂了)
    0

    哎呀

  3. 2015-09-25 11:58 | roker ( 普通白帽子 | Rank:372 漏洞数:109 )
    0

    大兄弟。够了。

  4. 2015-09-25 13:06 | Xser ( 普通白帽子 | Rank:379 漏洞数:86 | JDSec)
    0

    大牛求带我@roker

  5. 2015-09-25 16:11 | CplusHua ( 普通白帽子 | Rank:264 漏洞数:36 | 乌云奖金:-1)
    0

    难道还是Cookie?

  6. 2015-09-25 17:03 | 不能忍 ( 普通白帽子 | Rank:113 漏洞数:51 | 要是能重来,我要选李白!)
    0

    大牛求带我@Xser @roker

  7. 2015-12-29 12:26 | 浅蓝 ( 普通白帽子 | Rank:283 漏洞数:111 | 圈内最帅,没有之一)
    0

    矮油这个吊

  8. 2015-12-29 13:08 | kissrain ( 路人 | Rank:19 漏洞数:2 | 好好学习,天天向上)
    0

    666

  9. 2015-12-29 13:14 | 小白喵咪 ( 路人 | Rank:14 漏洞数:4 | IT小刁刁 未成年白客!)
    0

    大牛求带我@不能忍 @Xser @roker

  10. 2015-12-30 18:39 | 隐形人真忙 ( 普通白帽子 | Rank:163 漏洞数:20 | 关注安全研发与漏洞)
    0

    精彩~~!

  11. 2016-01-04 09:37 | Sai、 ( 路人 | Rank:14 漏洞数:4 | for fun……)
    0

    赞,最后这个intval利用的巧妙啊

登录后才能发表评论,请先 登录